转载请注明地址:http://blog.youkuaiyun.com/yincheng886337/article/details/50525174
常用的集合包主要包括Collection和Map两个接口,Collection主要用于多个单对象,Map用于存放Key-Value形式的键值对
现将其总结如下,便于查阅:
Collection:
非线程安全:
ArrayList、LinkedList、Stack、HashSet、TreeSet
线程安全:
Vector、CopyOnWriteSet、CopyOnWriteArrayList、ArrayBlockingQueue、LinkedLockingQueue
Map:
非线程安全:
HashMap、TreeMap(基于红黑树实现)
线程安全:
ConcurrentHashMap
原子操作类:
AtomicInteger、 ActomicLong、 AtomicBoolean、AtomicReference
使用场景:
ArrayList适用于要通过位置来读取元素的场景;
LinkedList适用于头尾操作及插入指定位置的场景;
Vector适用于线性安全的ArrayList场景;
Stack使用线性安全的LIFO场景,如需要支持FIFO,可使用ArrayBlockingQueue;
HashSet适用于对排序没有要求的非重复元素的存放;
TreeSet适用于要排序的非重复元素的存放;
HashMap适用于大部分key-value存取场景;
TreeMap适用于须排序存放的key-value场景;
线程安全集合类:
ConcurrentHashMap和HashMap在单线程场景,前者稍差于后者(ns级别),多线程时前者明显优于后者;
结论:
List的实现随着元素数量的上升,查找和删除元素时性能下降较严重、Set和Map基本不受影响。对查找和删除频繁,且元素较多时建议使用set和Map,多线程操作时强烈建议使用线程安全类集合,而非通过相应的锁机制来保证数据安全
序列化与反序列化:
对于Java的网络通信而言,将对象转换为流然后进行网络传输是最基本和最常用的方法,而把对象转化成流以及将流转化成对象,最常用方法就是Java自带的序列化
序列化(对象转化成流)
//创建一个字节数组输出流
ByteArrayOutputStream output = new ByteArrayOutputStream();
//将字节数组输出流包装成ObjectOutputStream
ObjectOutputStream objectOut = new ObjectOutputStream(output);
//对对象写入ObjectOutputStream
objectOut.writeObject(object);
objectOut.close();
Output.close();
//返回字节数组输出流中的字节数组
Return output.toByteArray();
反序列化(流转化成对象)
//创建一个字节数组输入流
ByteArrayInputStream input= new ByteArrayInputStream();
//将字节数组输入流包装成ObjectInputStream
ObjectInputStream oin= new ObjectInputStream(input);
//对流写入object
Object object = oin.readObject();
oin.close();
input.close();
集合名称 | 插入对象 | 删除对象 | 获取单个对象 | 遍历对象 | 线程安全 |
---|---|---|---|---|---|
ArrayList | add(E) | remove(E) | get(int) | iterator | 非线程安全 |
LinkedList | add(E) | remove(E) | get(int) | iterator | 非线程安全 |
Vector | add(E) | remove(E) | get(int) | iterator | 线程安全 |
Stack | push | pop | peek | pop | iterator | 线程安全 |
HashSet | iterator | remove(E) | 只能通过iterator来获取 | iterator | 非线程安全 |
TreeSet | add(E) | remove(E) | 只能通过iterator来获取 | iterator | 非线程安全 |