接口中出现的方法其实现类中必然都有且含义相同,所以先介绍接口,再看具体实现类实现的接口与相关方法
方法较多,请自行参考API
Queue 方法 | 等效 Deque 方法 |
---|---|
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
堆栈方法 | 等效 Deque 方法 |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
List list = Collections.synchronizedList(new ArrayList(...));
实现的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>
LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
同步的
Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量构造一个空的向量。
void trimToSize() 对此向量的容量进行微调,使其等于向量的当前大小。
extends Vector<E>
Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。例如:
Deque<Integer> stack = new ArrayDeque<Integer>();
特有方法
实现原理是数组+链表
extends HashMap<K,V>
返回的顺序与插入的顺序相同,你也可以这样使用
void foo(Map m) {
Map copy = new LinkedHashMap(m);
...
}
同步:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
extends Dictionary<K,V> implements Map<K,V>
它是同步的
extends Hashtable<Object,Object>
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。它是线程安全的。
常用方法:
Enumeration<?> propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
Set
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。
extends AbstractSet<E>implements Set<E>, Cloneable, Serializable
HashSet()
构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
extends HashSet
void foo(Set s) {
Set copy = new LinkedHashSet(s);
...
}
LinkedHashSet(int initialCapacity, float loadFactor)
构造一个带有指定初始容量和加载因子的新空链接哈希 set。
extends AbstractSet<E>implements NavigableSet<E>, Cloneable, Serializable
基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
此实现为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。
常用方法:
boolean add(E e)
将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
E pollLast()
获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。
Iterator
快速失败(fail—fast):
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)
安全失败(fail—safe):
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
集合类 | key | value | Super | 说明 |
---|---|---|---|---|
Hashtable | not null | not null | Dictionary | 线程安全 |
ConcurrentHashMap | not null | not null | AbstractMap | 锁分段技术(JDK8:CAS) |
TreeMap | not null | null | AbstractMap | 线程不安全 |
HashMap | null | null | AbstractMap | 线程不安全 |
ArrayList的subList不可强转成ArrayList,否则会抛出ClassCastException异常。
说明:
subList返回的是ArrayList的内部类SubList,并不是ArrayList而是ArrayList的一个视图,对SubList子列表的所有操作最终都会反映到原列表中
在subList场景中,高度注意对原集合的增加或删除,均会导致子列表的遍历,增加,删除产生的ConcurrentModificationExcetion异常。
new Comparator<Student>(){
@Override
public int compare(Student o1,Student o2){
if(o1.getScore() > o2.getScore()){
return 1;
}else if(o1.getScore() < o2.getScore()){
return -1;
}else{
return 0;
}
}
}
Arrays.class
static
使用二分搜索法来搜索指定数组,以获得指定对象。
static
根据指定比较器产生的顺序对指定对象数组进行排序。
Collections.class
static
使用二分搜索法搜索指定列表,以获得指定对象。
static
使用二分搜索法搜索指定列表,以获得指定对象。
static
根据指定比较器产生的顺序,返回给定 collection 的最小元素。
static
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
static
根据指定比较器产生的顺序对指定列表进行排序。
static
返回指定 collection 支持的同步(线程安全的)collection。
static
返回指定列表支持的同步(线程安全的)列表。
static <K,V> Map<K,V>
synchronizedMap(Map<K,V> m)
返回由指定映射支持的同步(线程安全的)映射。
static
返回指定 set 支持的同步(线程安全的)set。
static <K,V> SortedMap<K,V>
synchronizedSortedMap(SortedMap<K,V> m)
返回指定有序映射支持的同步(线程安全的)有序映射。
static
返回指定有序 set 支持的同步(线程安全的)有序 set。
工具类Arrays.asList()把数组转集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出异常。
说明:
asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。它体现的是适配器模式,只是转换接口,后台数据仍是数组。
另外数组转集合还可以用这个方法
static
将所有指定元素添加到指定 collection 中。
例:
List<String> resultList = new ArrayList<>(array.length);
Collections.addAll(resultList,array);
利用集合的toArray(T[] array)
方法
String[] array = new String[list.size()];
array = list.toArray(array);
回到目录?
原文:https://www.cnblogs.com/lifan1998/p/10388540.html