i3geek.com
闫庚哲的个人博客

详细阐述集合类

collection01

Collection接口,是集合类的最基本接口。集合类(Collection)顾名思义,代表一组元素(Elements)的集合。继承该接口的主要是List、Set和Queue三个接口,不提供直接继承的类。

由此可知,Set、List或Queue都是集合类,是一组元素的集合,与Map有本质性的区别。Map是键值对的形式,而Collection则是单纯的元素(类似数组)。

所有实现Collection接口的类必须实现两个标准的构造函数,一个是空函数,用于创建一个空的Collection;另一个是带有Collection参数的构造函数,用于复制使用。

遍历

Collection的任何实现类均实现了Iterable<E>接口,因此都支持iterator()方法,该方法将返回一个迭代子,从而可逐一访问Collection的每一个元素。

Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}

List

List是有序的Collection,类似于数组,因此是可以重复元素的。实现listIterator接口,多了一些add之类的方法。

特点:

1)有顺序

2)允许重复

LinkedList

单向链表,(类似链表、队列)可以在任何位置高效的插入和删除元素,实现了Queue接口,可以当做队列使用

特点:

1)元素可以重复

2)有顺序

3)允许有null

4)没有同步方法

ArrayList

利用Object[]实现的List。(类似可变大小的数组)随机读写(自动增长50%)

特点:

1)元素可以重复

2)有顺序

3)允许有null

4)没有同步方法

Vector

线程安全的list,采用synchronized(this)进行加锁,内部采用Object[]实现。非常类似ArrayList(自动增长100%)

特点:

1)元素可以重复

2)有顺序

3)允许有null

4)同步的

注意:在使用时,由于使用同一个iterator,但是vector是同步的。所以在使用Iterator时改变了vector会出现异常

Stack

特点:继承自Vector,对Vector进行简单封装实现了一个基本的栈

Set

Set是一种不包含重复元素的Collection,即任意两个元素进行equals判断结果均是false,Set可以有null,但是最多一个null元素。

特点:

1)没有顺序(TreeSet 用二叉排序树存储 排序),这里指的顺序是输入顺序与存储顺序是否相同

2)不允许重复

HashSet

内部包含了一个HashMap,添加元素X时相当于向HashMap添加一个<X,DummyObject>二元组。

特点:

1)元素不重复

2)无顺序,采用hash散列的方式存储
(插入顺序与存储顺序不一致)

3)非线程同步的

4)可以为null元素

LinkedHashSet

内部包含了一个LinkedHashMap对象,同HashSet原理

特点:

1)元素不重复

2)无顺序

3)非线程同步的

4)可以为null元素

TreeSet

内部包含了一个TreeMap对象。同HashSet原理

特点:

1)元素不重复

2)非线程安全

3)不可以为null元素

Map

Map没有继承Collection接口,Map提供的Key-Value键值对的存储。其中Key是不可以重复的,必须唯一,通过Key查找的Value可以重复或null。

作为key的对象必须实现hashCode和equals方法。因为在判断时候,根据key的hashcode方法判断,若不相等,则认为是不同对象;若相等则判断equals,若相等则是同一对象,不相等则是不同对象。

若对象相等,则必须hashcode和equals都为true。若对象equals为true,则hashcode必须相同,且对象为同一对象,因为在同一内存;若对象hashcode相等,则对象不一定相等,还要判断equals。

哈希冲突:两个不同对象的hashcode相同。具体的解决办法参考如下的具体实现。

内嵌类:Entry<K,V>

映射项Key-Value键值对,获得的唯一办法是通过entrySet方法获取entry集合并进行遍历。

遍历

在对Map的遍历中,Map接口提供3种不同的视图,分别是:当做一组Key的集合(keySet());当做一组Value的集合(values());当做一组key-value的集合(entrySet())。

特点:

1)没有顺序(TreeSet 用二叉排序树存储 排序),这里指的顺序是输入顺序与存储顺序是否相同

2)Key必须唯一,Value可以重复

3)key可以为null

HashMap

数组特点:寻址容易,插入删除难;链表特点:插入删除容易、寻址困难。结合链表和数组的优点,产生哈希链表。

特点:

1)key和value均可为null(只允许一条key为null)

2)非同步的

LinkedHashMap

从HashMap派生,利用HashMap实现,与其相比维护的是一个具有双重链表的HashMap,因此支持插入排序或使用排序。

例如:

Map<String, String> m = new LinkedHashMap<String, String>(20, .80f, accessOrder );
m.put("1", "my"));
m.put("2", "map"));
m.put("3", "test"));
m.get("1");
m.get("2");

若accessOrder为true(访问排序)输出 {3=test, 1=my, 2=map};
若accessOrder为false(插入排序)输出 {1=my, 2=map,3=test}

特点同HashMap

HashTable

哈希表

特点:

1)key非空

2)value可以null

3)同步的

TreeMap

基于红黑树实现的Map

特点:

1)根据key排序

2)key和value均为非null

3)非同步的

WeakHashMap

WeakHashMap是一种改进的HashMap,对key实行弱引用。即若key不再被外部引用,则该key可以被回收,对应的Value也会被回收。

用途:简单的缓存表(非同步的)

总结

collection02

赞(0)
未经允许不得转载:爱上极客 » 详细阐述集合类
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址