java中 List,Set,Map有什么具体区别?
首先,数组和集合的区别:
- 数组是大小固定的
- 集合可以存储和操作数目不固定的一组数据,集合只能存放引用类型的的数据,不能存放基本数据类型
特性
List
- 允许重复
- 有序
- 继承自
Connection
Set
- 不允许重复
- 无序
- 继承自
Connection
Map
- 键值对
- 区别与
List
和Set
,既没有继承也没有实现Connection
场景
三者各自适用什么样的场景?
List
- 使用索引对元素进行访问
ArrayList
适合快速查找,LinkedList
适合增删元素 - 对有序有需求
Set
- 确保元素的唯一性
常用的Set
有:HashSet
、LinkedHashSet
和TreeSet
。其中,TreeSet
中的元素可以使用Comparator
或者Comparable
进行排序;LinkedHashSet
也按照元素的插入顺序对它们进行存储
Map
- 希望以键值对的形式存在
常用的Map
有:HashMap
、LinkedHashSet
和TreeMap
。其中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的内部是一个有序的散列表,底层是我们比较恐怖的红黑树