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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© freehiker 中级黑马   /  2013-11-9 20:55  /  1267 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 freehiker 于 2013-11-9 21:17 编辑
  1. public class StringTest2 {
  2.         public static void main(String[] args) {
  3.                 String str1 = "abc";
  4.                 String str2 = new String("abc");
  5.                 System.out.println(str1.hashCode()); //96354
  6.                 System.out.println(str2.hashCode()); //96354
  7.                 System.out.println(str1==str2);//false,不明白的地方
  8.                 System.out.println(str1.equals(str2));//true
  9.                
  10.         }
  11. }
复制代码
str1在内存中有一个对象,str2在内存中有两个对象,这个区别已经知道了。然后经过网上搜索的最后确认,觉得判断两个对象相等的因素就是hashCode和equals,如果真的是这样,那么str1==str2为什么会是false呢?str1和str2的hashCode的值是一样的啊。求解!!!
或许应该把hashCode这个因素换成是内存地址值,这样的话就说的通了。还是求确认!

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
String str1 = "abc";
String str2 = new String("abc");
一个字符串是一个对象,存在于方法去的常量池中,==
而s则指向了堆内存的new String("abc")对象,和a,b当然不是一个引用
比较的实际是他们的地址, 所以 str1==str2 结果是false
而string类的equals方法是重写object类的,比较的是字符串内容
所以 str1.equals(str2)结果是true
回复 使用道具 举报
  1. public class StringTest2 {
  2.         public static void main(String[] args) {
  3.                 String str1 = "abc";
  4.                 String str2 = new String("abc");
  5.                 System.out.println(str1.hashCode()); //96354
  6.                 System.out.println(str2.hashCode()); //96354
  7.                 System.out.println(str1==str2);//false,这里比较的是对象是否相等
  8.                 System.out.println(str1.equals(str2));//true  这个equals方法是Object 类中的,用于判断两个字符串的值是否相等
  9.                
  10.         }
  11. }
复制代码
首先我来分析一下,String str1="abc"这一步时它在内存中开辟了一块空间,然后接着String str2=new String("abc")这一步时,因为是new 出来的东西,所以又在内存中开辟了一块空间,也就是说str1和str2是两个不同的对象,因为str1==str2比较的是两个对象是否相等,而不是他们的字符串的值是否相等,所以运行false,而至于str1.equals(str2)为true,是因为String类复写了Object类中的equals方法,该方法是用于比较判断两个字符串是否相等,也就是判断str1和str2值,所以运行为true,

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
字符串的hashCode()方法返回的是java虚拟机中地址的哈希值,而不是物理内存的真实地址。
所以,两个内容相同的字符串所返回的哈希值是相同的,
但是它们在物理内存中所指向的绝对不是同一个地址!
所以,==的判断返回了false。
回复 使用道具 举报
  1. public class StringTest2 {
  2.         public static void main(String[] args) {
  3.                 String str1 = "abc";
  4.                 String str2 = new String("abc");                    //问题在这里,new的意思是再创建一个对象,

  5. //String类型为引用数据类型,所以引用了内存中的一个新地址.

  6.                 System.out.println(str1.hashCode()); //96354
  7.                 System.out.println(str2.hashCode()); //96354
  8.                 System.out.println(str1==str2);//false,不明白的地方
  9.                 System.out.println(str1.equals(str2));//true
  10.                
  11.         }
  12. }
复制代码
== 运算符,对于基本数据类型,比较的是值,对于引用数据类型,比较的是地址值
String 属于引用数据类型,两个对象的对址也不同,所以 /false
回复 使用道具 举报
Object类中的hashCode方法返回的是内存地址值,而String类重写了hashCode,他返回的是String类定义的hashCode。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马