Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
List : 有序存储,允许重复
ArrayList : 线程不安全,不同步;线性表,底层是使用数组实现的,查询效率较高,缺点就是插入删除时非常麻烦;
LinkedList : 线程不安全,不同步,双向链表,插入速度高,访问数据效率低,缺点就是查找非常麻烦,适合新增和删除操作;
Vector : 使用了sychronized方法(线程安全,同步的
Set : 无序的,不允许重复
Map : 无序的,不允许重复,以键值对存储数据;
HashTable : 线程安全的,同步的,不允许 null 键和 null 值,比HashMap 慢,底层是哈希表数据结构,实现线程安全的方法是在修改数据时锁住整个hashtable,这样的话效率就会很低;
HashMap : 线程序不安全的,不同步的,没有分类或排序,允许一个null键和多个null值,底层是哈希表数据结构,初始size是16,然后每次扩容都是以2的n次幂扩容的;
ConcurrentHashMap:是一个线程安全的哈希表实现。它支持并发访问,可以在多线程环境下高效地读取和写入数据。
ConcurrentHashMap 的主要特点包括:
1. 线程安全:ConcurrentHashMap 的所有公共方法都通过同步块保护,确保多线程访问时的安全性。
2. 高并发性能:ConcurrentHashMap 采用分段锁技术,将数据分成多个段,每个段都有自己的锁。当多个线程访问不同段的数据时,不会发生锁竞争,从而提高了并发性能。
3. 动态扩容:ConcurrentHashMap 内部会根据当前负载情况动态调整段数量,以适应不同的负载需求。
4. 插入和删除操作:ConcurrentHashMap 支持线程安全地插入和删除元素。
5. 迭代顺序:ConcurrentHashMap 的迭代顺序与插入顺序一致,但不一定与访问顺序一致。
使用 ConcurrentHashMap 可以替代 Java 中的 Hashtable 或 synchronizedMap,提高多线程环境下的性能和并发性。
Collections :是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection :是个java.util下的接口,它是各种集合结构的父接口。
Map遍历的四种方式:
Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素
Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值,通过Map.keySet遍历key和value
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种,通过Map.entrySet使用iterator遍历key和value
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时,通过Map.entrySet遍历key和value
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种:遍历所有的value
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}