Java集合
Java中的集合类主要有三种,List(列表)、Set(集)、Map(映射)
关系
Collection接口
最基本的集合接口,没有直接继承Collection的类,都是继承Collection的子接口,如List、Set
-
实现Collection的接口都有两个标准的构造函数,一个无参的构造函数,创建一个空的集合,一个有参构造函数,创建一个存放参数的集合。
-
Collection的接口中有一个Iterator()方法,返回一个迭代器。我们可以操作这个迭代器足个访问集合中的元素。(Iterator it = collection.iterator();)迭代器
-
Collection是所有单列集合的父接口,在Collection接口中,定义了单列集合通用的一些方法,这些方法可以操作所有的单列集合。
返回值 方法名 说明 boolean add(E e) 把指定对象添加到集合 boolean addAll(Collection<?extends E> c) 把指定集合所有的元素添加到此集合中 void clear() 清空集合 boolean contains(Object o) 此集合中存在指定元素返回true否则false boolean isEmpty() 判断此集合是否为空 boolean remove(Object o) 删除集合中的指定元素(如果存在)(可选操作) int size() 返回此集合中元素的个数 Object[] toArray() 把集合中的元素存入数组中
List集合
List接口
java.util.List接口继承自Collection接口,是单列集合的一个重要分支,可以将实现了List接口的对象称为List集合。
- List集合中的所有元素都是以一种线性方式进行存储的,
- 特点:有序、可重复
List接口作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作的特有方法。
返回值 | 方法名 | 说明 |
---|---|---|
void | add(int index,E element) | 将指定的元素添加到指定的位置上 |
E | get(int index) | 返回指定位置上的元素 |
E | remove(int index) | 删除指定位置上的元素,返回被移除的元素 |
E | set(int index,E element) | 用指定的元素,修改指定位置上的元素,返回更新前的元素 |
-
List接口提供了一个特殊的迭代器,ListIterator,
-
它除了有Iterator接口提供的正常方法外,它还允许元素的插入和替换,以及双向访问,还有提供了一个方法从列表的指定位置开始列表迭代器。
返回值 方法名 说明 void add(E e) 将指定的元素插入列表(可选操作)。 boolean hasPrevious() 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回 true 。 void set(E e) 用指定的元素(可选操作)替换 next()或 previous()返回的最后一个元素。
-
List的实现类
ArrayList
java.util.ArrayList集合数据存储的结构是数组结构,而且是一个动态的数组,数组的容量会随着集合中元素的个数自动扩大或缩小
- 添加到ArrayList集合中的元素,都会有一个整数的序号(索引)从0开始
- 特点:
- 查找元素快,根据索引快速定位
- 增删元素慢,每添加或者删除一个元素,都要把该位置以后的元素的索引进行调整
- 日常开发中使用最多的一个用来查询的集合类
linkedList
java.util.LinkedList集合数据存储的结构是链表结构,是一个双向链表
- 实际开发中一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首操作的方法
- 特点:
- 查找元素慢,查询一个元素需要从第一个元素开始,根据地址依次向后查询
- 增删元素快,增删时只需要修改地址域
Set集合
Set接口
java.util.Set接口同样继承自Collection接口,它与Collection接口中的方法一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了,
- 存入数据时,都会根据一定的规则保证存储的数据不出现重复
- Set集合在数据存储和检索,效率都比较高
- 特点:无序,不可重复
Set的实现类
HashSet
java.util.HashSet存储的数据结构是哈希表,
- 它存储的元素都是不可重复的,并且没有顺序存储。存取时获得的元素顺序不一致
- HashSet底层的实现类其实是一个HashMap
哈希表
JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一个hash值的元素都存储在一个链表里,但是当位于一个链表中的元素较多时(hash值相同的元素较多时),通过key值依次查找的效率较低。在JDK1.8中,哈希表的存储采用了数组+链表+红黑树结构,这样大大减少了查找的时间。
实现过程:
向Set集合中存储元素时,先调用hashCode方法,获得哈希码值,然后将哈希码值通过特定的算法获得一个内存地址,存入地址前,会先查看得到的内存地址中有没有存入元素(一个或者多个),如果有,先调用元素的equals方法进行内容比较,如果内容相同,直接引用已存在的对象,如果内容不同,进行行散列存放
(两个对象相同,哈希码值一定相同,哈希码值相同的对象,也可能是不同对象)
LinkedHashSet
HashSet集合中元素是无序的,如果我们想要Set集合存储的元素有顺序,那么就要用到LinkedHashSet
- java.util.LinkedHashSet可以记录元素存储的顺序
Map集合
Map接口
Map用于保存具有映射关系的数据,总是以键值对的形式出现
和Collection接口没有关系,它也是一个顶级接口
- Map接口存储的数据是双列集合的规则,Map<K,V>K代表键的类型,V代表值的类型
- Map集合中的key和value可以是任何引用类型的数据,
- key和value就是一对一的关系,一个key就可以找到他所对应的唯一value值
- 特点:无序,key不可以重复,value可以重复
- key在底层是使用Set集合存储的,所以说不可重复(如果使用自定义类对象作为键,必须重写hashCode和equals方法)
Map接口中的常用方法(和Collection接口相区别)
返回值 | 方法名 | 说明 |
---|---|---|
V | put(V key,V value) | 将指定的键和值添加到集合 |
V | remove(Object key) | 将指定健的键值对在集合中删除,并返回value |
V | get(Object key) | 获取指定健的value值并返回 |
Set | keyset() | 获取集合中所有的健,放入Set集合并返回 |
Set<Map.Entry<K,V>> | entrySet() | 获取集合中所有键值对放入Set集合并返回 |
entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry 。使用这个方法可以方便我们遍历Map集合中的数据。
Entry
Map接口中的一个内部接口,该类中封装了一个键值对
三个方法:
返回值 | 方法名 | 说明 |
---|---|---|
K | getKey() | 返回该Eentry里包含的key值 |
V | getValue() | 返回该Eentry里包含的value值 |
setValue(V value) | 设置该Eentry里包含的value值 |
public class Test1{
public static void main(String[] args){
Map<Character,Integer> map1 = Map.of('a',100,'b',200,'c',300);
Set<Map.Entry<Character,Integer>> set1 = map1.entrySet();
for (Map.Entry<Character,Integer> entry: set1){
System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
//遍历过程中也可以修改Map中的值
// entry.setValue(10);
}
}
}
Map的实现类
HashMap
Map接口的一个实现类
- 存储数据采用的是哈希表结构,元素的顺序不能保证
LinkedHashMap
继承自HashMap
- HashMap中存储的与元素无序,但是还想使用HashMap的查询速度快,还想保证添加的元素有顺序,我们使用LinkedHashMap就可以做到