集合类
框架分类:根据存储数据的特点
单列集合
Collection接口
双列集合
Map接口
Collection
单列集合的根接口
常用方法
* `public boolean add(E e)`: 把给定的对象添加到当前集合中 。
* `public void clear()` :清空集合中所有的元素。
* `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
* `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
* `public boolean isEmpty()`: 判断当前集合是否为空。
* `public int size()`: 返回集合中元素的个数。
* `public Object[] toArray()`: 把集合中的元素,存储到数组中。
迭代器
获取对象的方式
Iterator<E> iterator() 返回迭代器对象Iterator
迭代器提供的常用方法
boolean hasNext() 问一问容器中还有没有元素
E next() 获取到下一个元素
remove() 移除当前元素
迭代器的原理
第一步:先问一问容器中有没有可以获取的元素
第二步: 如果有,将指针移动至下一个元素,并返回该元素的值;如果没有,循环结束
增强for循环
注意事项
a.容器---集合或数组
b.使用增强for循环遍历元素时,不能删除元素【remove】 -----否则抛出异常 java.util.ConcurrentModificationException
c.如果需要再遍历的同时删除元素,需要使用迭代器方式进行【remove()】
增强for循环的底层使用的是迭代器!
泛型
什么是泛型?为什么使用泛型?使用泛型有什么好处?
要限制数据的类型,如果数据类型不一致,提前在编译器进行错误提示,避免在运行期出现异常
使用场景
在类上使用
public class 类名 <E>
在方法上使用
a. 类已经添加了泛型,方法参数可以直接使用
b. 类未添加泛型,方法参数如果使用,需要在方法的返回值前添加泛型
在接口上使用
a.接口的实现类确定泛型的类型
b.接口的实现类继续使用泛型,实现类在创建对象时在进行泛型类型的确定
泛型通配符
通配符: ?
通配符 受限泛型
? extends Number 该类型应是 指定类型或其子类 ==》上限
? super Number 该类型应是 指定类型或其父类 ==> 下限
数据结构
常见的数据结构:
栈、队列、数组、链表、红黑树
栈特点:进口及出口同一个,先进后出
队列特点:进口与出口不同,先进先出
数组特点:开辟一块连续的空间进行数据的存储,有下标 查询效率高,添加元素 删除元素效率低
链表特点:查询效率低,添加及删除效率高
list集合
特点:
1.有序排列(存入与取出的顺序相同)2.可以存放重复的元素
接口常用方法
- `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
- `public E get(int index)`:返回集合中指定位置的元素。
- `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
- `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
ArrayList集合与LinkedList集合
ArrayList集合
特点:
实现了List接口,List接口继承Collection
所以也是有序可重复的
底层:数组【Object[]】所以查询效率高,添加、删除效率偏低
常用方法
* `public boolean add(E e)`: 把给定的对象添加到当前集合中 。
* `public void clear()` :清空集合中所有的元素。
* `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
* `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
* `public boolean isEmpty()`: 判断当前集合是否为空。
* `public int size()`: 返回集合中元素的个数。
* `public Object[] toArray()`: 把集合中的元素,存储到数组中。
- `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
- `public E get(int index)`:返回集合中指定位置的元素。
- `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
- `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
LinkedList集合
特点与原理
原理:双向链表
特点:增删快,查询效率低
Set集合
最大特点:
无序的,不重复的,(存入与取出的顺序不一定相同)
HashSet集合与LinkedHashSet集合
HashSet集合
继承了Set集合,所以也是无序不重复
为什么存入的元素是不重复的?
底层 : 是HashMap<E,Object>,只是使用了HashMap中的key【键】值
原理:
JDK1.8以前:数组+链表
JDK1.8及以后:数组+链表+红黑树
原理的详细解析:
首先判断当前元素的hashCode值在数组中是否存在,
如果数组中不存在,分配位置直接进行元素的存放
如果数组中该hashCode值已存在,使用equals方法进行比较对象的值是否相等
如果对象的值相等,就不进行存储
如果对象的值不相等,进行存储【链表结构存储】
最后,如果是在JDK1.8及以后,如果链表的长度>=8时,进行树化【转化为红黑树进行存储】
LinkedHashSet集合
特点:
有序【linked】不重复
适用场景:
既需要顺序,但又要去除重复元素
可变参数
底层是数组
使用场景:
参数的个数不确定时可以考虑使用【类型一致】
注意事项
a.可变参数搭配其他参数一起使用,必须将可变参数放在最后
b.在方法的参数中只能使用一次可变参数
举例
void mod(... a){ }
Map集合
双列集合:元素成对存在
常用的实现类:HashMap LinkedHashMap
HashMap
特点
a.key不能重复,value可以重复,如果存放的元素key值相同,value值会覆盖原有的value值
b.key和value都可以为null,key值只能存储一个null值,如果出现多个key值为null,会覆盖原有的value值
构造方法
无参构造(较为常用)
加载因子:0.75 【临界值】 按照默认容量创建map对象
带参构造
按照指定容量创建map对象
常用方法(增 删 改 查 长度(键值对数))
V put(K key, V value) 将指定的值与此映射中的指定键关联。
V get(Object key) 返回指定的键映射的值,或 null如果这个Map不包含的键映射。
V remove(Object key) 如果存在的话,从这个映射中移除指定的键的映射。
V replace(K key, V value) 仅当它当前映射到某一值时,替换指定的键的条目。
int size() 返回这个映射中的键值映射的数目。
map集合遍历
a.获取所有的key值,根据key获取value
b.获取所有的value值 【只能获取value值,无法获取key值】
c.获取键值对Set<Map.Entry<K,V>> entrySet() 返回一个 Set视图的映射包含在这个Map。
LinkedHashMap
特点: 数据结构多了一个链表,数据存储有序了
集合工具类--Collections
特点:这个类只包含操作或返回集合的静态方法
常用方法
将多个元素添加至指定集合中
特点:【容器中的元素的类型是添加元素的同类型或其父类型及其祖辈】
用法:static <T> boolean addAll(Collection<? super T> c, T... elements)
随机置换指定列表使用随机默认源(打乱顺序)
用法:static void shuffle(List<?> list)
指定列表为排序
用法:static <T extends Comparable<? super T>> void sort(List<T> list)
实现步骤
a.定义一个Student 实现 Comparable 接口
b.重写compareTo方法
c.在compareTo方法中定义排序规则
根据指定的比较器指定的顺序对指定的列表进行排序
用法:static <T> void sort(List<T> list, Comparator<? super T> c)
通常是通过匿名内部类的方式创建比较器对象
Comparable与Comparator的异同点
都是接口,重写方法,功能类似
Comparable已经被类(String/Integer)实现,已经重写过排序方法,比较规则已固定
使用时,只能按照已有的排序规则进行排序
而Comparator可以在使用时进行重写排序方法指定排序规则,更加灵活
两种方式可以结合使用,如果排序规则已确定,可以直接实现Comparable,并重写compareTo(T o);
当使用时规则若有变动可以灵活切换至Comparator,并重写compare(T o1, T o2);