集合-总结

来源:互联网 发布:网站整站优化方案 编辑:程序博客网 时间:2024/06/08 21:02

这里写图片描述 
这里写图片描述 
Collection:

Collection(接口): java.util.Collection|-- List(子接口) :    |--ArrayList    |--LinkedList    |--Vector|-- Set(子接口)  :    |--AbstracSet(子接口)        |--HashSet            |--LinkedHashSet    |--SortedSet(子接口)        |--TreeSet|-- Queue(子接口) :    

Map:

Map:java.util.MapMap(接口)    |--HashMap        |--linkedHashMap    |--Hashtable        |--Properties    |--TreeMap


1.Collection:

因为Collection是所有集合类的父接口,所以它中的方法子接口和具体实现类都会继承或实现,那么先来学习Collection: 
常用到的方法:

add(),addAll(),remove(),clear()--> 这两组方法对比着学习记忆。contains(),isEmpty()size(), toArray(),iterator()具体的作用自己去测试下吧。

接下来学习: 
1 List子接口,要明白它的特点是:元素有序且可以重复,怎么保证它是有序的呢?通过索引来保证的。 
所以 List集合里添加了根据索引来操作集合元素的方法:

get(),set()indexOf(),lastIndexOf()subList()listIterator()

再看看这个结构,我们要学的就是这些内容:

|-- List(子接口) :    |--ArrayList    |--LinkedList    |--Vector

1.1 ArrayList: 
      是List接口的典型实现类,可以把它看成是一个可变长度的数组 ,相比于List,也没有增加新的方法,只是实现了List中的方法

      注意:Arrays.asList() 返回的不是ArrayList,而是一个固定长度的List

1.2 LinkedList: 
      新增加了链表来维护元素的位置(适用于频繁的插入和删除操作) ,既然新增了链表结构,那么它肯定新增了方法:

addFirst(),addLast()getFirst(),getLast()removeFirst(),removeLast()

1.3 Vector: 
      是一个古老的类,它是线程安全的,但是效率低于ArrayList,所以现在很少使用。  
      操作的是element

2 Set 子接口

|-- Set(子接口)  :    |--AbstracSet(子接口)        |--HashSet            |--LinkedHashSet    |--SortedSet(子接口)        |--TreeSet

和List的特点恰恰相反,Set中的元素不能是重复的,但是可以是无序的。 
Set中并没有提供额外的方法

问题:怎么来保证两个元素是不能重复的? 
      solution:首先要通过hashCode()方法来比较两个元素的哈希值是否相同,如果相同,再通过equals()来判断他们的内容是否相等,若相等,则重复。

       当然只有具体的实现类才有承接对象的能力,而Set的这个特点对于它的实现类都是适用的。

2.1 HashSet: 
       是Set接口的典型实现类,通过Hash算法来存取数据,具有很好的查找和存取性能。

2.2 LinkedHashSet: 
      HashSet的子类,同时增加了链表结构来维护元素的次序,使元素看起来和插入时的顺序一致。 
       因为增加了链表结构,所以插入的时候效率降低了,而迭代的时候效率提高了

2.3 TreeSet: 
      是Sorted的子接口,能实现自定义排序 
      新增的方法:

comparator(),first(),last(),lower(),higer(),subSet(),headSet(),tailSet()

说实话,这么多方法,我只用到了comparator()!!! 
自然排序: 
TreeSet添加的对象,必须实现Comparable接口,同时实现compareTo()方法

定制排序: 
在TreeSet的构造器中指定排序方式 
①可以通过Comparator的实现类,这个实现类得实现compare()方法 
②可以通过匿名内部类来直接获取Comparator接口的实例 
③可以在构造器中传入匿名对象。

3 Queue 
是一个古老的接口,是线程安全的,效率低,现在很少使用

到这里Collection集合就先告一段落。 
接下来该遍历了:

4 集合元素的遍历: 
①因为List中有索引,我们可以通过最基本的for循环来完成,只适用于List集合 
②增强for循环,适用于所有集合元素 
③迭代器:Iterator

注意:①迭代器本身没有承接对象的能力,必须通过集合来获取     ②在使用iterator.next()之前,必须使用iterator.hasNext()进行判断,否则会报NoSuchElementException异常     ③Enumeration是Iterator的古老版本


2.Map

Map(接口)    |--HashMap        |--LinkedHashMap    |--Hashtable        |--Properties    |--TreeMap

1 Map 
首先来说,Map是和Collection同一级的接口,并列存在,并不是Collection的子接口。Map用来保存具有映射关系的数据:键值对(key->value) 
key中不允许有重复的值,可以看成是一个Set集合,判断是否重复和Set相同;而值得话可以重复

注意理解映射:我昨天的博客“JDBC的进化2“中所说的ORM就是一种映射关系。还记得么?回顾一下:ORM:对象关系映射,没一张表对应这一个类,每一列对应一个属性,每一行对应一个对象。

方法:

添加、删除操作:Object put(Object key,Object value)Object remove(Object key)void putAll(Map t)void clear()元视图操作的方法:Set keySet()Collection values()Set entrySet()元素查询的操作:Object get(Object key)boolean containsKey(Object key)boolean containsValue(Object value)int size()boolean isEmpty()boolean equals(Object obj)

