Java容器
Java容器
数组
数组应该是一种最原始的容器。
数组特点:高效,固定大小,固定保存类型,可保存基本类型;
用法:int[] array = new int[8];
Array类
Array 类提供了动态创建和访问 Java 数组的方法;
作为操作数组的工具类,提供了一系列的静态方法来操作数组;
与数组的差别:
– 容量可变
– 存放任意类型对象,但不能保存基本类型
Java常用容器继承关系:
Collection
├List 接口
│├LinkedList 链表
│├ArrayList 顺序结构动态数组类
│└Vector 向量
│ └Stack
栈
└Set
Map
├Hashtable
├HashMap
└WeakHashMap List接口
ArrayList
最基本、最常见的容器,可以简单看成“能够自动扩展的数组”;
和其他容器一样,ArrayList只保存Object的引用,所以除了基本类型,啥都可以放;
因为ArrayList只保存Object的引用,所以其contains()方法其实是靠判断引用来确定的,也就是靠判断对象内存地址来确定的 ;
ArrayList容量拓展:新的容量=(原始容量x3)/2 + 1 ;
ArrayList是线程不安全的,可以通过synchronized关键字,或者ArrayList中的Collections.synchronizedList()方法来解决线程不安全问题。
Vector
Vector非常类似ArrayList,但是Vector是同步的。
由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack
Stack继承自Vector,实现一个后进先出的堆栈。
Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。
LinkedList
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
HashTable与HashMap
两者的数据结构都是“链表散列”;
put元素的时候,先根据key的hash值得到这个元素在数组(Entry)中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。
区别
HashTable线程安全,HashMap非线程安全;
HashMap的键允许存在一个null(所以用containsKey()方法来判断键是否存在),值可以存在任意多null;HashTable键值都不能出现null;
HashTable的Entry数组默认初始为11,初始化时可指定;HashMap初始长度为16,长度始终保持2的n次方;
HashTable的数组拓展:2*原数组长度+1;HashMap的数组拓展:原数组长度* 2;
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
其他:
- List:
– ArrayList和数组随即访问性能高
– LinkedList添加和删除元素性能高
- Set:
– HashSet各项性能都很高
– TreeSet有顺序要求时使用
– LinkedHashSet有特殊操作时使用,如模拟栈
- Map:
– HashMap、TreeMap、LinkedHashMap的情况和Set类似
(待补充)