java--集合-Set(一)

java--集合-Set(一)

一、set接口简介

 

  • Set是Collection子接口;
  • Set和Collection基本上一样,一点除外:
  • Set无法记住添加的顺序,不允许包含重复的元素。
  • 当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。
  • Set判断两个对象是否相等用equals,而不是使用==。
  • 也就是说两个对象equals比较返回true,Set集合是不会接受这个两个对象的。
  • 常用子类:

HashSet:散列存放

TreeSet:有序存放

二、HashCode方法对于HashSet的作用

 

  • HashSet类是Set接口最常用的实现类,采用hash算法存储数据,具有良好的存储和查找功能。

散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;

线程不安全的,多个线程访问一个HashSet要使用同步代码;

HashSet集合元素值允许是null,但是最多只能有一个;

 

  • hash(翻译为哈希,或散列)算法的功能:

保证通过一个对象快速找到另一个对象;

其算法价值体现在速度,可以保证查询快速执行;
当从HashSet中访问元素时,HashSet先计算该元素的hashCode(也就是该对象的hashCode方法返回值),然后直接到该HashCode对应的位置取出该元素;

在这里对象的hashCode就好比是数组里的索引,但是不是索引;

三、HashSet元素添加

 

  • 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致:直接添加进去;若一致,再进行equals方法比较,equals方法如果返回true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;
  • 如果我们重写了equals方法,也要重写hashCode方法,反之亦然;。
  • HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。
  • 如果需要某个类的对象保存到HashSet集合中,覆写该类的equals()和hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。

四、HashSet元素添加实例

  HashSet添加元素:
 		Set set = new HashSet();
 		set.add("Lucy");
 			先调用"Lucy".hashCode(),判断set集合里是否已经有了"Lucy".hashCode():
 					1.不存在:	 就直接把Lucy添加到set集合;
 					2.存在:  再比较"Lucy"和与"Lucy"一样Hashcode值的对象,使用对象的equals比较;
 						false: 就添加进set
 						true: 表明是一个对象,add(Object e),就返回false,添加失败

五、TreeSet概述

 

  • 使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序;

 

参与排序的元素必须是同一类型的,不然会发生ClassCastException异常;

参与排序的元素必须是同一类型的报错实例

set.add("春哥");
		set.add("凤姐");
		set.add("S");
		set.add("A");
		set.add("s");
		set.add("a");
		set.add("1");
		set.add(2);  
//添加类型和上面的类型不一致,会报错ClassCastException

 

 

  • TreeSet是SortedSet接口唯一的实现,与HashSet相比额外的方法有:

 

Comparator comparator():返回当前Set使用的Comparator,若返回null,表示以自然顺序排序。

 

Object first() 返回此 set 中当前第一个(最低)元素。 

 

Object last() 返回此 set 中当前最后一个(最高)元素。 

 

SortedSet subSet(Object  fromElement, E toElement) 返回此 set 的部子集,其元素从 fromElement(包括)到 toElement(不包括)。 

 

SortedSet headSet(Object  toElement)返回此 set 的部分子集,其元素严格小于 toElement。 

 

SortedSet tailSet(Object  fromElement) 返回此 set 的部分子集,其元素大于等于 fromElement。 

 

六、TreeSet的排序之自然排序

 

  • TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int compareTo(Object o)方法;

 

该方法用于比较对象,若:obj1,compareTo(obj2),返回0,表示两个对象相等,若返回一个正整数,表示obj1大于obj2,若返回一个负整数,表示obj1小于obj2;

 

 

  • 对于TreeSet集合而言,判断两个对象相等的标准是:

 

 

compareTo()方法比较返回 0;

 

 

七、TreeSet的排序之定制排序

 

  • TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了:

 

 

该接口包含int compare(Object o1,Object o2)方法,用于比较两个对象的大小,比较结果和compareTo方法一致;

 

 

 

  • 要实现定制排序,需要在创建TreeSet集合对象时,提供一个一个Comparator对象,该对象里负责集合元素的排序逻辑;

 

 

 

TreeSet(Comparator comparator) 

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章