JAVA基础-集合
1.概述
JAVA容器分为两大类:
Collection接口的子接口包括:List接口和Set接口;List接口实现类主要有ArrayList、LienkedList、Vector等;Set接口的主要实现类有HashSet、TreeSet、LinkedHashSet等;
Map接口的实现类主要有HashMap、TreeMap、Hashtable、ConcurrentHashMap等;
- Collection
List
ArrayList
LinkedList
Vector
Set
HashSet
LinkedHashSet
TreeSet - Map
HashMap
LinkedHashMap
TreeMap
ConccurrentHashMap
Hashtable
2.List和Set的异同
- List接口:List是有序的Collection,保持了每个元素插入的顺序,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素;
- Set接口:Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。
允许重复对象 | null元素 | 是否有序 | 常见实现类 | |
---|---|---|---|---|
List | 是 | 允许多个null元素 | 是 | ArrayList LinkedList Vector |
Set | 否 | 允许插入一个null元素 | 否 | HashSet LinkedHashSet TreeSet |
两个接口都是继承自Collection,是常用来存放数据项的集合,主要区别如下:
① List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。
② 与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。
③ List可以通过下标来访问,而Set不能。
List和Set可以相互转化:
//List转Set
Set<String> set = new HashSet<>(list);
//Set转List
List<String> list1 = new ArrayList<>(set);
3. List接口常用实现类
ArrayList、Vector和LinkedList类均在java.util包下;ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器。
数据结构 | 并发安全 | 扩容机制 | |
---|---|---|---|
ArrayList | 数组 | 非线程安全 | 自动增长原数组的0.5倍 |
Vector | 数组 | 线程安全 | 增长为原数组的1倍 |
LinkedList | 双向链表 | 非线程安全 | 无 |
4.Set接口常用实现类
HashSet: 无序
LinkedHashSet: 按照插入顺序
TreeSet: 从小到大排序
-
(1)HashSet
HashSet有以下特点
- 不能保证元素的排列顺序,顺序有可能发生变化
- 不是同步的
- 集合元素可以是null,但只能放入一个null -
(2)TreeSet
TreeSet类型是J2SE中唯一可实现自动排序的类型TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。
-
(3)LinkedHashSet
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
4.List和Map的区别
-
List是存储单列的集合
-
Map存储的是key-value键值对的集合
-
List存储的数据是有序且可以重复的
-
Map中存储的数据是无序且key值不能重复
5.Map接口常用实现类
允许key/value为空 | 并发安全 | 排序 | |
---|---|---|---|
HashMap | 允许为空 | 非线程安全 | 无序 |
LinkedHashMap | 允许为空 | 非线程安全 | 保持插入时顺序 |
TreeMap | 允许为空 | 非线程安全 | 根据键排序,默认升序 |
ConccurrentHashMap | 不允许为空 | 线程安全 | 无序 |
Hashtable | 不允许为空 | 线程安全 | 无序 |
-
1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
-
2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
-
3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
-
4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。
网友评论