2015-08-10~11 集合

Coection

数组、集合有何不同?

数组也可存储对象,但长度固定;集合长度可变。

数组可存储任意数据类型,集合只存储对象(可不同类型)。

 

集合框架的构成及分类

 

 

白色箭头虚线:子接口关系

  istIterator和Iterator是接口继承关系,istIterator是Iterator的子接口。

  ist、Set是Coection的子接口。

黑色箭头虚线:生成关系

  Coection中有个方法能产生一个Iterator对象。

黑色实线框:常用

白色箭头实线

  Array、inked……是ist的子类。

 

Utiities:工具

 

 

 

 

两大接口

Java集合类主要由两个接口派生出来:

Coection

  Set:        不能存放重复对象

  ist:       可存放重复对象,有序

  Queue:  队列

  SortedSet:     可对集合数据排序

Map

  SortedMap:  可对集合数据排序

 

在集合里的存储永远存的是一个引用地址。

 

Coection接口

 

Set接口

    Set是Coection子接口;

    Set无法记住添加的顺序,不允许包含重复的元素。

    Set判断两个对象是否相等用equas,而不是使用==。

  常用子类:

    HashSet:散列存放

    TreeSet:有序存放

hashCode方法对于HashSet的作用

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

  • 散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;
  • 线程不安全的,多个线程访问一个HashSet要使用同步代码;
  • HashSet集合元素值允许是nu,但是最多只能有一个;

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

  • 保证通过一个对象快速找到另一个对象;
    • 其算法价值体现在速度,可以保证查询快速执行;
    • 当从HashSet中访问元素时,HashSet先计算该元素的hashCode(也就是该对象的hashCode方法返回值),然后直接到该HashCode对应的位置取出该元素;
    • 在这里对象的hashCode就好比是数组里的索引,但是不是索引;

HashSet元素添加

    当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致:直接添加进去;若一致,再进行equas方法比较,equas方法如果返回true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;

    如果我们重写了equas方法,也要重写hashCode方法,反之亦然;。

    HashSet集合判断两个元素相等的标准是两个对象通过equas方法比较相等,并且两个对象的hashCode方法返回值也相等。

    如果需要某个类的对象保存到HashSet集合中,覆写该类的equas()和hashCode()方法,应该尽量保证两个对象通过equas比较返回true时,他们的hashCode返回也相等。


 

不同类型字段如何取得hashCode

 

 

TreeSet

使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序;
  •参与排序的元素必须是同一类型的,不然会发生CassCastException异常;
 
TreeSet是SortedSet接口唯一的实现,与HashSet相比额外的方法有:
  •Comparator comparator():返回当前Set使用的Comparator,若返回nu,表示以自然顺序排序。
  •Object first() 返回此 set 中当前第一个(最低)元素。
  •Object ast() 返回此 set 中当前最后一个(最高)元素。
  •SortedSet subSet(Object  fromEement, E toEement) 返回此 set 的部子集,其元素从 fromEement(包括)到 toEement(不包括)。
  •SortedSet headSet(Object  toEement)返回此 set 的部分子集,其元素严格小于 toEement。
  •SortedSet taiSet(Object  fromEement) 返回此 set 的部分子集,其元素大于等于 fromEement。 
 
TreeSet的排序
自然排序
  TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Comparebe接口,并覆写其int compareTo(Object o)方法;
    •该方法用于比较对象,若:obj1,compareTo(obj2),返回0,表示两个对象相等,若返回一个正整数,表示obj1大于obj2,若返回一个负整数,表示obj1小于obj2;
  对于TreeSet集合而言,判断两个对象相等的标准是:
    •compareTo()方法比较返回 0;
 
定制排序
  TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了:
    •该接口包含int compare(Object o1,Object o2)方法,用于比较两个对象的大小,比较结果和compareTo方法一致;
  要实现定制排序,需要在创建TreeSet集合对象时,提供一个一个Comparator对象,该对象里负责集合元素的排序逻辑;
    •TreeSet(Comparator comparator) 
  
posted @ 2015-08-12 09:53  Xdz、  阅读(145)  评论(0)    收藏  举报