Java中的集合
Collection 对象的集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全
│├ ArrayList 接口实现类 数组 随机访问 没有同步 线程不安全
│└ Vector 接口实现类 数组 同步 线程安全
│ └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet
│ └ LinkedHashSet
└ TreeSet
List:一个接口,它继承于Collection的接口。它代表着有序的队列。可以通过下标 (1,2..) 来取得值,值可以重复。
可以在任意位置增加删除元素。 用Iterator实现单向遍历,也可用ListIterator实现双向遍历。
Set: 值是不能重复的,无序,set中最多包含一个null元素 ,只能用Lterator实现单项遍历,Set中没有同步方法。
Queue:遵从先进先出原则。 使用时尽量避免add()和remove()方法,而是使用offer()来添加元素,使用poll()来移除元素,它的优点是可以通过返回值来判断是否成功。 LinkedList实现了Queue接口。Queue通常不允许插入null元素。
ArrayList,LinkedList, Vector, Stack是List的4个实现类:
ArrayList:一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、删除效率低。线程不安全。
LinkedList:一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
随机访问效率低,但随机插入、随机删除效率高。线程不安全。
Vector:矢量队列,和ArrayList一样,它也是一个动态数组。线程安全。(一般不使用,已被ArrayList替代)。
Stack:它继承于Vector。特性:后进先出。线程安全。一般不使用,当需要用栈的时候,用LinkedList。
List使用场景:
1、对于需要快速插入,删除元素,应该使用LinkedList。
2、对于需要快速随机访问元素,应该使用ArrayList。
3、对于“单线程环境” 或者“多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,可以用Vector,(现在一般也不用这个)。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
而 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。
Set:
HashSet:线程不安全,存取速度快。依赖的是元素的hashCode方法和euqals方法保证元素唯一性。
TreeSet:线程不安全,可以对Set集合中的元素进行排序。通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。
Map 接口 键值对的集合
├ Hashtable 接口实现类 同步 线程安全
├ HashMap 接口实现类 没有同步 线程不安全
│├ LinkedHashMap
│└ WeakHashMap
├ TreeMap
└ IdentifyHashMap
Map:是键值对集合,键不能重复,值可以,所以是用键来索引值。Map 同样对每个元素保存一份,但这是基于 " 键 " 的, Map 也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet 或者 LinkedHashMap。对于效率, Map 由于采用了哈希散列,查找元素时明显比 ArrayList 快。
HashTable:是线程安全的,不能存储 null 值 。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 .Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。
HashMap: 它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是无序的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null,不支持线程的同步。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap:实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。是一个有序的key-value集合,它是通过红黑树实现的。可以返回有序的key集合。是非同步的。
Collection与Collections的区别:
Collection 是一个集合接口。继承与他的接口主要有Set 和List. 它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
Collections 是一个包装类。它包含有各种有关集合操作的静态方法。实现了对各种集合的搜索、排序、线程安全等操作,此类不能实例化,就像一个工具类,服务于Java的Collection框架。