1.1 HashMap 
①允许null键,null值,但是不能保证映射的顺序 
②判断key值是否重复,和HashSet相同

1.1.1 LinkedHashMap 
类似于HashSet和LinkedHashSet的关系

1.2 TreeMap 
我是这样理解的,类比于TreeSet,是TreeSet的键值对形式,可以实现自然排序和定制排序

1.3 Hashtable 
又是一个古老的类,线程安全,现在很少使用,不允许插入null键值,其余和HashMap类似,我们主要用到它的子类Properties

1.3.1 Properties 
是Hashtable的子类,它中的key和value都是String类型的,我们经常用它来读取配置文件信息

3 工具类(Collections) 
可以操作List,Set,Map的一个工具类 
它中的方法全为静态方法:(学了这么多了,一提工具类,我们就知道它都是静态的方法,扩展一下,以后我们自己也可以创建工具类,来操纵我们具体的实体类,你说是不是这样的呢?) 
方法:

排序操作:reverse()shuffle()sort()sort(List, Comparator)指定排序方式swap()查找和替换:max(),min()frequency() 次数copy()replaceAll() 新值替换旧值

到此为止,是不是以为就总结完了?No,其实还没有开始总结,上面的仅仅是回顾。我们来总结。

这样分析的,从整体再到具体(思维),先纵向再横向: 
1.Collection 和Map,有什么联系和区别? 
联系:Collection和Map都是Java.util下的集合接口,Collection和Map属于同一层次。 
区别:Collection中存放的是一个值(只能可以是任意的对象),而Map中存放的是键值对(当然键和值,也只能可以是任意对象) 
*再往下走,忘画一个Queue了。 
2.List和Set和Queue有什么区别和联系 
联系:都是Collection的子接口。 
区别:List中的元素是有序的,可以重复的,而Set中的元素是无序的,不可以重复的;Queue是一个古老的类,是线程安全的,现在很少使用。 
*Map和他俩不是一个层次的,无法进行比较 
3.ArrayList,LinkedList和Vector的区别和联系 
联系:都是List的实现类 
区别:LinkedList相比于ArrayList增加了链表结构来维护元素的顺序,适用于频繁的插入和删除操作,而迭代速度没有ArrayList快。Vector是一个古老的实现类,是线程安全的,它中的方法和ArrayList类似,但是效率低于ArrayList

*再来比较Set中各个元素 
4.HashSet,LinkedHashSet,和TreeSet有什么区别和联系? 
联系:HashSet和TreeSet是Set接口的实现类,LinkedHashSet是HashSet的子类。 
区别:HashSet中的对象需要重写hashCode()和equals()方法,来确定他们是否重复,TreeSet中添加的对象需实现Comparable接口,或是在TreeSet构造器中指定Comparator接口的实例。相比于HashSet可以插入任意的无序且不重复的元素来说,TreeSet有自己的排序方式(自然排序和定制排序)。LinkedHashSet相比于HashSet,增加了链表结构,插入和删除数据性能要低于HashSet,但是迭代性能要高于HashSet。

*到比较Map了 
5.HashMap和TreeMap,以及Hashtable的区别和联系? 
联系:都是Map接口的实现类 
区别:HashMap中的键都是Set集合,但是可以将HashMap中的键认为成是HashSet,而TreeMap中的键是TreeSet,TreeMap可以按TreeSet中的排序方式来排序。相比于HashMap,Hashtable是一个古老的实现类,它是线程安全的,它不允许插入null键和null值,而HashMap则允许。

最后就是整体的横向对比: 
各个实现类的适用场景以及效率对比: 
首先进行分类:将List,Set和Map分开,因为存放的内容不相同。 
1.List内部比较: 
ArrayList: 有索引,遍历相对来说较快,效率高;插入和删除时,需要挪动很多数据,所以较慢,效率低。 
LinkedList:有索引,有链表,遍历快,插入和删除效率高,但是增加链表后,需要维护链表也需要一定的资源。 
2.Set内部比较 
HashSet:无序,插入快,删除快,遍历,非常慢。 
TreeSet:插入和删除,和遍历效率不确定,因为不知道排序的算法有多么复杂,但是我认为,总体来说它的效率不会高。 
LinkedHashSet:插入和删除效率要低于HashSet,因为增加了链表结构,但是迭代速度增加了不少。算是一种平衡吧。用来平衡效率 
3.List和Set做比较 
List:有索引,相对来说遍历较快,而插入,删除较慢 
Set:无索引,插入和删除非常快,遍历非常慢。

这几个效率的比较是我自己根据他们的理解来判断的,没有学过数据结构和算法,等我学完后,就能明确的给出一个效率了,得考虑它们的数据结构和算法复杂度。有兴趣的朋友可以和我一起研究。 
4.总结各适用于什么场景: 

5.Map就不做说明了。对比上面的Set,相信你自己也能明白了。 
HashMap 
TreeMap 
LinkedHashMap:

差点忘了,还有一个要补充的: 
ListIterator 和Iterator的区别 
ListIterator是Iterator的子接口,只适用于List,它可以在遍历的时候增加,设置,移除值,同时它可以逆向遍历。(逆向遍历我没明白,必须将它的指针移到最后,你才可以逆向遍历,相当于,你先正向遍历后,将指针移到最后,才能逆向遍历)



0 0
原创粉丝点击