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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hzhzhen 中级黑马   /  2015-5-18 14:44  /  709 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test {
  2.             public static void main(String[] args) {
  3.                         String a="abc";
  4.                         String b=new String("abc");
  5.                         System.out.println(a==b);
  6.                         System.out.println(a.hashCode()==b.hashCode());
  7.             }



  8. }
复制代码



输出:
false
true
a和b不是在内存中有两个字符串,他们的物理地址不一样吧?
第二个输出true的原因是什么?
hashCode 返回值是根据字符串内容么?

2 个回复

倒序浏览
首先来看String类中对应的构造函数。
  1.     public String(String original) {
  2.      this.value = original.value;
  3.      this.hash = original.hash;
  4.     }
复制代码
编译时在常量池中有字符串"abc",它是String类型的,语句String a="abc";将字符串"abc"的地址值赋值给a。


语句        String b=new String("abc");调用的就是上述构造函数,因此,b的成员变量,value和hash与字符串"abc"是相同的,但是因为new操作,在内存中分配了新的空间,具有新的地址值。
另外,
  1.     public int hashCode() {
  2.     int h = hash;
  3.     if (h == 0 && value.length > 0) {
  4.          char val[] = value;
  5.          for (int i = 0; i < value.length; i++) {
  6.                h = 31 * h + val[i];
  7.          }
  8.          hash = h;
  9.     }
  10.     return h;
  11.     }
复制代码



综上,可以得出程序的输出结果了。




回复 使用道具 举报
第一个是 false    因为  String b=new String("abc");   new了一下   在内存在新开辟了位置 所以地址值不同,
第二个是ture   因为 a  b  都是代表 字符串 “abc”   他们在哈希表中的位置是相同的    所以 ture。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马