Java集合篇
Java集合体系框架
Java 集合框架主要包括两种类型的容器,一种是Collection(单列集合),另一种是Map(双列集合),存储键/值对映射。Collection 接口又有 3 种子类型,List、 Set 和 Queue,再下面是一些抽象类,最后是具体实现类,如 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等。
Collection集合
Collection集合架构:
Collection集合是单例集合的顶层接口,JDK提供啦更具体的三个子接口:
- List:有序集合(元素存入集合的顺序和取出的顺序一致),元素可以重复可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
- Set:无序集合(存入和取出顺序有可能不一致),不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
- Queue/Deque:是 Java 提供的标准队列结构的实现,除了集合的基本功能,它还支持类似先入先出(FIFO, First-in-First-Out)或者后入先出(LIFO,Last-In-First-Out)等特定行为。常用实现类有ArrayDeque、ArrayBlockingQueue、LinkedBlockingDeque
Collection集合的常用方法:
boolean add(E e)
boolean addAll(Collection<? extends E>)
boolean remove(Object o)
boolean removeIf(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
iterator()
toArray()
toArray(T[])
List集合
List集合特点:元素有放入顺序,元素可重复,支持索引。可以使用迭代器、增强for、普通for循环遍历
List集合特有方法:
void add(int index,E element) //在此集合中的指定位置插入指定的元素
E remove(int index) //删除指定索引处的元素,返回被删除的元素
E set(int index,E element) //修改指定索引处的元素,返回被修改的元素
E get(int index) //返回指定索引处的元素
ArrayList
- 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
特有方法:
public boolean add(要添加的元素) //将指定的元素追加到此集合的末尾
public boolean remove(要删除的元素) //删除指定元素,返回值表示是否删除成功
public E remove(int index) // 删除指定索引处的元素,返回被删除的元素
public E set(int index,E element) //修改指定索引处的元素,返回被修改的元素
public E get(int index) //返回指定索引处的元素
public int size()
LinkedList
- 底层数据结构是双向链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
特有方法:
public void addFirst(E e) //在该列表开头插入指定的元素
public void addLast(E e) //将指定的元素追加到此列表的末尾
public E getFirst() //返回此列表中的第一个元素
public E getLast() //返回此列表中的最后一个元素
public E removeFirst() //从此列表中删除并返回第一个元素
public E removeLast() //从此列表中删除并返回最后一个元素
Vector
- 底层数据结构是数组,查询快,增删慢,方法被synchronized修饰线程安全,效率低,可以存储重复元素
List集合遍历方式
- 普通遍历:for(int i=0; i< arrays.size(); i++)
- 增强for遍历:for(String str : arrays)
- list.forEach((str) -> xxxxx)
- 使用Iterator迭代器遍历
Set集合
Set集合特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉。(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法)。Set无序,不支持索引,所以只能使用迭代器、增强for遍历
TreeSet
- TreeSet底层是二叉树来实现
- 依赖hashCode方法和equals方法保证键的唯一
- 根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法
HashSet
- HashSet底层是哈希表(HashMap)实现,元素不可重复且无序,线程不安全
- HashSet是为了优化查询速度而设计的Set,允许存放null值。
- 元素需要重写hashCode方法和equals方法保证键的唯一
LinkedHashSet
- 底层数据结构采用链表和哈希表共同实现,元素顺序与存储顺序一致
- 元素不可重复,可以存储null值,线程不安全,效率高
set集合遍历方式
- 增强for遍历:for(String str : arrays)
- set.forEach((str) -> xxxxx)
- 使用Iterator迭代器遍历
- 使用toArray(),转换成一个数组,对数组进行遍历
Map集合架构
Map集合架构:
Map集合常用方法:
V put(K key,V value) //添加元素
V remove(Object key) //根据键删除键值对元素
void clear() //移除所有的键值对元素
boolean containsKey(Object key) //断集合是否包含指定的键
boolean containsValue(Object value) //判断集合是否包含指定的值
boolean isEmpty() //判断集合是否为空
int size() //集合的长度,也就是集合中键值对的个数
V get(Object key) //根据键获取值
Set keySet() //获取所有键的集合
Collection values() //获取所有值的集合
Set<Map.Entry<K,V>> entrySet() //获取所有键值对对象的集合
HashMap
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键要存储的是自定义对象,需要重写hashCode和equals方法
HashTable
- Hashtable 使用方法基本上和 HashMap 一样
- Hashtable 的键和值都不能为 null,否则会抛出NullPointerException
- Hashtable 是线程安全的(synchronized)
TreeMap
- TreeMap底层是红黑树结构
- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则总结:
Map集合遍历
方式一:键找值
// 1、获取Map集合的全部键
Set<String> keys = map.keySet();
// 2、遍历全部的键,根据键获取其对应的值
for (String key : keys) {
// 根据键获取对应的值
double value = map.get(key);
System.out.println(key + "=====>" + value);
}
方式二:键值对
// 1、调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合
Set<Map.Entry<String, Double>> entries = map.entrySet();
for (Map.Entry<String, Double> entry : entries) {
String key = entry.getKey();
double value = entry.getValue();
System.out.println(key + "---->" + value);
}
方式三:forEach
//遍历map集合,传递Lambda表达式
map.forEach(( k, v) -> {
System.out.println(k + "---->" + v);
});
总结:
在开发中,集合类型选择:
1)先判断存储的类型(一组对象或一组键值对)
2) 一组对象:Collection接口
允许重复:List
增删多:LinkedList
改查多:Arraylist
不允许重复: Set
无序:Hashset
排序:TreeSet
插入和取出顺序一致:LinkedHashSet
3) 一组键值对:Map接口
键无序:HashMap
键排序:TreeMap
鍵插入和取出順序一致: LinkedHashMap
读取文件 Properties
Collections工具类
Collections 是 JDK 提供的一个工具类,位于 java.util 包下,提供了一系列的静态方法,方便我们对集合进行各种操作。
1.排序操作
reverse(List list)
:反转顺序shuffle(List list)
:洗牌,将顺序打乱sort(List list)
:自然升序sort(List list, Comparator c)
:按照自定义的比较器排序swap(List list, int i, int j)
:将 i 和 j 位置的元素交换位置
2.查找操作
binarySearch(List list, Object key)
:二分查找法,前提是 List 已经排序过了max(Collection coll)
:返回最大元素max(Collection coll, Comparator comp)
:根据自定义比较器,返回最大元素min(Collection coll)
:返回最小元素min(Collection coll, Comparator comp)
:根据自定义比较器,返回最小元素fill(List list, Object obj)
:使用指定对象填充frequency(Collection c, Object o)
:返回指定对象出现的次数
3.同步控制:Collections 工具类中提供了多个 synchronizedXxx 方法,这些方法会返回一个同步的对象,从而解决多线程中访问集合时的安全问题。
4.不可变集合
emptyXxx()
:制造一个空的不可变集合singletonXxx()
:制造一个只有一个元素的不可变集合unmodifiableXxx()
:为指定集合制作一个不可变集合