java基础:13.5 集合框架 - HashSet
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java基础:13.5 集合框架 - HashSet,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2120字,纯文字阅读大概需要4分钟。
内容图文
文章目录
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基础:13.5 集合框架 - HashSet全部内容,希望文章能够帮你解决java基础:13.5 集合框架 - HashSet所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。