java集合类框架
原文出处:于卫国,http://yuweiguocn.github.io/java-collection/
Java集合类框架概览及各集合之间的区别。
集合中存放的是对象的引用。
Collections:集合的搜索、排序、线程安全化等
Collection接口
- boolean add(Object o)
- boolean addAll(Collection c)
- boolean remove(Object o)
- boolean removeAll(Collection c)去交集
- boolean retainAll(Collection c)取交集
- Iterator iterator()
- Object[] toArray()
- Object[] toArray(Object[] a)
Iterator接口
boolean hasNext()
Object next()
for(Iterator it=c.iterator();it.hasNext();) {
Object o=it.next();
}
ListIterator接口
ListIterator是Iterator的子接口。
Iterator和ListIterator的区别
- 遍历方法 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序身后遍历,但是ListIterator还有hasPrevious()和pervious()- 方法,可以实现逆向(顺序向前)遍历,Iterator就不可以。
- 遍历索引定位 ListIterator 可以定位索引位置——nextIndex()和previousIndex(),Iterator没有此功能。
- 增加集合对象元素方法 ListIterator有add方法,可以向List中添加对象,而Iterator不能。
- 对象维护 都可实现删除对象,但ListIterator可以调用set方法来对集合元素进行修改。而Iterator不能。
Map接口类型
Map接口实现者调用接口方法values()返回一个实现collection接口的对象引用。collection接口的实现者又可以调用iterator()方法返回一个实现Iterator接口的对象引用。
Map接口用于将一个键(key)映射到一个值(value),且不允许有重复的键。Map提供了一个称为entrySet()的方法,这个方法返回一个实现Set接口的集合对象,集合中的每个对象元素又都实现了Map.Entry接口。Map.Entry接口提供了一个getKey()方法和一个getValue()方法。
集合对象排序接口Comparator
实现此接口的类可以进行排序,实现compare方法就可以了。
基本数据类型实现了这个接口,调用Collections.sort(list)进行排序;
如果Comparator只用一次,可使用匿名类。
List和Set的区别
List:
元素是有序的,因为该集合体系有索引
元素可以重复
Set:
元素是无序的
元素不可以重复
取出只能是Iterator
HashSet和TreeSet的区别
HashSet:
哈希表结构 判断是否重复用hashCode和equals方法
当hashCode相等时判断equals方法
TreeSet:
二叉树结构,可以排序
Vector和ArrayList的区别
Vector:
线程同步
当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍
ArrayList:
线程不同步,但性能很好
当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小
ArrayList和LinkedList的区别
ArrayList:
底层是数组数据结构
查询快,增删慢
LinkedList:
底层是链表数据结构
增删快,查询慢
HashTable和HashMap的区别
HashTable:
线程同步
不允许key和value的值为null
HashMap:
线程不同步
允许一个key为null,和多个value为null
TreeMap和HashMap的区别
- TreeMap:
* 二叉树结构
* 线程不同步
* 可用于给map集合中的键进行排序
- HashMap:
* 哈希表结构
* 线程不同步
* 允许一个key为null,和多个value为null
hashCode的作用
哈希算法可以提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定对象应该存储在哪个区域。hashCode在有哈希算法类的集合里才有价值,如hashSet、hashMap、hashTable。只有类的实例对象被要求采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。
当一个对象存储进hashSet集合中就不能再修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合时的哈希值就不同了。这种情况下,即使在contains方法中使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
集合类的选择
是否有线程安全问题
集合类的元素数量是否很大(很大应该选择Hash开头的类,便于快速检索)
哪种集合类的结构方便当前使用
Collections类
- Set singleton(Object o)
- List singletonList(Object o)
- Map singletonMap(Object key,Object value)
- 填充集合 nCopies(int length,Object o)
- 复制集合 copy(List dest,List src)
- 查找替换 boolean replaceAll(List list,Object oldVal,Object newVal)
- 集合排序 void sort(List list)
还没有评论,来说两句吧...