1. Java中的集合
集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含Queue)和 map(映射)。
- Iterator:迭代器,可以通过迭代器遍历集合中的数据
- Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
- Map:是映射表的基础接口
接下来我们详细介绍下每个接口和实现类~
1.1 Iterator接口
Iterator接口是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.如果实现Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到.通常无序集合实现的都是这个接口, 比如HashSet,HashMap.
1.2 LinkedIterator接口
LinkedIterator 在 Iterator 的基础上又添加了 add(),previous(),hasPrevious() 三种方法,那些元素有序的集合,实现的一般都是 LinkedIterator 接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过 previous()访问前一 个元素,比如 ArrayList
1.3 Collection(集合的最大接口)继承关系
- List 可以存放重复的内容
- Set 不能存放重复的内容,所有的重复内容靠**hashCode()和equals()**两个方法区分.
- Queue 队列接口
- SortedSet 可以对集合中的数据进行排序.
Collection定义了集合框架的共性功能
add()方法的参数类型是Object,以便接受任意类型对象.
集合中存储的都是对象的引用(地址)
1.4 List
凡是可以操作角标的方法都是该体系特有的方法.
- ArrayList底层是数组,查询速度快, 线程不安全.
- Vector线程安全,但速度慢,已被ArrayList替代
- LinkedList底层链表结果,增删速度快, 线程不安全.
- TreeList 底层是二叉树型结构,保证增删复杂度都是0(log n), 增删性能远远高于ArrayList和LinkedList.但是稍微占用内存.
1.5 Set
- Set 元素是无序(存入和取出的顺序不一定一致),元素不可以重复.
- HashSet 底层数据结构是哈希表.是线程不安全的,不同步.
问题: HashSet是如何保证元素唯一性的呢?
答:是通过元素的两个方法,hashCode()和equals()方法来完成.
如果元素的hashCode值相同,才会判断equals是否为true.
如果元素的hashCode值不同,不会调用equals()方法.
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法. - TreeSet 底层数据结构是二叉树,存放有序, TreeSet线程不安全
可以对 Set 集合中的元素进行排序。
通过 compareTo 或者 compare 方法来 保证元素的唯一性。 - LinkedHashSet: 底层是链表+哈希表, 线程不安全.
- HashSet 底层数据结构是哈希表.是线程不安全的,不同步.
1.5 Map
Correction、Set、List 接口都属于单值的操作,而 Map 中的每个元素都使用 key->value 的形式存储在集合中。
Map 集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性.
Map接口的常用子类
- HashMap: 底层详见下篇hashmap底层介绍,允许使用 null 值和 null 键,线程不安全.
- hashtable底层hash表, 已被concurrenthashmap代替.
- TreeMap:底层数据结构是二叉树, 线程不安全。可以用于给 map 集合中的键进行排序
2. ArrayList, LinkedList和Voctor区别
- ArrayList 底层结构是数组,底层查询快,增删慢
- LinkedList 底层结构是链表型的,增删快,查询慢
- Voctor 底层结构是数组 线程安全的,增删慢,查询慢
3. List 和 Map、Set 的区别
3.1 结构特点
- List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;
- List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set 中存储的数据是无序的,且不允许有重复, 但元素在集合中的位置由元素的 hashcode 决定,位置是固定的(Set 集合根据 hashcode 来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);
3.2 实现类
- List 接口有三个实现类(LinkedList:基于链表实现,链表内存是散乱的,每 一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢; ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;Vector: 基于数组实现,线程安全的,效率低)。
- Map 接口有三个实现类(HashMap:基于 hash 表的 Map 接口实现,非线程安全, 高效,支持 null 值和 null 键;HashTable:线程安全,低效,不支持 null 值和 null 键; LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序;SortMap 接口:TreeMap, 能够把它保存的记录根据键排序,默认是键值的升序排序)。
- Set 接口有两个实现类(HashSet:底层是由 HashMap 实现,不允许集合中有重复 的值,使用该方式时需要重写 equals()和 hashCode()方法;LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp)。