Java集合框架:List、Set、Map的理解
1、集合与数组的区别
数组:长度固定,存储内容可以是基本数据类型,只能存储同一种类型
集合:长度可变,存储能容必须数引用类型(对象),存储类型可以不同。
2、常用集合的分类
Collection:存储单值的最大操作根接口
- List接口:可重复,元素按插入顺序保存
- ArrayList:List接口的实现类,数据结构由数组实现,对增删慢,查找快
- LinkedList:List接口的实现类,数据结构由链表实现,对增删快,查找慢
- Vector:List接口的实现类,数据结构由数组实现,对增删慢,查找快
- Set接口:唯一,元素插入与取出顺序不一致
- HashSet:Set接口的实现类,散列存储元素,无序存储
- TreeSet:Set接口的实现类,二叉树存储元素,允许对元素排序
Map:存储多值(Key-Value键值对)的操作接口
- HashMap:异步,线程不安全,效率高
- HashTable:同步,线程安全,效率低
- ConcurrentHashMap:采用了分段锁机制,保证线程安全,效率较高
- TreeMap:对key使用红黑树排序
3、Collection
Collection:存储单值的最大操作根接口,JDK中不提供collection的直接实现,只提供继承于collection的子接口,常用的两个有:List(允许重复)、Set(不允许重复)
Collectoin接口的方法
方法 | 描述 |
---|---|
boolean add(E e) | 在集合尾添加一个元素 |
boolean addAll(Collection<? extends E> c) | 在集合添加一组元素c |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否包含此元素 |
boolean contains(Collection<?> c) | 判断集合中是否包含一组元素c |
boolean isEmpty() | 判断集合是否为空 |
Iterator iterator() | 实例化Iterator接口,返回集合元素的迭代器 |
boolean remove(Object o) | 从集合中删除一个元素 |
boolean removeAll(Collection<?> c) | 从集合中删除一组元素c |
boolean retainAll(Collection<?> c) | 判断是否没有指定集合 |
int size() | 求集合中元素的个数 |
Object[] toArray() | 返回一个包含集合所有元素的数组 |
T[] toArray(T[] a) | 返回一个包含集合所有元素的指定泛型的数组 |
boolean equals(Object o) | 比较collection与指定对象是否相等 |
int hashCode() | 返回此collection的哈希码值 |
3.1、List
List:继承自Collection接口的子接口,元素存取顺序一致,元素可以重复,List有三个常用实现类:ArrayList、Vector、LinkedList。
List的对Collection的扩充方法
方法 | 描述 |
---|---|
void add(int index, E element) | 在指定位置插入指定元素 |
void add(int index, Collection<? extends E> e) | 在指定位置插入一组元素 |
E get(int index) | 根据索引返回元素 |
int indexOf(Object o) | 根据对象查找位置,找不到返回-1 |
int lastIndexOf(Object o) | 从后向前查找位置,找不到返回-1 |
ListIterator listIterator() | 返回ListIterator接口实例 |
ListIterator listIterator(int index) | 返回从指定位置的ListIterator的接口实例 |
E remove(int index) | 删除指定位置的元素 |
E set(int index, E element) | 修改指定位置的元素 |
List subList(int formIndex, int toIndex) | 返回指定位置的子集合 |
3.1.1、List接口的常用实现类
-
ArrayList:数据结构由数组实现,对增删慢,查找快,线程不安全,效率高。最常用
-
LinkedList:数据结构由链表实现,对增删快,查找慢,线程不安全,效率高
扩充方法
方法 描述 void addFirst(E e) 在首部添加一个元素 void addLast(E e) 在尾部添加一个元素 E getFirst() 从首部获取一个元素 E getLast() 从尾部获取一个元素 E removeFirst() 删除并返回第一个元素 E removeLast() 删除并返回最后一个元素 -
Vector:数据结构由数组实现,对增删慢,查找快,线程安全,效率低
Vector与ArrayList的区别
区别点 | ArrayList | Vector |
---|---|---|
出现时间 | JDK1.2之后 | JDK1.0 |
性能 | 效率较高,异步处理,线程不安全 | 效率较低,同步处理,线程安全 |
输入 | Iterator、ListIterator | Iterator、ListIterator以及Enumeration |
3.1.2、List输出
-
Iterator:遍历集合中的所有元素,用于迭代访问集合中的元素的接口
方法 描述 boolean hasNext() 是否有下一个元素 E next() 取出内容 void remove() 删除当前内容 在进行迭代输出的时候如果要想删除当前元素,则只能使用 Iterator接口中的 remove()方法,而不能使用集合中的 remove()方法。
-
ListIterator:是Iterator的子接口,专门用于输出List中的内容。
-
foreach输出:可以输出数组或集合的内容
-
for循环
3.2、Set
Set:继承自Collection接口的子接口,元素插入与取出顺序不一致,与List接口最大的不同在于Set接口的内容不允许重复,Set接口中有两个常用实现类:HashSet、TreeSet
Set具有与Collection完全一样的接口,不具备扩充方法
3.2.1、Set接口的常用实现类
- HashSet:散列存储元素,无序存储,线程不安全,效率高。
- 对于元素的唯一性,需要重写hashCode()和equals()方法来保证
- TreeSet:二叉树存储元素,允许对元素排序
- 使用TreeSet存储自定义对象,需定义的类中实现Comparable接口
- 同样需要重写hashCode()和equals()方法
3.2.2、Set输出
- Iterator:迭代输出
- foreach输出
3.3 List与Set总结
- List与Set都是继承自Collection的子接口
- List允许重复元素。Set不允许重复元素,插入重复元素时,存入的是最新的元素
- List存入与取出顺序一致,Set存取顺序不一致
- List相比Set查找效率高,增删效率低,Set查找效率低,增删效率高
- Set使用Iterator与foreach迭代,List出了可以使用以上两个方式外,还可以使用ListIterator与for循环迭代
4、Map
此接口与Collectoin接口没有任何关系,是第二大集合操作接口
Map:存储多值(Key-Value键值对)的操作接口,每个Key映射一个Value,其中Key不允许重复,而Value允许重复
map的常用方法
方法 | 描述 |
---|---|
void clear() | 清空Map中的内容 |
boolean containsKey(Object key) | 判断Map中是否存在指定key |
boolean containsValue(Object value) | 判断Map中是否存在指定value |
Set<Map.Entry<K,V>> entrySet() | 将Map接口变为Set集合 |
V get(Object key) | 根据key找到对应的value |
boolean isEmpty() | 判断Map是否为空 |
Set keySet() | 将全部key变为Set集合 |
Collection values() | 将全部value变为Collection集合 |
V put(K key, V value) | 向集合中增加内容 |
void putAll(Map<? extends K, ? extends V> m) | 增加一组集合 |
V remove (Object key) | 根据可以删除内容 |
4.1、Map接口的常用实现类
-
HashMap:异步,线程不安全,效率高
- HashMap可以指定初始容量和负载因子
- 允许存入空值,但key最多只能有一个值为空
-
HashTable:同步,线程安全,效率低
- 不允许存入空值
- HashMap与HashTable的区别:
区别点 HashMap HashTable 出现时间 JDK1.2之后 JDK1.0 性能 异步处理,性能高 同步处理,性能低 空值 允许存入空值,但key最多只能有一个值为空 不允许存入空值 -
ConcurrentHashMap:采用了分段锁机制,保证线程安全,效率较高
-
TreeMap:对key使用红黑树排序
- 使用TreeMap存储自定义对象,需定义的类中实现Comparable接口
4.2、Map输出
- 使用Map 接口中的 entrySet()方法将Map 接口的全部内容变为 Set 集合
- 使用 Set 接口中定义的 iterator()方法为 Iterator 接口进行实例化
- 之后使用 Iterator 接口进行迭代输出,每一次的迭代都可以取得一个Map.Entry 的实例
- 通过Map.Entry 进行 key 和 value 的分离