A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题一
[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.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马