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。