大家看看下面的字符串的“==”和“equals”的结果: [C++] 纯文本查看 复制代码 String s1="hello"; String s2="hello"; String s3=new String("hello"); String s4=new String("hello"); 看看下面几个结果是true or false‘: s1==s2; true or false s1.equals(s2); true or false s3==s4; true or false s3.equals(s4); true or false s1==s3; true or false s1.equals(s3); true or false 希望大家给出自己的结果:呵呵 |
[技术| 编程·课件·Linux] Java字符串的“==”和“equals”
wljyy521
· 发布于 2012-06-03 22:28
· 3211 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
本帖最后由 cym2319 于 2012-6-20 13:59 编辑 Strings1="hello"; 和 String s2="hello"; 使用=“hello” 的方式来声明String,在编译的时候,就已经将 hello 存储到 String的常量池中(String pool)了.在s2的时候,会去常量池中找是否有hello,因为已经有了(s1创建过了),所以s1和s2会指向常量池中的同一位置.而“==”比较的是两个变量本身的值,即两个对象在内存中的地址,所以返回的是true。 public class StringMainTest { public static void main(String[] args) { String s1="hello"; String s2="hello"; System.out.println(s1==s2); } }使用javap命令反编译class文件: Code: 0: ldc #2; //String hello 2: astore_1 3: ldc #2; //String hello 5: astore_2 6: getstatic #3; //Fieldjava/lang/System.out:Ljava/io/PrintStream; 9: aload_1 10: aload_2 11: if_acmpne 18 14: iconst_1 15: goto 19 18: iconst_0 19: invokevirtual #4; //Method java/io/PrintStream.println:(Z)V 22: return 而使用new String(“”)则是将创建的对象存储的heap中,且是运行期创建。 |
true true false true false true |