编程语言
首页 > 编程语言> > java基础:13.5 集合框架 - HashSet

java基础:13.5 集合框架 - HashSet

作者:互联网

文章目录

1、集合Set 与 散列码

集合中没有重复的对象,当添加一个新对象到集合时(put),JVM如何判断是否有重复??
此处需要了解HashCode的概念和作用了~~~

散列码是由对象导出的一个整数值。在Object中有一个hashCode方法来得到散列码。基本上,每一个对象都有一个默认的散列码,其值就是对象的内存地址。但也有一些对象的散列码不同,比如String对象,它的散列码是对内容的计算结果:
//String对象的散列码计算
String str=“hello”;
int hash=0;
for(int i=0;i<length();i++)
hash=31*hash+charAt(i);

 

2、HashSet 概念

HashSet是作为Mapkey 而存在的,
value 是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个。

该类实现了Set接口不允许出现重复元素,不保证集合中元素的顺序(没有按照元素的插入顺序排列),允许包含值为null的元素,但最多只能一个。

HashSet<String> names = new HashSet<String>();
name.add("xx");
当遍历打印name时,会发现打印出来的顺序和我们添加的不一样!!
 

3、HashSet 作用

为了提高查找效率!!!

4、HashSet 遍历

Set 不提供get()来获取指定位置的元素

所以遍历需要用到迭代器,或者增强型for循环

        //遍历Set可以采用迭代器iterator
        for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) {
            Integer i = (Integer) iterator.next();
            System.out.println(i);
        }
         
        //或者采用增强型for循环
        for (Integer i : numbers) {
            System.out.println(i);
        }

5、hashCode方法必须与equals方法必须兼容

如果我们自己定义了一个类,想对这个类的大量对象组织成散列表结构便于查找。有一点一定要注意:就是hashCode方法必须与equals方法向兼容。

//hashCode与equals方法的兼容
public class Employee{
public int id;
public String name="";
//相同id对象具有相同散列码
public int hashCode(){
return id;
}
//equals必须比较id
public boolean equals(Employee x){
if(this.id==x.id) return true;
else return false;
}
}

为什么要这样,因为HashSet不允许相同元素(equals==ture)同时存在在结构中。假如employeeX(1111,“张三”)和employee(1111,“李四”),而Employee.equals比较的是name。这样的话,employeeX和employeeY的equals不相等。它们会根据相同的散列码1111加入到同一个散列单元所指向的列表中。这种情况多了,链表的数据将很庞大,散列冲突将非常严重,查找效率会大幅度的降低。

标签:java,HashSet,对象,equals,hashCode,散列码,13.5,id
来源: https://blog.csdn.net/L20902/article/details/88855527