java set(1),java 集合(Set1)

本文深入探讨了哈希表的结构和工作原理,强调了哈希码在存储元素时的作用。通过一个示例解释了HashSet如何利用hashCode()和equals()方法来避免重复元素的添加。当不重写这两个方法时,可能导致Set集合中出现重复元素,违反其特性。此外,还讨论了HashSet的内部实现,包括添加元素时的情况分析。
摘要由CSDN通过智能技术生成

----------------|Collection(为什么要画这个图?学多了之后该忘了)

--------------------------|List

----------------------------------------|ArrayList

----------------------------------------|LinkedList

----------------------------------------|Vector

---------------------------|Set

----------------------------------------|HashSet

----------------------------------------|TreeSet

Set:

特有的方法在前面有接触。所以没有太特别的方法(查看API)

哈希表:有行有列的才能称为表,可以把哈希表想成那种普通的表格,

而哈希码可以简单的理解为地址,每当new 出一个对象调用

其hashCode方法时,会算出该对象所对应的哈希值,然后

对照着哈希值填入哈希表(就是在内存中找到自己的位置),

也就是通过元素的哈希值通过等位移运算,算出该元素在哈希表中

的储存位置。

哈希表的一个特点是“桶式结构”(一个坑里可以填多个萝卜),

这里所说的坑就好比与哈希表的一个个小格,萝卜就好比于你创建的对象。

就是在集合里的元素啦。问题来了,如果这时没有重写hashCode方法,两个一样的对象

就会被填入一个格中,这就与Set集合的特点(有序,不重)相违背,

相当于有重复的元素,所以要重写hashCode方法。

hashSet的实现原理:

向HashSet 添加元素时,HashSet先调用hashCode方法,算出哈希值

找到该元素在哈希表的储存位置。

情况1:算出元素的存储位置同时没有任何元素存储在这,则该元素可以存储在该位置上。

情况2:如果位置上有了元素,这是会调用equals方法,与该位置的元素再比较一次,

如果返回true,该元素就是重复的,不能添加。返回false可以。

import java.util.*;importjava.util.ListIterator;public classex12 {public static voidmain(String[] args) {

HashSet set= newHashSet();

set.add(new Person(100, "Tom"));

set.add(new Person(101, "Jack"));

set.add(new Person(102, "LiLi"));

System.out.println(set);//此时运行输出的不是你想的,要重写toString()

System.out.println();//打印空行,为了好看

set.add(new Person(101, "Tom"));

System.out.println(set);//明明是一样的为什么还可以填进去呢? 去重写hashCode()//还是没用 去重写equals()

}

}classPerson {intid;

String name;public Person(intid, String name){this.name =name;this.id =id;

}

@OverridepublicString toString() {return "{ id = " + this.id + " name = " + this.name + " }";

}

@Overridepublic inthashCode() {

System.out.println("----------hashCode-----------");//方便看出分别调用了词hashCode 和 equals()

return this.id;

}

@Overridepublic booleanequals(Object obj) {

System.out.println("----------equals-----------");

Person p=(Person)obj;return this.id ==p.id;

}

}

----------hashCode-----------

----------hashCode-----------

----------hashCode-----------[{ id= 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name =LiLi }]----------hashCode-----------

----------equals-----------[{ id= 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name =LiLi }]

Process finished with exit code0

原文:http://www.cnblogs.com/lifehrx/p/5797615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值