java-清楚明了的集合
集合基础
- java集合都在java.util里
- Java的集合类由
Collection
接口和Map
接口派生
集合类和数组的不同
数组元素可以为基本数据类型值/对象引用;
集合元素只能为对象引用;
线程安全用红色标出
Conllection存放单值的最大接口
1.<<interface>> Set 需要唯一
无序集合,可以去重
- 重复通过hashCode()和equals()判断
SortedSet <<interface>>
|-----TreeSet 需要指定顺序
实现Comparable接口实现排序
HashSet 不需要指定顺序
散列的方式存放(需要去重需要覆写hashcode()和equals()方法)
LinkedHashSet 与存储顺序一致
2.<<interface>> List 不需要唯一
有序集合(顺序保存),可重复
ArrayList[查找快,数组实现]
初始值为10
ArrayList每次扩容的容量是当前的1.5倍
Vector[线程安全,过时]
性能低,同步,安全
由于Vector中的方法基本都是synchronized的,其性能低于ArrayList
Vector可以定义数组长度扩容的因子,ArrayList不能
丨------stack[线程安全,栈,先进后出]
LinkedList[增删快,链表实现]
基于双向链表,可以在开头添加,可以在结尾添加
遍历LinkedList时应用iterator方式,不要用get(int)方式,否则效率会很低
3.<<interface>> Queue
先进先出
Map接口
存储键值对
1.Hashtable注意table
线程安全,性能低
Hashtable不能将键和值设为null
[总体加锁]Hashtable 在进行读写操作时会锁住整个Entry数组,这就导
致数据越多性能越差。
ConCurrentHashMap对桶数组进行分段加锁,不允许空值
2.HashMap
异步处理,非线程安全,性能高
初始化为16(数组),扩容因子为0.75
HashMap能够将键设为null,也可以将值设为null
HashMap有快速寻址的特点
HashMap不能保证元素的顺序
//输出key 和 value
System.out.println("第一种:通过Map.keySet遍历key和value:");
for (Integer in : map.keySet()) {
//map.keySet()返回的是所有key的值
String str = map.get(in);//得到每个key多对用value的值
System.out.println(in + " " + str);
}
// 推荐,尤其是容量大时
//通过Map.entrySet遍历key和value");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//Map.Entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry
//entry.setValue();
//map.entrySet() 返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey()
+ " and value= "+ entry.getValue());
}
丨------ConcurrentHashMap
是HashMap的线程安全版(自JDK1.5引入),提供比Hashtable更高效的并发性能。
原理:
ConcurrentHashMap使用分离锁的思路解决并发性能,其将 Entry数组拆
分至16个Segment中,以哈希算法决定Entry应该存储在哪个Segment。
这样就可以实现在写操作时只对一个Segment 加锁,大幅提升了并发写的性能。
在进行读操作时,ConcurrentHashMap在绝大部分情况下都不需要加锁,其Entry
中的value是volatile的,这保证了value被修改时的线程可见性,无需加锁便能实现
线程安全的读操作。
它不能保证读操作的绝对一致性。
丨------WeakHashMap
3.LinkedHashMap
LinkedHashMap与HashMap非常类似,唯一的不同在于前者
的Entry在HashMap.Entry的基础上增加了到前一个插入和后一个插
入的Entry的引用,以实现能够按Entry的插入顺序进行遍历。
4.TreeMap
TreeMap是基于红黑树实现的Map结构,其Entry类拥有到左/右叶子节点和父节点的引用,同时还记录了自己的颜色