您的位置:首页 > 其它

集合-总结

2017-02-11 16:33 85 查看

 


 

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


Map:
Map:java.util.Map
Map(接口)
|--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,它可以在遍历的时候增加,设置,移除值,同时它可以逆向遍历。(逆向遍历我没明白,必须将它的指针移到最后,你才可以逆向遍历,相当于,你先正向遍历后,将指针移到最后,才能逆向遍历)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: