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是作为Map
的 key
而存在的,
而 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