A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 花谢花开 中级黑马   /  2015-4-1 21:42  /  1364 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文





1、String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));

2、String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4);
System.out.println(s3.equals(s4));

3、String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6);
System.out.println(s5.equals(s6));
这三个题到底应该怎么区分?





点评

加油!我也不是很懂,怕误导,就不说答案了  发表于 2015-4-2 21:07

评分

参与人数 2技术分 +1 黑马币 +16 收起 理由
敲代码换大汽车 + 16 很给力!
lwj123 + 1 赞一个!

查看全部评分

16 个回复

倒序浏览
每天来一次  努力加油
回复 使用道具 举报
楼主看一下我这个总结应该就能明白了~
String类的equals()方法在运用的时候和“==”操作符有些许不同。
示例代码:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1.equals(s2)); //返回true,地址相同(都在对象池),值相同
System.out.println(s1 == s2); //返回true,地址相同,值相同
System.out.println(s1.equals(s3)); //返回true,地址不同,但是值相同
System.out.println(s1 == s2); //返回false,值相同,但是地址不同
总结,String类的equals()方法,比较的是两个String的值,只要值相同,返回true;而”==“运算符比较的是地址和值,只有两者都相同,才返回true。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

回复 使用道具 举报
黑色救护车 发表于 2015-4-1 22:12
楼主看一下我这个总结应该就能明白了~
String类的equals()方法在运用的时候和“==”操作符有些许不同。
示 ...

多谢了,以后请多多指教,相互交流学习!
回复 使用道具 举报
String s1 = new String("hello");这是两对象,"hello"在字符串资源池中,而newString在堆中
回复 使用道具 举报
花谢花开 发表于 2015-4-1 22:55
多谢了,以后请多多指教,相互交流学习!

没有问题~:lol一起进步! 关于上面的问题,还可以百度一下对象池的概念,String是用对象池的,所以才会有上述特点。加油!
回复 使用道具 举报
黑色救护车 发表于 2015-4-2 07:59
没有问题~一起进步! 关于上面的问题,还可以百度一下对象池的概念,String是用对象池的,所以才会 ...

多谢,好的!
回复 使用道具 举报
466273082 发表于 2015-4-1 23:03
String s1 = new String("hello");这是两对象,"hello"在字符串资源池中,而newString在堆中 ...

多谢!感谢了
回复 使用道具 举报
我来说说吧:首先你要明白什么是
(1)常量池,在编译期间能够确定的常量字符串都会被放到常量池中存储;
(2)==:比较的是地址
(3)equals():String比较的是内容,也就是字符序列是否相等
1、String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
第一题:
s1,s2指向的都是“hello”的一个副本
指向的对象存放在不同的堆空间中
所以地址值是不能相等的
equals:因为两者指向对象的字符序列都是一样的,所以返回true

2、String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
第2题:
s3“hello”的一个副本
s4指向的是常量池中存储的"hello",在此之前,常量池是没有"hello"的,所以创建该对象,并放于常量池中
两者存放的位置都不一样,所以==也是返回false
equals:因为两者指向对象的字符序列都是一样的,所以返回true


3、String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6);
System.out.println(s5.equals(s6));
第2题:
s5,s6指向的是常量池中存储的"hello",在此之前,常量池是没有"hello"的,所以创建该对象,并放于常量池中,当s6需要用时,直接引用指向了常量池中的"hello",两者指向的位置一样,所以==也是返回true
equals:因为两者指向对象的字符序列都是一样的,所以返回true
回复 使用道具 举报
lwj123 发表于 2015-4-2 20:46
我来说说吧:首先你要明白什么是
(1)常量池,在编译期间能够确定的常量字符串都会被放到常量池中存储;
(2) ...

收货要给点币 啊,哈哈
回复 使用道具 举报
lwj123 发表于 2015-4-2 20:46
我来说说吧:首先你要明白什么是
(1)常量池,在编译期间能够确定的常量字符串都会被放到常量池中存储;
(2) ...

多谢了,现在我对String s = new String("hello");和String s1 = "hello";以及==和equals的理解就是:
       s在内存中是两个对象,而s1在内存中是一个对象;
       ==比较的是两个字符串对象的地址,而equals比较的是两个字符串的值,不用管对象的地址!
不知道这样对不对?再次表示感谢

点评

也可以!  发表于 2015-4-2 21:03
回复 使用道具 举报
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复 使用道具 举报
字符串比较用.equeals  数值比较用双=
回复 使用道具 举报
对于基本类型来说==是比较直接比较值是否相等,而对于引用类型来说就是比较内存地址。对于引用数据类型来说equals默认也是比较地址的,但是基本数据类型的包装类和String实现了equals方法,比较的是内容是否相等。所以我们写一个类是也要实现equals方法为好。
回复 使用道具 举报
lwj123 发表于 2015-4-2 20:47
收货要给点币 啊,哈哈

呃,不是吧!你都那么多了,还来敲诈我们这些刚来的新同志!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马