Collections常用方法:
public static <T> boolean addAll(Collection<? super T> c, T... elements)//往集合中添加一些元素
public static void shuffle(List<?> list)//打乱集合顺序
public static <T extends Comparable<? super T>> void sort(List<T> list)//对集合排序
//自定义类使用方法:首先自定义类要实现comparable<E>接口,这里泛型写自己的类即可,其次要重写compareTo方法,例:return o.getAge()-this.getAge()为按年龄降序,顺序颠倒即为升序
public static <T> void sort(List<T> list, Comparator<? super T> c)//对集合排序
使用例子:Collections.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
HashMap
对于Map系列,HashMap和Hashtable最常用, Hashtable 是将数组&链表完美结合起来的数据结构, 外层数据结构是Entry数组,Entry内部有个指针(引用)指向下一个Entry,这样就形成一个链表。Hashtable中元素在数组的位置是计算出来的:计算器key的Hash值,然后与数组长度取余获得在数组位置,如果此位置已经有Entry(hash值相同),那么就直接插入在这数组位置,并让Entry的next指向之前的数组位置的Entry。 Hashtable和HashMap的最大差别是Hashtable是线程安全的。
LinkedHashMap就是在HashMap基础上加入链表记录写入顺序以便可以按顺序读出。
集合的线程安全:
1、通过使用Collections中的方法将线程不安全的集合转变为线程安全的集合:
直接添加synchronized代码块,所以效率低下,现在几乎不使用。
ArrayList<String> arrayList = new ArrayList<String>();
List<String> syncList = Collections.synchronizedList(arrayList);
2、使用CopyOnWriteArrayList【线程安全的List】
CopyOnWriteArrayList中对写( set(),add(),remove() )的方法加了重入锁,在读( get() )的方法中没有加锁,从而保证了一定的效率。
另外在写的过程中是要每次在写的过程中都要重新copy一份新的数组,所以事实上是用空间换取安全性。
CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>();
3、使用CopyOnWriteArraySet【线程安全的Set】
底层是通过CopyOnWriteArrayList来实现的,与之不同的是使用 addIfAbsent() 添加元素,遍历数组,判断( equals() )是否存在该元素,如存在元素则不添加(扔掉副本)来保证没有重复。
还要注意因为底层是CopyOnWriteArrayList实现的,所以也是有序的。
Queue
是Collection的子接口,表示队列(FIFO)
1、ConcurrentLinkedQueue(非阻塞队列)
是Queue的一个实现类,线程安全,高并发下性能最佳,无锁,采用CAS比较交换算法,修改方法包括三个核心参数(V, E, N)只有当要更新的值V==预期值E时,才将新值N赋值给V。
2、BlockingQueue(阻塞队列)
是Queue的一个子接口, 可用于生产者,消费者案例
具体实现有:
ArrayBlockingQueue 数组结构实现,需要手动指定队列大小
ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(10);
LinkedBlockingQueue 链表结构实现,大小为:Integer.MAX_VALUE
LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<String>();