Java集合类

来源:互联网 发布:网店数据分析报告 编辑:程序博客网 时间:2024/06/10 08:55

List vs Set

List特点:存入顺序和取出顺序一致,存储的元素可以重复。
Set特点:元素的顺序无序且唯一,即无序性和唯一性。

HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放。
LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代。
TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历快。

ArrayList: 顺序表存储,访问快,插入和删除慢。
ArrayDeque:双向顺序存储,集成栈和队列方法,访问快,插入和删除慢。
LinkedList:双向链式表,集成栈和队列方法,访问慢,插入和删除快。


ArrayList类

ArrayList底层是Object数组,一些基本的方法:

1)增:add及其重载;
2)删:remove(index)移除指定下标的元素,remove(Object)移除指定对象的元素,clear()移除所有;
3)改:set(index,Object);
4)查:contains(); 依据equals方法来判断是否包含该元素
5)输出:for循环+size()+get(index)方法;

注意:

1).set返回的该位置上原先的元素。
2).remove(Object): 移除此列表中首次出现的指定元素(如果存在)。

LinkedList类

  1. LinkedList基于双向链表机制实现。
  2. LinkedList在插入元素时,必须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历列表;在删除元素时,要遍历列表,找到要删除的元素,然后从列表上将此元素删除即可。
  3. LinkedList是非线程安全的。

ArrayList vs LinkedList的用法:

从LinkedList和ArrayList的区别来看,我们可容易的得出什么时候使用ArrayList,什么时候使用LinkedList:

1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
2)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

Vector类

与ArrayList的用法基本一致,这里就不过于多说,只是简单说一下两者的一点区别。
Vector和ArrayList的不同点有:

1)Vector是基于Synchronized实现的线程安全的ArrayList。即Vector是线程安全的。
2)在插入元素时容量扩充的机制和ArrayList稍微有所不同,Vector是扩充2倍,并可通过传入capacityIncrement来控制容量的扩充。而ArrayList是扩充1.5倍并加1。Vector效率高。

Stack类

Stack继承于Vector,在Vector的基础上实现了Stack所要求的后进先出(LIFO),其提供了push,pop,peek等三个主要方法。

HashSet类

HashSet底层是Hash表。

前面在和List中的类做比较时我们已经知道,Set中的类其元素都是无序且唯一的,那么是用什么机制来保证元素的无序性和唯一性呢?答案是:hashCode()和equals()方法来保证。

TreeSet类

TreeSet类底层是二叉树。

TreeSet与HashSet都是实现Set的类,但是TreeSet独特指出是可以完成自动排序,要求存入其中的元素具有可比较性,依据的是compareTo方法。

1)TreeSet基于TreeMap实现,支持排序。
2)TreeSet是非线程安全的。

从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素(需要遍历获取),

另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。

TreeMap类

  1. TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。
  2. TreeMap是非线程安全的。

HashMap类

  1. HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。
  2. HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。
  3. HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。
  4. HashMap是非线程安全的。
  5. HashMap遍历使用的是Iterator。

HashTable类

  1. HashTable是线程安全的。
  2. HashTable中无论是Key,还是Value都不允许为null。
  3. HashTable遍历使用的是Enumeration。

曾经HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable,可以使用ConcurrentHashMap来保证线程安全。

1 0
原创粉丝点击