Set集合实现元素不重复原理
2015-10-04 11:39
351 查看
众所周知,set内容不重复。以hashSet为例,会使用对象的hashCode()与equals()来判断存入的对象是否相同。流程如下:
要存入元素,内存中开设空间,每个空间都会有对应的Hash Code,这些空间成为哈希桶(Hash Bucket)。
对想要存入HashSet回调用对象的hashCode()获取对应的哈希值,并尝试放入对应的哈希桶中,如果哈希桶中没有对象,则直接放入,如果有,会再调用对象的equals()比较。
桶中的对象调用equals()与要传入的对象进行比较,若比较结果为false,则表示两个对象非重复,可以存入,若结果为true,表示两个对象相同,不可存入。
例:
学生类(Student),为了防止收集重复对象,在Student类中复写hashCode()和equals():
如果之后出现重复对象想要被收集时,要存入对象便会和已存在容器内的对象比较,如果相同则不能再存入。
要存入元素,内存中开设空间,每个空间都会有对应的Hash Code,这些空间成为哈希桶(Hash Bucket)。
对想要存入HashSet回调用对象的hashCode()获取对应的哈希值,并尝试放入对应的哈希桶中,如果哈希桶中没有对象,则直接放入,如果有,会再调用对象的equals()比较。
桶中的对象调用equals()与要传入的对象进行比较,若比较结果为false,则表示两个对象非重复,可以存入,若结果为true,表示两个对象相同,不可存入。
例:
学生类(Student),为了防止收集重复对象,在Student类中复写hashCode()和equals():
class Studen{ private String name ;//姓名 private int age;//年龄 public int hashCode(){ return name.hashCode()+age*33; } public boolean equals(Object obj){ if(!(obj instanceof Student)) throw new ClassCastException("类型不匹配"); Student s=(Student) obj; return this.name.equals(s.name) &&this.age==s.age; } }
如果之后出现重复对象想要被收集时,要存入对象便会和已存在容器内的对象比较,如果相同则不能再存入。
相关文章推荐
- set 命令特殊用法
- You must SET PASSWORD before executing this statement的解决方法
- 批处理 Set 命令详解 让你理解set命令第1/2页
- ASP中set与dim的区别(自己的理解)
- 深入C#中get与set的详解
- sql Set IDENTITY_INSERT的用法
- set_include_path在win和linux下的区别
- Equals和==的区别 公共变量和属性的区别小结
- jquery中常用的SET和GET
- 大家注意vector, list, set, map成员函数erase
- 基于SQL中SET与SELECT赋值的区别详解
- mysql之set与enum的介绍
- php set_magic_quotes_runtime() 函数过时解决方法
- MySQL的FIND_IN_SET函数使用方法分享
- .net get set用法小结第1/3页
- mysqli_set_charset和SET NAMES使用抉择及优劣分析
- asp.net get set用法第1/2页
- java String 类的一些理解 关于==、equals、null
- hashCode方法的使用讲解
- Java集合类中文介绍