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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Fightingforever 中级黑马   /  2014-10-30 20:35  /  3366 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内存地址和哈希值是什么关系呀
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s=new String("java01");
  6.                 String s2="java01";
  7.                 System.out.println(s2==s);//false
  8.                 System.out.println(s.hashCode());
  9.                 System.out.println(s2.hashCode());
  10.                 //以上的哈希值却是相同的
  11.                 }
  12.         }
  13. 还有HashSet中规定的没有重复元素,是根据哈希值判断重复的吗
复制代码


评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

倒序浏览
HashSet:

1. HashSet:不能存储相同的元素。不能保证元素的排列顺序,不是线程安全的,集合元素可以使 null。

2.Set 接口的最典型实现,通常使用 Set 集合时都使用这个实现类。

3.按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。

4.当向 HashSet 集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置,这就是不能保证元素排列顺序的原因。

5.如果两个对象的 equals() 方法返回 true,一般的他们的hashCode()值也相等。但我们可以通过重写equals方法让两个不同对象equals方法返回true,同时重写hashcode方法返回不同的值。所以,尽管两个对象” 表面”相同,还是能添加到HashSet集合中的,且他们会插入不同的位置。如下面代码所示:

[java] view plaincopy
import java.util.HashSet;  
import java.util.Set;  
public class testHashSet {  
    public static void main(String[] args) {  
        Student stu1 = new Student("AA", 12);  
        Student stu2 = new Student("AA", 12);  
  
        Set set = new HashSet();  
        System.out.println(stu1.equals(stu2));//true ,表明stu1和stu2为相同的元素  
        set.add(stu1);  
        set.add(stu2);  
        System.out.println(set.size());//2,表明成功添加了"相同"的元素  
  
    }  
}  
  
class Student {  
    private String name;  
    private int age;  
  
    public Student() {  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public Student(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  
    // 重写hashcode方法,让其每执行一次返回的值都加1  
    private static int initHashCode = 1;  
    @Override  
    public int hashCode() {  
  
        return initHashCode++;  
    }  
    // 重写equals,让其只要判定对象内容相等就返回true.  
    @Override  
    public boolean equals(Object obj) {  
        if (this == obj)  
            return true;  
        if (obj == null)  
            return false;  
        if (!(obj instanceof Student))  
            return false;  
        Student other = (Student) obj;  
        if (age != other.age)  
            return false;  
        if (name == null) {  
            if (other.name != null)  
                return false;  
        } else if (!name.equals(other.name))  
            return false;  
        return true;  
    }  


这是我博客上的,我直接截取了一段过来,你可以看看,希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
这是帮助文档String类中hashCode方法实现的原理。可以解答为什么你代码中的两个hash值相同。
hashCode
public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。
(空字符串的哈希值为 0。)


HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会调用equals是否为true。
如果元素的HashCode值不同,不会调用equals。


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
hanxing 发表于 2014-10-30 23:16
HashSet:

1. HashSet:不能存储相同的元素。不能保证元素的排列顺序,不是线程安全的,集合元素可以使 null ...

好的 谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马