Study notes sharing Set collection implementation class: HashSet

Set collection implementation class: HashSet

**Set是无序的,用于存储不重复的对象集合。在Set集合中存储的对象中,不存在equals比较为true的情况。**
	1)HashSet和TreeSet是Set集合的两个常见的实现类,分别用hash表和排序二叉树的方式实现了Set集合。HashSet是使用散列算法实现Set的。
	
	2)Set集合没有get(int index)方法,我们不能像使用List那样,根据下标获取元素。像获取元素需要使用Iterator
	
	3)向集合添加元素也使用add方法,但是add方法不是向集合末尾追加元素,因为Set是无序的。
	
	4)宏观上讲:元素的顺序和存放顺序是不同的,但是在内容不变的前提下,存放顺序是相同的,但是我们在使用的时候,要当做无序的使用。
	
	5)hashCode对Hashset的影响:若我们不重写hashCode,那么使用的就是Object提供的,而该方法是返回地址!换句话说,就是不同对象,hashCode不同。
	
	6)对于重写了equals方法的对象,强烈要求重写继承自Object类的hashCode方法,因为重写hashCode方法与否会对集合操作有影响!
	
	7)重写hashCode方法需要注意的两点:
		①与equals方法的一致性,即equals比较返回为true的对象其hashCode方法返回值应该都相同。
		②hashCode返回的数据应该符合hash算法要求,,如果有很多对象的hashCode方法都相同,则会大大降低hash表的效率。
		一般情况下,可以使用IDE(如Eclipse)方法提供的工具自动生成hashCode方法。
		
	8)boolean contains(Object o)方法:查看对象是否在set中被包含。
	
	9)HashCode方法和equals方法都重写时对hashSet的影响:
	将两个对象同时放入HashSet集合,发现存在,不在放入(不重复集)。
	当我们重写了Point的equals方法和hashCode方法后,我们发现虽然p1和p2是两个对象,但是我们将他们同时放入集合时,p2对象并没有添加进集合。
	因为p1放入后,p2放入时根据p2的hashCode计算的位置相同,且p2与该集合的p1的equals比较为true,hashSet认为该对象已存在,所以拒绝将p2存入集合。
	
	10)不重写hashCode方法,但是重写了equals方法对hashSet的影响:
		两个对象都可以放入HashSet集合中,因为两个对象具有不同的hashCode值,那么当他们放入集合时,通过hashCode值进行的散列算法结果不同。
		那么他们会被放入集合的不同位置,位置不相同,HashSet则认为他们不同,所以他们可以全部被放入集合。
	
	11)重写了hashCode方法,但是不重写equals方法对hashSet影响:
	在hashCode相同的情况下,存放元素时,他们会在相同的位置,hashSet会在相同位置上将放入的元素对象与该位置其他对象进行一次equals比较,
	若不同,则将其存入在同一个位置存入若干元素,这些元素会放入一个链表中。
	由此可以看出,我们应该尽量使用多种类不同对象的hashcode值不同,这样才可以提高HashSet在检查元素时的效率,否则可能检索效率还不如List.
	
	12)结论:不同对象存放时,不会保存hashCode相同并且equals相同的对象,缺一不可以。否则HashSet不认为他们时重复对象。

Guess you like

Origin blog.csdn.net/weixin_44852546/article/details/88966614