集合中存放的是对象的引用。
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()1
2
3for(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)