[技术| 编程·课件·Linux] Java字符串的“==”和“equals”

wljyy521 · 发布于 2012-06-03 22:28 · 3165 次阅读
8
大家看看下面的字符串的“==”和“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

希望大家给出自己的结果:呵呵

共收到 19 条回复
先驱者 · #2 · 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 · #3 · 2012-6-3 22:54:27  回复 支持 反对
true
true
false
true
false
true

点评

第一个为什么是true啊 呵呵  详情 回复 发表于 2012-6-3 23:33
wljyy521 · #4 · 2012-6-3 23:33:03  回复 支持 反对
fghhslk 发表于 2012-6-3 22:54
true
true
false

第一个为什么是true啊 呵呵

点评

为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。  详情 回复 发表于 2012-6-4 02:56
admin · #5 · 2012-6-4 02:56:26  回复 支持 反对
wljyy521 发表于 2012-6-3 23:33
第一个为什么是true啊 呵呵

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

点评

String常量是引用拷贝吧,两个“hello”是同一个字符串。对吗?  详情 回复 发表于 2012-6-4 12:00
发帖的时候,选择高级模式,然后里面有个符号,可以将相关代码高亮还有添加行号! 我帮你编辑下帖子!  详情 回复 发表于 2012-6-4 03:04
admin · #6 · 2012-6-4 03:04:23  回复 支持 反对
admin 发表于 2012-6-4 02:56
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。

发帖的时候,选择高级模式,然后里面有个<>符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你看下i效果!

点评

这个功能好,贴心实用  详情 回复 发表于 2012-6-4 12:25
hslx111 · #7 · 2012-6-4 09:11:54  回复 支持 反对
true
true
false
true
false
true
== 判断的是对象
equals 判断的是内容

点评

第一个为什么是true?  详情 回复 发表于 2012-6-4 09:30
wljyy521 · #8 · 2012-6-4 09:30:27  回复 支持 反对
hslx111 发表于 2012-6-4 09:11
true
true
false

第一个为什么是true?
fghhslk · #9 · 2012-6-4 12:00:51  回复 支持 反对
admin 发表于 2012-6-4 02:56
为爱好发代码的同学添加了专门的编辑代码的工具,请验收使用。

String常量是引用拷贝吧,两个“hello”是同一个字符串。对吗?
fghhslk · #10 · 2012-6-4 12:25:03  回复 支持 反对
admin 发表于 2012-6-4 03:04
发帖的时候,选择高级模式,然后里面有个符号,可以将相关代码高亮还有添加行号!
我帮你编辑下帖子!你 ...

这个功能好,贴心实用

点评

恩,呵呵,就是发帖的时候,用""按钮来输入代码,除了一般的技术论坛,我们这种校友论坛很少用吧,哈哈哈  详情 回复 发表于 2012-6-4 12:50
admin · #11 · 2012-6-4 12:50:47  回复 支持 反对
fghhslk 发表于 2012-6-4 12:25
这个功能好,贴心实用

恩,呵呵,就是发帖的时候,用"<>"按钮来输入代码,除了一般的技术论坛,我们这种校友论坛很少用吧,哈哈哈
hslx111 · #12 · 2012-6-4 13:25:31  回复 支持 反对
wljyy521 发表于 2012-6-4 09:30
第一个为什么是true?

因为第一个 他们指向的都是同一个对象 hello
科尔沁猎人 · #13 · 2012-6-14 13:40:59  回复 支持 反对
java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。

点评

你说的对  详情 回复 发表于 2012-6-17 20:41
wljyy521 · #14 · 2012-6-17 20:41:06  回复 支持 反对
科尔沁猎人 发表于 2012-6-14 13:40
java 会缓存字符串常量。系统先为s1分配空间。然后会将s2指向同一个地方。

你说的对
cym2319 · #15 · 2012-6-20 13:51:27  回复 支持 反对
本帖最后由 cym2319 于 2012-6-20 13:59 编辑
wljyy521 发表于 2012-6-3 23:33
第一个为什么是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 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中,且是运行期创建。


点评

你说的不错  详情 回复 发表于 2012-6-21 09:50
wljyy521 · #16 · 2012-6-21 09:50:06  回复 支持 反对
cym2319 发表于 2012-6-20 13:51
Strings1="hello"; 和 String s2="hello";

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

你说的不错
431103832lxl · #17 · 2012-7-25 15:48:54  回复 支持 反对
true
true

false
true

false
true
431103832lxl · #18 · 2012-7-25 15:52:56  回复 支持 反对
wljyy521 发表于 2012-6-4 09:30
第一个为什么是true?

这是因为有个常量池的概念,前两个都被放在一个常量池中了他们的引用都指向这个常量池,也就是他们的地址都是一样的。
==是比较地址,equals()在Sun公司实现的类(如String和Ineger等)中是比较内容的,但是你可以看看Object类的源码equals()方法的方法体是用==实现的,所以不能轻易的说equals就是比较内容的
beswkwangbo · #19 · 2012-7-26 23:26:56  回复 支持 反对
wljyy521 发表于 2012-6-4 09:30
第一个为什么是true?

Java中如果两个String字面值相同的话,就会绑定到同一个对象上。如果new了,那就是个新对象啦。记得是这样,如有不对请指正
jack0001 · #20 · 2012-8-26 21:10:45  回复 支持 反对
版主好样的,给力
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表