Java集合中常见类及方法
集合: 用来存储数据的集合。
数组和集合的区别
数组:
- 存储相同数据类型的有序集合,存储的数据是相同类型的 。
- 数组存储数据时 需要指定当前数组的长度而且长度不可变 (定长)
需求:使用数组存储学生信息 效率变低,使用数组存储每天的新闻信息。
由于在大多数的应用场景中,数据都是动态的,导致数组存储要么浪费空间,要么浪费效率。
集合:
java提供了一套功能强大的集合框架,来帮助存储数据信息。提供了很多集合对象存储数据信息,用来在不同的需求场景使用。
本质上而言 其实不同的集合对象底层存储实现方案不同,不同的存储结构,适用不同的需求。
集合中的三个知识点
泛型
jdk1.5之后的新特性, 数据类型
- 什么是泛型?
广泛的类型,也是一种数据类型,而这种数据类型可以是任意类型,编写过程当中不能确定该类型,创建对象时可以指定泛型的具体类型。 - 泛型是编译期行为,只能在编译器有效如果能够跨过编译期,那么泛型就没有任何意义。
泛型类
- 如何定义泛型类
在类后加<> 括号中编写任意长度任意字符 不能是数值
一般情况下我们通过大写的26个字母去声明当前泛型 T type E element - 使用:
jdk1.7之后支持泛型的类型推断
泛型类<具体类型> 变量名 = new 泛型类<>();
泛型接口
-
实现类实现泛型接口时不指定泛型类型 此时创建实现类对象是可以指定泛型类型
class UserServiceImpl implements UserService
-
实现类实现泛型接口时指定泛型类型 那么将确定泛型类型
class UserServiceImpl implements UserService
泛型方法
- 方法中使用泛型 该方法就是一个泛型方法
- 静态方法无法使用泛型类中声明的泛型类型 因为泛型类型的确定是创建对象时确定的
- 而静态方法是先于对象存在的 ,如果要使用,在当前静态方法上声明泛型类型
- public static <泛型类型> vaid 方法名()
迭代器
- Iterable 是java.lang包下的接口,实现该接口的都能够作为foreach的目标
- Iterator 是java.util包下的接口,该迭代器用来迭代当前集合对象的
- Iterator 是一个接口 ,ArrayList中通过内部类完成了对于该接口的实现,获取的其实是实现类对象
- ListIterator 是一个接口 这个接口可以支持并发修改,内部提供了add set remove方法
- 如果对于一个List集合对象要通过使用迭代器做修改(删除、添加、修改)那么请使用ListIterator
比较器:
外部比较器:
- java.util.Compartor接口指定的。
- 如果要使用外部比较器,就必须实现该接口,重写compare方法
- 自定义排序规则,可以随着业务扩展随时变化的
内部比较器
- java.lang.Comparable接口指定
- 如果要使用内部比较器,就需要实现该接口,重写compareTo方法
- 不利于后期扩展
常见接口
Collection
定义:
public interface Collection extends Iterable
无序的,可重复的
常用方法
返回值类型 | 方法 | 说明 |
---|---|---|
boolean | add(E e) | 将元素加入集合中,加入成功返回true |
boolean | addAll(Collection c) | 将一个集合加入到集合中,加入成功返回true |
boolean | remove(Object o) | 删除指定元素,删除成功返回true |
boolean | removeAll(Collection c) | 删除指定集合中包含的所有此集合的元素,删除成功返回true |
void | clear() | 从集合中删除所有元素 |
boolean | retainAll(Collection c) | 保留此集合中包含在指定集合中的元素,删除成功返回true |
int | size() | 返回此集合中的元素个数 |
boolean | isEmpty() | 如果此集合不包含元素,则返回true |
boolean | contains(Object o) | 如果此集合包含指定的元素,则返回true |
boolean | containsAll(Collection c) | 如果此集合包含指定集合中的所有元素,则返回true |
Iterator | iterator() | 返回此集合中元素的迭代器 |
迭代方法:
foreach 迭代器
List
定义:
public interface List extends Collection
有序,可重复,可以是null值
常用方法
返回值类型 | 方法 | 说明 |
---|---|---|
void | add(int index,E element) | 将指定元素插入值列表中的指定位置 |
boolean | add(E e) | 将指定的元素追加到此列表的末尾 |
boolean | addAll(Collection c) | 将指定集合中的所有元素附加到此列表的末尾 |
boolean | addAll(int index,Collection c) | 将指定集合中的所有元素插入到此列表的指定位置 |
E ,boolean | remove( int index),remove(Object o) | 删除该列表中指定的元素。从列表中删除第一个出现的指定元素(如果存在) |
void | clear() | 从此列表中删除所有元素 |
boolean | removeAll(Collection c) | 从此列表中删除包含在指定集合中的所有元素 |
boolean | retainAll(Collection c) | 仅保留此列表中包含在指定集合中的元素 |
E | set(int index,E element) | 用指定的元素替换此列表中指定位置的元素 |
int | indexOf(Object o) | 返回此列表中指定元素第一次出现的索引,如果此列表不包含元素,则返回-1。 |
int | lastIndexOf(Object o) | 返回此列表中指定元素最后一次出现的索引,如果此列表不包含元素,则返回-1。 |
List | subList(int fromIndex,int toIndex) | 返回此列表中指定区间的元素组成的列表 |
boolean | isEmpty() | 如果此列表不包含元素,则返回true 。 |
E | get(int index) | 返回此列表中指定位置的元素。 |
int | size() | 返回此列表中的元素数。 |
boolean | contains(Object obj) | 如果此列表包含指定的元素,则返回true。 |
boolean | contaisAll(Collection c) | 如果此列表包含指定集合的所有元素,则返回true。 |
迭代方式:
普通for循环,foreach,迭代器(iterator[不能支持并发修改] listIterator[支持并发修改])
Set
定义:
public interface Set extends Collection
无序,唯一的
常见方法
返回值类型 | 方法 | 说明 |
---|---|---|
boolean | add(E e) | 如果指定的元素不存在,则将其指定的元素添加 |
void | clear() | 从此集合中删除所有元素(可选操作)。 |
boolean | remove(Object o) | 如果存在,则从该集合中删除指定的元素(可选操作)。 |
boolean | addAll(Collection c) | 将指定集合中的所有元素添加到此集合(如果尚未存在)。 |
boolean | removeAll(Collection c) | 从此集合中删除指定集合中包含的所有元素(可选操作)。 |
boolean | retainAll(Collection c) | 仅保留该集合中包含在指定集合中的元素(可选操作)。 |
int | size() | 返回此集合中的元素数。 |
boolean | isEmpty() | 如果此集合不包含元素,则返回true。 |
boolean | contains(Object o) | 如果此集合包含指定的元素,则返回true 。 |
boolean | containsAll(Collection c) | 如果此集合包含指定集合的所有元素,则返回true |
Iterator | iterator() | 返回此集合中元素的迭代器。 |
迭代方法:
foreach,迭代器
Map
定义:
public interface Map<K,V>
数据: k-v 键值的方式存储 k:唯一 无序 (set) v :无序可重复 (collection)
常见方法
返回值类型 | 方法 | 说明 |
---|---|---|
V | put(K key,V value) | 将键值对加入到集合中。 |
V | get(Object key) | 返回到指定键所映射的值,或 null. |
boolean | containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true。 |
Set | keySet() | 返回此集合中包含的所有键,组成的一个set集合。 |
V | remove(Object key) | 如果存在该键,则从该集合中删除该键和所对应的值 |
int | size() | 返回此集合中键值映射的数量。 |
boolean | containsValue(Object value) | 如果此集合将一个或多个键映射到指定的值,则返回true 。 |
Collection | values() | 返回此集合中包含的值所组成的Collection集合。 |
迭代方式:
-
获取键 迭代键的过程中通过get方法获取值
for(Object key:keySet()){
sout(k+"="+map.get(k));
} -
获取Entry对象,通过getKey和getValue获取键和值
//获取entry对象
Set<Entry<String, String>> kvs = mps.entrySet();// 返回一个set集合 该集合中的每个元素都是entry对象
// 实际是 HashSet中的Node对象 因为Node实现了Map中的Entry接口
for(Entry<String, String> entry:kvs) {
System.out.println(entry.getKey()+"==="+entry.getValue());
}
常用类
ArrayList
定义:
public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
底层数据结构:
动态数组,ArrayList源码中是通过elementDate数组来存储的,elementDate是一个Object[]类型的数组,size则是动态数组实际的大小,数组的扩容按照每次扩容2倍。
优缺点分析:
通过索引获取元素以及迭代元素比较快 但是添加、删除很慢。
常见方法: 和List一致
迭代方式: 和List一致
LinkedList
定义:
public class LinkedList
extends AbstractSequentialList
implements List, Deque, Cloneable, Serializable
底层数据结构:
双向链表
优缺点分析: 添加、删除快 获取元素慢
常见方法
和List一样,多了一些头尾操作
返回值类型 | 方法 | 说明 |
---|---|---|
E | getFirst() | 返回此列表中的第一个元素 |
E | getLast() | 返回此列表中的最后一个元素 |
E | element() | 检索但不删除此列表的头(第一个元素),element(),如果链表为空,则抛异常。 |
E | peek() | 检索但不删除此列表的头(第一个元素), peek(),如果链表为空,则返回null |
E | peekFirst() | 检索但不删除此列表的第一个元素,如果此列表为空,则返回 null 。 |
E | peekLast() | 检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null 。 |
E | poll() | 检索并删除此列表的头(第一个元素)。 |
E | pollFirst() | 检索并删除此列表的第一个元素,如果此列表为空,则返回 null 。 |
E | pollLast() | 检索并删除此列表的最后一个元素,如果此列表为空,则返回 null 。 |
E | removeFirst() | 从此列表中删除并返回第一个元素。 |
E | removeLast() | 从此列表中删除并返回最后一个元素。 |
boolean | offer(E e) | 将指定的元素添加为此列表的尾部(最后一个元素)。 |
boolean | offerFirst(E e) | 在此列表的前面插入指定的元素。 |
boolean | offerLast(E e) | 在该列表的末尾插入指定的元素。 |
void | addFirst(E e) | 在该列表开头插入指定的元素。 |
void | addLast(E e) | 将指定的元素追加到此列表的末尾。 |
迭代方式:
普通for循环,foreach,迭代器
Vector
定义:
public class Vector
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
底层数据结构:
数组 以1.5倍扩容
优缺点:
线程安全 速度慢 安全
HashSet
定义:
public class HashSet
extends AbstractSet
implements Set, Cloneable, Serializable
底层数据结构:
数组+链表
优缺点分析:
添加、删除、修改效率都很高
常见方法
返回值类型 | 方法 | 说明 |
---|---|---|
boolean | add(E e) | 将指定的元素添加到此集合(如果尚未存在)。 |
void | clear() | 从此集合中删除所有元素。 |
boolean | remove(Object o) | 如果存在,则从该集合中删除指定的元素。 |
int | size() | 返回此集合中的元素数(其基数)。 |
boolean | isEmpty() | 如果此集合不包含元素,则返回 true 。 |
Iterator | iterator() | 返回此集合中元素的迭代器。 |
迭代方法:
foreach、迭代器
注意事项:
hashset存储自定义对象时一定要重写hashcode和equals方法。
TreeSet
定义:
public class TreeSet
extends AbstractSet
implements NavigableSet, Cloneable, Serializable
底层数据结构:
树 红黑树 / 二叉树 / 平衡树
优缺点分析:
- 维护数据的大小 (有序) ,添加速度和删除速度高于ArrayList 比其他的都低
- 查询速度高于List 低于Hash。
- 如果对于存储的数据有 排序的要求,那么首选TreeSet。
常见方法:
返回值类型 | 方法 | 说明 |
---|---|---|
E | first() | 返回此集合中当前的第一个(最低)元素。 |
E | last() | 返回此集合中当前的最后(最高)元素。 |
E | floor(E e) | 返回此集合中小于或等于给定元素的最大的元素,如果没有这样的元素,则返回null。 |
E | ceiling(E e) | 返回此集合大于或等于给定元素中的最小元素,如果没有此元素,则返回 null。 |
E | higher(E e) | 返回严格大于给定元素的该集合中的最小元素,如果没有此元素则返回 null。 |
E | lower(E e) | 返回这个集合中最大的元素严格小于给定的元素,如果没有这样的元素,则返回 null 。 |
迭代方法:
foreach、迭代器
注意事项:
如果存储的元素需要按照指定的需求进行排序,创建TreeSet对象时 指定比较器。
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeSet对象是 指定外部比较器Comparetor接口 重写compare方法
set中每个元素存储的时候 都是存储在一个map集合中 map集合的键是set中的元素, map中的值是自动添加的一个默认值
HashMap
定义:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
底层数结构:
数组+链表
常用方法:
返回值类型 | 方法 | 说明 |
---|---|---|
void | clear() | 从这个集合中删除所有的映射。 |
boolean | containsKey(Object o) | 如果此映射包含指定键的映射,则返回 true |
boolean | containsValue(Object o) | 如果此集合将一个或多个键映射到指定值,则返回 true 。 |
Set | entrySet() | 返回此集合中包含的映射的Set视图。 |
V | get(Object key) | 返回到指定键所映射的值,或 null如果此映射包含该键的映射。 |
Set | keySet() | 返回此集合中包含的键的Set视图。 |
V | put(K key,V value) | 将指定的值与此映射中的指定键相关联。 |
void | putAll(Map m) | 将指定集合的所有映射复制到此地图。 |
V | replace(K key,V value) | 只有当目标映射到某个值时,才能替换指定键的条目。 |
Collection | values() | 返回此集合中包含的值的Collection视图。 |
优缺点分析:
添加、删除、修改效率都很高
注意事项:
存储自定义对象作为键时 要保证当前自定义类重写hashcode和equals方法
什么情况下要重写,当前两个对象的属性相同 我们觉得是同一个对象 此时要重写。
TreeMap
定义:
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
底层数据结构:
红黑树
常用方法:
返回值类型 | 方法 | 说明 |
---|---|---|
Map.Entry | ceilingEntry(K key) | 返回与大于或等于给定键的最小键相关联的键值映射,如果没有此键,则 null。 |
K | ceilingKey(K key) | 返回大于或等于给定键的键值,如果没有此键,则返回 null 。 |
Comparator | comparator() | 返回用于此集合中的键的比较器,或null |
boolean | containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true 。 |
boolean | containsValue(Object value) | 如果此集合将一个或多个键映射到指定值,则返回 true。 |
Set | entrySet() | 返回此地图中包含的映射的Set视图。 |
Map.Entry | floorEntry(K key) | 返回与小于或等于给定键的最大键相关联的键值映射,如果没有此键,则 null 。 |
K | floorKey(K key) | 返回小于或等于给定键的最大键,如果没有这样的键,则返回 null。 |
V | get(Object key) | 返回到指定键所映射的值,或 null如果此映射包含该键的映射。 |
Set | keySet() | 返回此地图中包含的键的[Set视图。 |
Collection | values() | 返回此地图中包含的值的Collection视图。 |
优缺点分析:
- 维护数据的大小 (有序) ,添加速度和删除速度高于ArrayList 比其他的都低
- 查询速度高于List 低于Hash。
- 如果对于存储的数据有 排序的要求,那么首选TreeMap。
- 如果存储的元素需要按照指定的需求进行排序,创建TreeMap对象时 指定比较器。
注意事项:
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeMap对象是 指定外部比较器Comparetor接口 重写compare方法
常用类对比表
类型 | 内部结构 | 顺序遍历速度 | 随机遍历速度 | 追加速度 | 插入速度 | 删除速度 | 占用内存 | 线程安全 | 迭代方式 |
---|---|---|---|---|---|---|---|---|---|
ArratList | 动态数组 | 高 | 高 | 高 | 低 | 低 | 低 | 不安全 | 普通for,foreash,迭代器 |
LikedList | 双向链表 | 中 | 不支持 | 高 | 高 | 高 | 中 | 不安全 | 普通for,foreash,迭代器 |
vector | 动态数组 | 低 | 低 | 低 | 低 | 低 | 低 | 线程安全 | ListIterator和iterator两种迭代方式,elements方法 |
HashSet | 数组+链表 | 高 | 高 | 高 | 高 | 不安全 | froeash,迭代器 | ||
TreeSet | 红黑树 | 中 | 中 | 中 | 中 | 中 | 不安全 | froeash,迭代器 | |
HashMap | 数组+链表 | 高 | 高 | 高 | 高 | 不安全 | froeash,迭代器 | ||
TreeSet | 红黑树 | 中 | 中 | 中 | 中 | 中 | 不安全 | froeash,迭代器 |