1.
String s1="abc";
String s2="abc";
System.out.println(s1==s2);
注释:在执行过程中,如果程序用到某个字符串,例如,“abc”,程序会在方法区字符串常量池中去搜索该字符串,如果没有找到,就会在字符串常量池中创建一个“abc”字符串,如果找到,就直接拿过来用就可以了。
字符串常量池是一个缓冲区,为了提高访问字符串的效率。
2.
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3==s4);//false
注释:使用new关键字则是在堆中开辟空间,所以比较的是内存地址。所以结果是false.
System.out.println(s3.equals(s4));
注释:这个结果是true,因为string已经重写了object类的equals方法,比较的不是内存地址,而是实体内容
3.问以下这三行代码会在底层创建几个字符串对象?
String s5 = "aaa";
String s6 = "bbb";
String s7 = s5 + s6;
注释:会在字符串常量吃池中创建3个字符串对象"aaa","bbb","aaabbb"
但是不建议做字符串的拼接,会在字符串常量池中浪费空间
4.问这两行代码会在底层创建几个对象?
String s1=new String("abc");
String s2=new String("abc");
注释:首先,s1会在方法区的字符串常量池中创建一个“abc”字符串对象,还会在堆中再创建一个“abc”的字符串对象,然后s2在常量池中搜索这个“abc”对象,搜索到了就不在创建了,但是它仍会在堆中创建一个“abc”对象,所以会在底层创建3个对象。(常量池中1个,堆中2个)