集合类示意图
从图中可知 Collection是 List,Set,Quene 的根接口,Map 是另一个接口 Iterator用于遍历集合中元素的接口
下面是各集合的特性
集合名 | 是否有序 | 是否允许元素重复 |
---|---|---|
Liist | 否 | 是 |
HashSet | 否 | 否 |
TreeSet | 是(二叉排序树) | 否 |
HashMap | 否 | key唯一,value可重复 |
TreeMap | 是(二叉排序树) | 同上 |
[集合类特点]
集合类方法
遍历Map方法
- 方法一
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
- 方法二
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
LinkList 方法
- peek() 或 element() 获取但不移除此列表的头
- poll() 或 remove() 获取并移除此列表的头
- offer(4) 将指定元素添加到此列表的末尾
TreeMap
- 如果key不实现比较方法
TreeMap<User, Object> tMap = new TreeMap<>(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
// TODO Auto-generated method stub
return o1.getAge() == o2.getAge() ?0:(o1.getAge()>o2.getAge()?1:-1);
}
});
- 如果key实现了Comparable接口 TreeMap 可以不实现Comparator接口,但实现了以它为先。
OTHER
HashMap 在新版jdk8 中,在数据量大的时候不会采用hash方法哈希key,会采用b-tree,就和现在数据库采用b-tree的原因一样,当数据量过大的时候,hash会造成大多数数据hash值一样,再做偏移处理,反而影响性能。
一般集合的加载因子为0.75 ArrayList 初始化容量为10
HashMap 初始化容量为16 即使你初始化的时候指定一个值去初始化容量 其值也不一定是你指定的那个值,其一定是2的幂次方,代码如下
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
几组区别
-
HashMap 和 HashTable 、ConcurrentHashMap 区别 - HashTable和ConcurrentHashMap 是线程安全的,现在主要用 后者 - HashTable key值不支持null ,其他支持为null - HashTable 是全部都用的synchronized 加锁,而ConcurrentHashMap使用的分段锁,而且在读取value不加锁,用的是Segment锁(其实是一种ReentrantLock锁)
-
LinkedList 和 ArrayList
- ArrayList查询修改快,LinkedList 增删快
- LinkedList 是双向循环链表,也就是具有队列和栈的特性
欢迎关注我的微信公众号cobs-snail,让我们一起前进吧!!