1,String的数据类型
String是引用数据类型
8大基本数据类型分别是int,short long,byte,char,boolean,float,double,
String是最终类(默认final修饰),不能被继承,修改
2,String的对象创建
String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
答案:没有,s指向新的对象"Hello world",对字符串的每一次修改都会产生一个新的对象,所以使用StringBuffer或StringBuilder来减少对象的创建,提高程序运行效率
String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?
答案:创建了1个或2个对象
xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");
最终打印的结果应该为true。
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
3,String,StringBuffer,StringBuilder的区别
共同点:java提供的用于操作和存储字符串的类
不同点:
String是最终类,不可变,而StringBuffer和StringBuilder是可变的
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。而StringBuilder是线程不安全的
如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。