您的位置:首页 > 编程语言 > Java开发

Java中用的最多的类(之一) 容器类

2017-02-27 11:21 162 查看

java容器类的两大接口

collection和map,是Java容器类中的最主要的两个接口。其他容器类都是从这两个接口中派生出来的。

collection:可以认为是基础的线性表,旗下继续派生出两个子接口:list和set。

map:可以认为是基础的键值对集合

collection接口

collection拥有对线性表的基础操作,主要方法有:

boolean add(Object o) //添加对象到集合
boolean remove(Object o) //删除指定的对象
int size() //返回当前集合中元素的数量
boolean contains(Object o) //查找集合中是否有指定的对象
boolean isEmpty() //判断集合是否为空
Iterator iterator() //返回一个迭代器
boolean containsAll(Collection c) //查找集合中是否有集合c中的元素
boolean addAll(Collection c) //将集合c中所有的元素添加给该集合
void clear() //删除集合中所有元素
void removeAll(Collection c) //从集合中删除c集合中也有的元素
void retainAll(Collection c) //从集合中删除集合c中不包含


Iterator:所有的集合类都继承了这个接口。可以配合for-each循环获得集合的所有元素,而不需要知道具体细节

这些操作也是集合类中最常用的操作,不多说了,我先背这些方法去了。。

collections:这是一个工具类,提供了很多方法来对collections进行操作。与collection分清。

List和Set

这是继承自collection接口的两个接口,分别拓展了不同的作用

List:加入了“有序”的概念,可以使用户控制插入元素的位置(collection不行)。也可以使用位置(数组下标?)直接访问元素。

包括:ArrayList,LinkedList,Vector,Stack等

Set:这个集合中的元素是不能重复的。即
e1.equals(e2) = false


包括:HashSet,TreeSet等

以上两个接口继续往下拓展,下面即是用的最多的各种collection实现类了

List旗下

ArrayList:用的最多,表面上看是更加灵活、容量可变的数组,实际上底层实现也是数组。所以擅长随机访问,不擅长随机增删。

长度自动增长是由复制粘贴算法实现,所以如果大数据存放,事先应该设置大小

LinkedList:底层实现是链表,所以更加擅长增删,不擅长随机访问。此外LinkedList提供额外的get(),remove(),insert()方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

以上两个类都是线程不安全的,如果需要线程安全,请使用下面这个类

Vector:可以认为是线程安全的ArrayList。迭代器在别的线程改变元素时,会抛出异常(上面两个类不会)。

Stack:继承自Vector,是一个堆栈。提供push()、pop()等方法进行堆栈操作。

Set旗下

HashSet:使用哈希表来实现Set,不允许重复,访问速度快,允许包含值为null的元素。底层使用了hashmap进行实现。

哈希表是一种用空间换时间的数据结构,访问速度快。

TreeSet:是一种排序的Set,插入时即确保顺序,底层使用TreeMap进行实现

底层实现是map,表现出来connection(笑)

Map接口

这个接口定义了一种键值对的集合,一个Map中不能包含相同的key,每个key只能映射一个 value。

主要方法:

boolean equals(Object o) //比较对象
boolean remove(Object o) //删除一个对象
put(Object key,Object value) //添加key和value


以下是几个主要的实现类

HashTable:实现了一个key-value的哈希表,get()和put()操作实现添加和取出。Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。哈希表需要在时间和空间方面取舍。

这个类是线程安全的,不允许空元素(null)

按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

如果需要用自己定义的类作为key,为了避免上面的冲突,需要同时复写equals方法和hashCode方法,而不要只写其中一个。

HashMap:类似hashtable,不同的是,这个类是非同步的,并且允许null存在

WeakHashMap:WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

以上只是简单地说了说java中常用的集合类,其实每个类展开都能讲很多,还需要在日常使用中多加熟练。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 容器类