Java知识点梳理:Collection框架

java集合类是开发中经常用到的,比如ArrayList、HashMap、HashSet等,下面来系统的说一下。

Collection类图

在这里插入图片描述

Collections与Collection

  • Collection:是一个集合接口,提供了对集合对象进行基本操作的通用接口方法;
  • Collections:是针对集合类的一个包装类,它提供了一系列静态方法实现对各种集合的搜索、排序以及线程安全化的操作,其中的大多数方法都用于处理线性表。

List、Set、Map有序问题

这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。

  • List是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。
  • Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。
    其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。
  • Set是无序的,并且set中的元素不能重复 (没有索引)。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。
    其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。

List

ArrayList、LinkedList、Vector

ArrayList与Vector都是便于查找元素,在首末位置增加、删除元素尚可,如若在指定位置删除、增加元素,用LinkedList更高效。

ArrayList与LinkedList都是线程不安全的,Vector是线程安全的。

LinkedList 结构是双向循环链表。

  1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
  2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
  3. 所有的List中可以有null元素,例如[ tom,null,1 ];
  4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。

Set

HashSet、TreeSet

Map

HashMap

HashMap源码和底层结构

HashMap使用的存储结构:

transient Node<K,V>[] table;
 
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
}

HashMap的数据结构,底层是数组,数组中的每一项又是链表。
在这里插入图片描述
HashMap的存取实现:put元素时,根据key的hashCode重新计算hash值,根据hash值得到此元素在数组中的位置(即下标),插入链表。

HashMap为何线程不安全

《Java并发编程的艺术》一书中是这样说的:

HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为空,就会在获取Node时产生死循环。

死循环并不是发生在put操作时,而是发生在扩容时。详细的解释可以看下面几篇博客:
疫苗:JAVA HASHMAP的死循环

ConCurrentHashMap

线程安全,采用分段锁机制,拆分成N个Hashtable的Map。
在jdk1.8之后,采用CAS算法(无锁算法),是一种底层操作系统的算法,效率高。
concurrentLevel=16

HashMap、Hashtable、TreeMap

  • HashMap:允许空键值(key是null可以,value是null也可以),线程不安全,性能上会优于Hashtable;
  • Hashtable:不允许空键值,线程是安全的。其实现如下:
public synchronized V get(Object key) {
       // 省略实现
    }
public synchronized V put(K key, V value) {
    // 省略实现
    }

线程安全的Map:Hashtable,ConcurrentHashMap和synchronized Map

几种线程安全的Map解析

https://blog.csdn.net/BenjaminYoung29/article/details/79317940

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值