0.首先让我们大概看看集合的选择
Java——集合浅析.
Java—— HashMap和HashTable.
Java——ArrayList基本使用.
Connection接口:单列集合的根接口,它表示一组对象,这些对象也称为Collection的元素
Map接口:双列集合的根接口,Map集合可以存储一对对象,即会一次性保存两个对象,存在key = value 结构,其最大的特点还是可以通过key 找到对应的value 值。
Connection接口: List: 有序,可重复
-
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高 -
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低 -
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Connection接口: Set : 无序,唯一
-
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
依赖两个方法:hashCode()和equals() -
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一 -
TreeSet
底层数据结构是红黑树。(唯一,有序)
1 如何保证元素排序的呢?
自然排序
比较器排序
2 如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Map接口: HashMap、TreeMap、HashTable
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
- Hashtable是线程安全的,HashMap不是线程安全的。
- HashMap效率较高,Hashtable效率较低。
- Hashtable不允许null值,HashMap允许null值(key和value都允许)
集合的选择
1.单列还是双列?
- 单列:Collection类型的
- 双列;Map类型
2.选择单列后看元素是否唯一
-
是:选择Set集合
看元素是否排序 ?
- 是:TreeSet
- 否:HashSet
-
否: 选择List集合
安全线高低 ?
-
高:Vector
-
低:arrayList 或LinkedList
- 增删多:LinkedList
- 查询多:ArrayList
-
1. Vector 类
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
- Vector 是同步访问的。
- Vector 包含了许多传统的方法,这些方法不属于集合框架。
- Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。
- Vector是 线程安全的 ,即它的大部分方法都包含有关键字synchronized
若对于单一线程的应用来说,最好使用ArrayList代替Vector,因为这样效率会快很多(类似的情况有StringBuffer与StringBuilder);而在多线程程序中,为了保证数据的同步和一致性,可以使用Vector代替ArrayList实现同样的功能。
Vector 类支持 4 种构造方法。
- 第一种构造方法创建一个默认的向量,默认大小为 10:
Vector()
- 第二种构造方法创建指定大小的向量。
Vector(int size)
- 第三种构造方法创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目。
Vector(int size,int incr)
- 第四种构造方法创建一个包含集合 c 元素的向量:
Vector(Collection c)
除了从父类继承的方法外 Vector 还定义了以下方法:Java Vector 类.
2. Stack 类
- 栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
- 堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
- 与Vector一样,也是线程安全的
除了由Vector定义的所有方法,自己也定义了一些方法:
import java.util.*;
public class StackDemo {
static void showpush(Stack<Integer> st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<Integer>();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
} catch (EmptyStackException e) {
System.out.println(