A:
String str1 = "java";
String str2 = "java";
System.out.print(str1==str2);
输出:true;
关键点:==比较引用,equals比较内容,JVM的常量池可以节省内存开销。
B:
String str1 = new String("java");
String str2 = new String("java");
System.out.print(str1==str2);
输出:false;
关键点:A中的方式是在常量池中创建“java”对象,但是通过new,JVM会在堆中分配空间。
C:
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
输出:false;
关键点:字符串常量池是编译时创建,String s=str1+str2运行时才能知道;即str1+str2是在堆里创建的,s引用当然不可能指向字符串常量池里的对象。
D:
String s1 = "java";
String s2 = new String("java");
System.out.print(s1.intern()==s2.intern());
输出:true;
关键点:intern方法~参考jdk文档;通过它可以比较字符串的内容
E:
String str1 = "java";
String str2 = new String("java");
System.out.print(str1.equals(str2));
无论在常量池还是堆中的对象,用equals()方法比较的就是内容