在平常开发工作中,经常会用到集合,集合的种类很多。常用的集合有Map、List、Set等,那么它们之间有什么区别及联系呢?好了,下面开始正题咯!

先看一张集合的关系图:

java list和map的区别 list跟map的区别_底层实现

Collection集合接口下面有List、Set和Queue,Map为独立的接口。List下面分为ArrayList、LinkedList和Vector;Set下面分为HashSet、TreeSet和LinkedHashSet;Queue下面有PriorityQueue;Map下面分为HashMap、TreeMap、HashTable和LinkedHashMap。

1:List:有序,可重复

1)ArrayList:底层实现是数组,查找速度比较快,增加和删除速度比较慢,不是线程安全的;

2)LinkedList:底层实现是链表,查看速度比较慢,增加和删除速度比较快,不是线程安全的;

3)Vector:线程安全的,已经被逐渐废弃,这里不再赘述;

2:Set:

1)HashSet:无序,不可重复,底层实现是哈希表,最主要的方法就是hashCode()和equals()方法。当往其中存储元素的时候,判断其hashCode值是否相同,通过hashCode值确定其存储的位置。通过hashCode()方法,判断两个对象哈希值是否相同,通过equals方法,判断两个对象是否相同,如果两者值有其一不同,则认为是不同的对象。如果两个对象相同,则hashCode值相同;两个对象hashCode值相同,对象不一定相同。

2)TreeSet:有序,不可重复,底层实现是红黑树。基本操作方法有add、remove和contains。TreeSet是SortedSet接口的实现类,采用红黑树的来存储元素。TreeSet支持两种排序方法,自然排序和定制排序。

3)LinkedHashSet:有序,不可重复。底层实现是链表和哈希表。LinkedHashSet是Set的一个具体实现。LinkedHashSet存储结构是一个双向链表,因此它存储的元素是有序的。

3:Map

1)HashMap:无需,可重复

public class Demo {
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap();
        map.put("id","20200625");
        map.put("name","小杜");
        map.put("age","18");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
        }
    }
}

底层实现是哈希表,key和value允许为空值。在jdk1.8以前,底层实现是数组加链表,在jdk1.8中,底层实现是数组加链表加红黑树。当同一个位置存储的元素超过阈值8时,链表转换为红黑树;当元素值少于阈值6时,红黑树转换为链表。

2)HashTable:

public class Demo {
    public static void main(String[] args) {
        Hashtable hashtable = new Hashtable();
        hashtable.put("1","1111");
        hashtable.put("2","2222");
    }
}

底层实现是哈希表,不允许key和value为空值,是线程安全的,底层的实现方法都加了关键字Synchronize,所以是线程安全的。

3)LinkedHashMap:

根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,它不是线程安全的。

4)TreeMap:

底层实现是红黑树,是一个有序的key、value集合。TreeMap有两种排序方式:自然排序和定制排序。不允许key和value为空值。

总结:以上总结了集合的分类及基本用法,具体使用哪种,要根据业务场景,选择合适的集合,这样才能提高性能,更好的实现功能。

知识就是要不断的学习,不断的复习,才会记忆的更加的深刻。加油,美好的风景一直在路上。