String类
String类有两种赋值方式:一种是直接赋值,语法如下
public class Father {
public static void main(String[] args) {
String st = "Java";
System.out.println(st);
}
直接赋值会出现常量池数据共享的情况,String st = "java";执行这段程序时,jvm会在常量池中开辟出一段空间来存储java这个字符串对象并在栈中存储变量st并让他指向该对象,若再执行String str = "java";这段代码时,jvm会先在常量池中搜索是否有”java“字符串对象,如果有则让str也指向java,也就是说st和str的地址是一样的,这就是常量池数据共享,若没有java这段字符串,则在常量池中另开劈一段空间来存储。
另一种是构造方法将其实例化:
public class Father {
public static void main(String[] args) {
String st = new String("sada");
System.out.println(st);
}
}
String st = new String("sada");在执行这段代码时,其实分为两步,第一步时在常量池中找到或创建出“sada”对象,第二步是使用new关键字在堆内存中创建出一个对象并让st指向该堆内存的地址,该new出的堆内存就是在常量池中找到或创建出的“sada”对象,也就是说执行这段代码时创建了两个对象,一个在常量池中,一个在堆内存中。
String常用方法
length() 该方法返回字符串的长度。
public class Test extends Son {
public static void main(String[] args) {
String str = "abc";
int a = str.length();
System.out.println(a);
}
}
startsWith(String value) 判断字符串是否以value字符串开头,如果是返回true,否则返回false。
public class Test extends Son {
public static void main(String[] args) {
String str = "javadoc";
String str1 = "ja";
System.out.println(str.startsWith(str1));
}
}
endsWith(String value) 判断字符串是否以value字符串结尾,如果是返回true,否则返回false。
public class Test extends Son {
public static void main(String[] args) {
String str = "javadoc";
String str1 = "oc";
System.out.println(str.endsWith(str1));
}
}
equals(String targetString) 用于判断两个字符串是否相同,完全相同返回true,否则返回false。
public class Test extends Son {
public static void main(String[] args) {
String str1 = "java";
String str2 = "Java";
String str3 = "javaa";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
}
}
String 类equals方法和==区别:
String类中的equals方法用于判断两个字符串是否相同:
public class Test extends Son {
public static void main(String[] args) {
String str1 = "java";
String str2 = "Java";
String str3 = "javaa";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
}
}
如果所比较的两个变量是引用类型,则==用于比对两个变量指向的是否为同一个存放数据的地址;如果是基本数据类型的两个变量进行比较,则比较的是值是否相等。
equalsIgnoreCase (String value) 用于判断两个字符串忽略大小写后是否相同,相同返回true,否则返回false:
public class Test extends Son {
public static void main(String[] args) {
String str1 = "java";
String str2 = "Java";
String str3 = "javaa";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
}
}
toCharArray() 将字符串转换为char类型的数组:
public class Test extends Son {
public static void main(String[] args) {
String str1 = "ABCDEFG";
char [] arr = str1.toCharArray();
for (char c : arr) {
System.out.println(c);
}
}
}
还有一些。。。
程序分析:
public class Test {
public static void main(String[] args) {
String name = "Tim";
test(name);
System.out.println(name);// String是引用类型,但为什么不是Lucy
}
public static void test(String str) {
str = "Lucy";
}
}
由于str是引用类型变量,传参时是将str的首地址传给str,但在执行str = "Lucy";这段代码时,会重新创建一个对象,对重新进创建的对象赋值,自然是对main方法的name无影响。
另外:String,Integer, Double等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待。可以认为是传值。
Java API文档
JAVA API文档提供了很多官方的介绍和类、方法、变量的解释。一般很系统,涉及所有的方面,如果开发人员对正在使用的类不熟悉,想查看类里面的变量或者方法,就可以打开JavaAPI文档进行阅读和查看。
StringBuffer类
先读一下下面类:
public class Test {
public static void main(String[] args) {
String a = "nan";
a = a + "sda";
System.out.println(a);
}
}
可以看粗来,这样向a中添加字符串会新创建一个对象,占用内存,按此方法添加的话,内存往往会占用很多,但StringBuffer类会在添加字符串时不新创建对象。
StringBuffer类可以存放字符串,和String类不同的是,StringBuffer字符串代表的是可变的字符序列,可以对字符串对象内容进行修改。
程序判读:
public class Foo {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);//AB,B
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}
此程序的结果是:AB,B 因为在传入a和b时,和String一样传入的是对象的首地址,x.append(y); 在执行这段代码时,通过append方法给x也就是a添加上b的值,在执行y=x;这段代码时,y = x就是先创建一个新的对象y,再对新对象y附上x的值,并不是对main方法中的y操作。