java中 List,Set,Map有什么具体区别?

首先,数组和集合的区别:

  • 数组是大小固定
  • 集合可以存储和操作数目不固定的一组数据,集合只能存放引用类型的的数据,不能存放基本数据类型

特性

List

  • 允许重复
  • 有序
  • 继承自Connection

Set

  • 不允许重复
  • 无序
  • 继承自Connection

Map

  • 键值对
  • 区别与ListSet,既没有继承也没有实现Connection

场景

三者各自适用什么样的场景?

List

  • 使用索引对元素进行访问
    ArrayList适合快速查找,LinkedList适合增删元素
  • 对有序有需求

Set

  • 确保元素的唯一性
    常用的Set有:HashSetLinkedHashSetTreeSet。其中,TreeSet中的元素可以使用Comparator 或者 Comparable 进行排序;LinkedHashSet也按照元素的插入顺序对它们进行存储

Map

  • 希望以键值对的形式存在
    常用的Map有:HashMapLinkedHashSetTreeMap。其中HashMap是无序的,LinkedHashSet有序,TreeMap可通过Comparator 或者 Comparable 进行排序
    另外HashTable也可以实现键值对,并且相对于HashMap是线程安全的,但是由于JAVA5以上 ConcurrentHashMap是线程安全的,但现在已经基本被HashMap取代

List:有序可重复

ArraryList是List的其中一个实现类,我们常用的集合,底层是动态数组

,它可以存储null值和任何类型的数据;他的初始化大小在源码中是private static final int DEFAULT_CAPACITY = 10;该集合是自动扩容;它是线程不安全的,支持随机访问

LinkList是List的其中一个实现类,底层是双向的链表

,他不仅有ArraryList的基本操作还有get,remove,insert方法;但是他不能随机访问,所以查询的速度比ArraryList慢,因为他的底层是链表,所以在增删方面的速度远远大于ArraryList

Vector是List的其中一个实现类,跟ArraryList差不多,ArraryList有的操作他都有,底层是动态数组,但是他是同步的,意思就是他是线程安全

Set:无序不重复

HashSet可以说是在查询方面速度是最快的集合,他的内部原理是HashCode,允许存储有且只有一个null值,元素的顺序是由哈希码

来决定,不保证迭代顺序

TreeSet的内部原理是采用二叉树,不允许存储null值,元素的自然顺序排序

Map:保证元素的一对一关系

HashMap内部是以哈希表

数据结构

实现,该集合是为了快速查询设计的,内部有一个hash数组,允许存储null值;该集合是线程不安全的

HashTable的实现原理和HashMap一样,不允许存储null值,是线程安全的集合

TreeMap的内部是一个有序的散列表,底层是我们比较恐怖的红黑树

posted @ 2023-01-05 10:20  锐洋智能  阅读(123)  评论(0编辑  收藏  举报