java 容器

来源:互联网 发布:java 防止 sql注入 编辑:程序博客网 时间:2024/05/14 20:49

在java的容器类库中一共有两种类型:Collection和Map,他们的区别在于Collection只能存储单个元素,而Map是通过key-value的键值对存储元素。

通过查看源码可以发现,所有的java容器类都是可以自动调整自己的尺寸的。拿ArrayList来说吧,因为ArrayList底层是用数组实现的,那么我们不停的

往里面添加元素会不会使数组越界呢?当然不会,在ArrayList源码中有这么一段

public void ensureCapacity(int minCapacity) {

modCount++;

int oldCapacity = elementData.length;

if (minCapacity > oldCapacity) {

Object oldData[] = elementData;

int newCapacity = (oldCapacity * 3)/2 + 1;

if (newCapacity < minCapacity)

newCapacity = minCapacity;

// minCapacity is usually close to size, so this is a win:

elementData = Arrays.copyOf(elementData, newCapacity);

}

}

这样就可以保证数组在到达末尾的时候为数组扩容,从而达到调整尺寸,防止越界的目的。

Collection的子类有

List:以链的形式存储元素,它的之类有两个

ArrayList:擅长随机访问元素,但是插入、删除、移动元素效率较慢

LinkedList:插入、删除、移动元素方便,但是随机访问性较差

Vector

Set:每个值只能保存一个对象,不能含有重复的元素,它的子类有

HashSet:使用散列函数

TreeSet:使用红黑树

LinkedHashSet:使用链表结合散列函数

Queue:先进先出容器

Map的子类有

HashMap

HashTable:方法是Synchronize的

TreeMap

我们可以看到,其实容器类子类还是有不少的,那么我们在使用的时候到底如何选择呢?

在各个List中,最好的做法就是以ArrayList作为默认选择。只有当插入、删除频繁的时候,我们才选择LinkedList(),Vector总是比ArrayList慢,

所以我们很少在程序中看到使用Vector。在各个Set中,HashSet在插入,查找方面常常优于HashTree,只有当需要产生一个经过排序的序列,

才用TreeSet。HashTree的意义是用来维护其内元素的排序状态。在各个Map中,HashMap用于快速查找。当各个元素固定时,最好使用Array,

因为Array对于get()和set()效率是最高的。

值得注意的一点,Map中的key是Set,value是Collection,所以如果通过key遍历Map输出顺序不一定同存储顺序。


0 0