1 String s1="abc"; 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 true 7 true 8 */
本题主要考察对于java常量池的理解。java中的常量池技术,是为了方便快捷地建立某些对象而出现的,当须要一个对象时,就能够从池中取一个出来(若是池中没有则建立一个),则在须要重复建立相等变量时节省了不少时间。常量池其实也就是一个内存空间,常量池存在于方法区中。根据代码顺序,先在常量池中建立”abc“,并指向s1,然后在建立s2时,因为常量池中已经存在”abc“,只需指向s2就能够,而不须要再建立。”==”在这里比较的是对象引用,故结果为”true”,String 中的equals方法通过重写后操做为“比较此字符串与指定的对象。当且仅当该参数不为 null,而且是表示与此对象相同的字符序列的 String 对象时,结果才为 true”。很明显,s1和s2的字符序列相同,故而结果为true。
(2)“ String s1=new String(“abc”)”语句建立了几个对象?
该语句首先String s1是声明,new String(“abc”)先在常量池中查找,若没有则建立“abc”,然后经过new在堆内存中建立对象,把“abc”拷贝赋值。String 定义为初始化一个新建立的 String 对象,表示一个与该参数相同的字符序列;换句话说,新建立的字符串是该参数字符串的一个副本。故建立常量池和堆内存中两个对象,两个对象的地址值不同。
(3)java
1 String s1=new String("abc"); 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 false 7 true 8 */
由(2)分析可知s1在堆内存中,s2在常量池中,故结果为false,true
(4)app
1 String s1="a"+"b"+"c"; 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 true 7 true 8 */
本题主要考察java中常量优化机制,编译时s1已经成为“abc”在常量池中查找建立,s2不须要再建立。
(5)优化
1 String s1="ab"; 2 String s2="abc"; 3 String s3=s1+"c"; 4 System.out.println(s3==s2); 5 System.out.println(s3.equals(s2)); 6 /*output: 7 false 8 true 9 */
Java 语言提供对字符串串联符号(”+”)和其余对象到字符串的转换的特殊支持。字符串串联是经过 StringBuilder(或 StringBuffer)类及其 append 方法实现的,字符串转换是经过 toString 方法实现的。在本题中,先在常量池中建立”ab“,地址指向s1,再建立”abc”,指向s2。对于s3,先建立StringBuilder(或 StringBuffer)对象,经过append链接获得“abc”,再调用toString()转换获得的地址指向s3。故(s3==s2)为false.ui