题一
[Java] 纯文本查看 复制代码 String s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s1==s2);
String s3 = “你好吗”;
String s4 =”你”;
String s5 =”好吗”;
System.out.println(s3==(s4+s5))
题二
[AppleScript] 纯文本查看 复制代码 String s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s1==s2);
String s3 = “你好吗”;
String s4 =”你”+ ”好吗”;
System.out.println(s3==s4))
前半部分自然不用说,因为String s1 = "abc"在常量池只会存在一个对象,而new String("abc")会存在两个对象,而且变量指向的是堆上的对象,所以地址不同;
后半部分常量与变量会有区别,字符串变量相加,在常量池中会开辟新的空间,我认为,因为是变量,java无法确定相加后的结果是什么,在内存中是否已经存在,所以先准备好了空间,在由地址找到数据,将结果相加后存到开辟的空间中;如果是常量相加的话,由于java的常量优化机制,能够直接判断两个常量相加的值,在判断该值是否已经存在,存在就不用建立新的对象了,所以题二结果为true,题一为false.
|