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:}呵呵
如果没记错的话为:
s1==s2; true
s1.equals(s2); true
s3==s4; false
s3.equals(s4); true
s1==s3; false//这个不确定了
s1.equals(s3); true true
true
false
true
false
true
{:6_165:} fghhslk 发表于 2012-6-3 22:54 static/image/common/back.gif
true
true
false
第一个为什么是true啊 呵呵 wljyy521 发表于 2012-6-3 23:33 static/image/common/back.gif
第一个为什么是true啊 呵呵
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。 admin 发表于 2012-6-4 02:56 static/image/common/back.gif
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。
发帖的时候,选择高级模式,然后里面有个<>符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你看下i效果! true
true
false
true
false
true
== 判断的是对象
equals 判断的是内容 hslx111 发表于 2012-6-4 09:11 static/image/common/back.gif
true
true
false
第一个为什么是true? admin 发表于 2012-6-4 02:56 static/image/common/back.gif
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。
String常量是引用拷贝吧,两个“hello”是同一个字符串。对吗?{:6_165:} admin 发表于 2012-6-4 03:04 static/image/common/back.gif
发帖的时候,选择高级模式,然后里面有个符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你 ...
这个功能好,贴心实用{:6_205:} fghhslk 发表于 2012-6-4 12:25 static/image/common/back.gif
这个功能好,贴心实用
恩,呵呵,就是发帖的时候,用"<>"按钮来输入代码,除了一般的技术论坛,我们这种校友论坛很少用吧,哈哈哈{:6_208:} wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?
因为第一个 他们指向的都是同一个对象 hello
java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。 科尔沁猎人 发表于 2012-6-14 13:40 static/image/common/back.gif
java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。
你说的对{:6_194:} 本帖最后由 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中,且是运行期创建。
cym2319 发表于 2012-6-20 13:51 static/image/common/back.gif
Strings1="hello"; 和 String s2="hello";
使用=“hello” 的方式来声明String,在编译的时候,就已经 ...
你说的不错{:6_194:} true
true
false
true
false
true wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?
这是因为有个常量池的概念,前两个都被放在一个常量池中了他们的引用都指向这个常量池,也就是他们的地址都是一样的。
==是比较地址,equals()在Sun公司实现的类(如String和Ineger等)中是比较内容的,但是你可以看看Object类的源码equals()方法的方法体是用==实现的,所以不能轻易的说equals就是比较内容的 wljyy521 发表于 2012-6-4 09:30 static/image/common/back.gif
第一个为什么是true?
Java中如果两个String字面值相同的话,就会绑定到同一个对象上。如果new了,那就是个新对象啦。记得是这样,如有不对请指正 版主好样的,给力
页:
[1]