HashSet的用法

Java代码

1. public class TestHashSet {
2.
3. public static void main(String [] agrs){
4. Set set = new HashSet();
5. //添加一个string数据
6. set.add("文本");
7. //添加一个整数数据
8. set.add(new Integer(5));
9. //添加一个付点数据
10. set.add(12.15);
11. //输出集合大小
12. System.out.println(set.size());
13. //在添加个相同的文本
14. set.add("文本");
15. //输出大小
16. System.out.println(set.size());
17. //添加个null值
18. set.add(null);
19. //输出集合大小
20. System.out.println(set.size());
21. //再添加个null值
22. set.add(null);
23. //输出集合大小
24. System.out.println(set.size());
25. //判断是否存在null值
26. System.out.println(set.contains(null));
27. // 删除null值
28. set.remove(null);
29. //判断是否存在null值
30. System.out.println(set.contains(null));
31. //输出集合大小
32. System.out.println(set.size());
33.
34. Set set1 = new HashSet();
35. UserInfo user = new UserInfo("abc","123");
36. UserInfo user1 = new UserInfo("abc","123");
37. set1.add(user);
38. System.out.println(set1.size());
39. //判断是否存在user1这个对象
40. System.out.println(set1.contains(user1));
41. user.setName("xyz");
42. user.setPassword("aaa");
43. //在更改了user值后user1还存在吗?
44. System.out.println(set1.contains(user1));
45.
46. }
47. }
48.
49. public class UserInfo {
50. private String name;
51. private String password;
52. private int HASHCODE= Integer.MIN_VALUE;
53.
54. public UserInfo(String name,String password){
55. this.name = name;
56. this.password = password;
57. }
58. public String getName() {
59. return name;
60. }
61. public void setName(String name) {
62. this.name = name;
63. }
64. public String getPassword() {
65. return password;
66. }
67. public void setPassword(String password) {
68. this.password = password;
69. }
70.
71. public int hashCode() {
72. if (HASHCODE == Integer.MIN_VALUE) {
73. // 重新生成本类的hashCode
74. HASHCODE = name.hashCode() + password.hashCode();
75. }
76. return HASHCODE;
77. }
78.
79. //判断值是否相等
80. public boolean equals(Object obj) {
81. if(obj == null || !(obj instanceof UserInfo)){
82. return false;
83. }
84. UserInfo user = (UserInfo)obj;
85. return this.name == user.name && this.password == user.password;
86. }
87. }

从上面的简单添加,和输出结果我想大家已经知道了set的一些用法和特性了。

1. HashSet允许null值。

2. HashSet中值不能重复。

3. Hashset在判断是否存在同一个对象的时候首先会判断对象的hashcode是否相等,然后在判断对象的equals()是否相等。当你向HashSet中存入重复元素时,他会按照正常的流程执行存入操作
底层的数据结构采用的是数组+链表的存储结构(明白这一点对于理解HashSet的原理非常重要),
也就是说数组中的每一个元素都是一个链表(对应java中的List的某一具体实现),
这样当有元素要存入HashSet中时,便会首先通过hashCode()方法得到该对象的一个哈希码,并利用该哈希码通过一些转换算法映射成数组的下标索引(当查找时也是如此,因此会非常的快),接下来便会判断该下标处是否为null若为null则会创建一个列表,此时将待插入的对象直接插入,若列表已经存在则利用equals()方法将带插入对象与列表中的元素逐个比较,相等则忽略,不存在相等元素则直接插入。
因此不同对象的hashCode()是可以相同的(最好是均匀的散列开,这样才能充分的提高访问及插入的速度),
根据equals()判定相等的对象所产生的hashCode()必须相等(根据其原理不难理解,否则的话便会有重复元素出现了)
保证一点 hashCode()与equals()必须能够唯一的确定一个对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值