集合学习体系结构图
Collection常用方法
boolean add(E e) 添加元素
boolean remove(Object o) 从集合中移除指定的元素
void clear() 清空集合中的元素
boolean contains(Object o) 判断集合中是否存在指定的元素
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中元素的个数
Collection集合遍历方式
- 迭代器遍历
- 增强for循环
- 普通for循环
List集合特有方法
- 首先声明,List集合是基于Collection集合构建的,所以Collection中的方法List中也有。
- 特有方法
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
并发修改异常(就是在List集合使用迭代器遍历过程中,对集合进行了操作)
ConcurrentModificationException
- 当出现该问题时,可以使用列表迭代器ListIterator
- 可调用该列表迭代器中的add,set等方法
LinkedList集合的特有功能
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
Set集合特点
- 元素存取无序
- 没有索引
- 循环遍历只能通过迭代器或增强for
- 不能存取重复的元素
哈希值
- 什么是哈希值?哈希值是JDK根据对象的地址或者字符串数字算出来的int类型数值
- 如何获取哈希值?Object中hashCode()
HashSet集合特点
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以是不包含重复元素的集合
HashSet集合保证元素唯一性源码分析
- 根据对象的哈希值计算存储位置
如果当前位置没有元素则直接存入
如果当前位置有元素存在,则进入第二步 - 当前元素的元素和已经存在的元素比较哈希值
如果哈希值不同,则将当前元素进行存储
如果哈希值相同,则进入第三步 - 通过equals()方法比较两个元素的内容
如果内容不相同,则将当前元素进行存储
如果内容相同,则不存储当前元素
LikedHashSet集合
- 由哈希表和链表实现的Set接口
- 链表保证元素有序、哈希表保证元素唯一
TreeSet
- 对于TreeSet而言具有两种构造方法
TreeSet():根据元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序 - 除了构造方法中采用匿名内部类的方式指定比较规则,还可以将目标类实现Comparable<>,重写CompareTo()方法
泛型
-
是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型
-
泛型类:修饰符 class 类名<类型> { }
-
泛型方法:修饰符<类型> 返回值类型 方法名(类型 变量名){ }
-
泛型接口:修饰符 interface 接口名<类型> { }
-
类型通配符
类型通配符:<?>
List<?>:表示元素类型未知的List,它的元素可以匹配任何的类型
这种带通配符的List仅表示 它是各种泛型List的父类,并不能把元素添加到其中类型通配符上限:<? extends 类型>
List<? extends Number>:它表示的类型是Number或者其子类型类型通配符下限:<? super Number>:它表示的类型是Number或者其父类型
Map集合概述和特点
- interface Map<K, V> K:键的类型;V:值的类型
- 特点:键值对映射关系
一个键对应一个值
键不能重复,值可以重复
元素存取无序 - 方法介绍
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
- Map集合的获取功能
方法名 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set keySet() | 获取所有键的集合 |
Collection values() | 获取所有值的集合 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
- Map集合的遍历(方式1)
步骤分析:
获取所有键的集合。用keySet()方法实现
遍历键的集合,获取到每一个键。用增强for实现
根据键去找值。用get(Object key)方法实现 - Map集合的遍历(方式2)
步骤分析:
获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
遍历键值对对象的集合,得到每一个键值对对象
用增强for实现,得到每一个Map.Entry
根据键值对对象获取键和值
用getKey()得到键
用getValue()得到值
Collections集合工具类
- Collections常用方法
方法名 | 说明 |
---|---|
public static void sort(List list) | 将指定的列表按升序排序 |
public static void reverse(List<?> list) | 反转指定列表中元素的顺序 |
public static void shuffle(List<?> list) | 使用默认的随机源随机排列指定的列表 |