wljyy521 发表于 2012-6-3 22:28:31

Java字符串的“==”和“equals”

大家看看下面的字符串的“==”和“equals”的结果:
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
希望大家给出自己的结果:{:5_143:}呵呵

先驱者 发表于 2012-6-3 22:43:53

如果没记错的话为:
s1==s2;                  true
s1.equals(s2);          true

s3==s4;                   false
s3.equals(s4);            true

s1==s3;                  false//这个不确定了
s1.equals(s3);          true

fghhslk 发表于 2012-6-3 22:54:27

true
true
false
true
false
true
{:6_165:}

wljyy521 发表于 2012-6-3 23:33:03

fghhslk 发表于 2012-6-3 22:54 static/image/common/back.gif
true
true
false


第一个为什么是true啊 呵呵

admin 发表于 2012-6-4 02:56:26

wljyy521 发表于 2012-6-3 23:33 static/image/common/back.gif
第一个为什么是true啊 呵呵

为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。

admin 发表于 2012-6-4 03:04:23

admin 发表于 2012-6-4 02:56 static/image/common/back.gif
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。
发帖的时候,选择高级模式,然后里面有个<>符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你看下i效果!

hslx111 发表于 2012-6-4 09:11:54

true
true
false
true
false
true
== 判断的是对象
equals 判断的是内容

wljyy521 发表于 2012-6-4 09:30:27

hslx111 发表于 2012-6-4 09:11 static/image/common/back.gif
true
true
false


第一个为什么是true?

fghhslk 发表于 2012-6-4 12:00:51

admin 发表于 2012-6-4 02:56 static/image/common/back.gif
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。

String常量是引用拷贝吧,两个“hello”是同一个字符串。对吗?{:6_165:}

fghhslk 发表于 2012-6-4 12:25:03

admin 发表于 2012-6-4 03:04 static/image/common/back.gif
发帖的时候,选择高级模式,然后里面有个符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你 ...

这个功能好,贴心实用{:6_205:}

admin 发表于 2012-6-4 12:50:47

fghhslk 发表于 2012-6-4 12:25 static/image/common/back.gif
这个功能好,贴心实用

恩,呵呵,就是发帖的时候,用"<>"按钮来输入代码,除了一般的技术论坛,我们这种校友论坛很少用吧,哈哈哈{:6_208:}

hslx111 发表于 2012-6-4 13:25:31

wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?

因为第一个 他们指向的都是同一个对象 hello

科尔沁猎人 发表于 2012-6-14 13:40:59

java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。

wljyy521 发表于 2012-6-17 20:41:06

科尔沁猎人 发表于 2012-6-14 13:40 static/image/common/back.gif
java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。

你说的对{:6_194:}

cym2319 发表于 2012-6-20 13:51:27

本帖最后由 cym2319 于 2012-6-20 13:59 编辑

wljyy521 发表于 2012-6-3 23:33 static/image/common/back.gif
第一个为什么是true啊 呵呵
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 hello2:astore_13:ldc   #2; //String hello5:astore_26:getstatic       #3; //Fieldjava/lang/System.out:Ljava/io/PrintStream;9:aload_110:aload_211:if_acmpne      1814:iconst_115:goto   1918:iconst_019:invokevirtual#4; //Method java/io/PrintStream.println:(Z)V22:return
而使用new String(“”)则是将创建的对象存储的heap中,且是运行期创建。

wljyy521 发表于 2012-6-21 09:50:06

cym2319 发表于 2012-6-20 13:51 static/image/common/back.gif
Strings1="hello"; 和 String s2="hello";

使用=“hello” 的方式来声明String,在编译的时候,就已经 ...

你说的不错{:6_194:}

431103832lxl 发表于 2012-7-25 15:48:54

true
true

false
true

false
true

431103832lxl 发表于 2012-7-25 15:52:56

wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?

这是因为有个常量池的概念,前两个都被放在一个常量池中了他们的引用都指向这个常量池,也就是他们的地址都是一样的。
==是比较地址,equals()在Sun公司实现的类(如String和Ineger等)中是比较内容的,但是你可以看看Object类的源码equals()方法的方法体是用==实现的,所以不能轻易的说equals就是比较内容的

beswkwangbo 发表于 2012-7-26 23:26:56

wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?

Java中如果两个String字面值相同的话,就会绑定到同一个对象上。如果new了,那就是个新对象啦。记得是这样,如有不对请指正

jack0001 发表于 2012-8-26 21:10:45

版主好样的,给力
页: [1]
查看完整版本: Java字符串的“==”和“equals”