一.Collection集合
-
概述: 集合其实就是一种容器,可以用来存储多个引用类型的数据
-
分类: 单列集合,双列集合
-
单列集合: 以单个单个元素进行存储
-
双列集合: 以键值对的方式进行存储
-
-
集合与数组的区别:
-
长度:
-
数组长度是固定的
-
集合长度是不固定的
-
-
存储范围:
-
数组可以存储基本类型+引用类型 eg; int[],String[]
-
集合只能存储引用类型,如果要存储基本类型,需要存储基本类型对应的包装类类型 eg; ArrayList<String> ,ArrayList<Integer>
-
-
1.2单列集合常用类的继承体系
-
单列集合: 以单个单个元素进行存储
-
单列集合继承体系:
-
Collection接口是所有单列集合的根接口,也就意味着所有的单列集合都实现了Collection接口
-
List接口继承Collection接口: List集合元素有索引,元素存取有序,元素可重复
-
ArrayList类: 数组存储结构, 查询快,增删慢
-
LinkedList类: 链表存储结构,查询慢,增删快
-
......
-
-
Set接口继承Collection接口: Set集合元素没有索引 , 元素不可重复(唯一)
-
HashSet类: 哈希表结构,由哈希表保证元素唯一,元素存取无序,不可以排序
-
LinkedHashSet类:: 链表+哈希表结构,由哈希表保证元素唯一,由链表保证元素存取有序,不可以排序
-
-
TreeSet类: 二叉树结构,可以对元素进行排序
-
......
-
-
-
1.3Collection常用功能
-
Collection是接口,只能通过其子类创建对象
-
Collection是所有单列集合的顶层父接口,所以所有单列集合都拥有Collection中的方法
-
常用方法:
-
public boolean add(E e)
: 把给定的对象添加到当前集合中 。 -
public void clear()
:清空集合中所有的元素。 -
public boolean remove(E e)
: 把给定的对象在当前集合中删除。 -
public boolean contains(Object obj)
: 判断当前集合中是否包含给定的对象。 -
public boolean isEmpty()
: 判断当前集合是否为空。 -
public int size()
: 返回集合中元素的个数。 -
public Object[] toArray()
: 把集合中的元素,存储到数组中
-
二.Iterator迭代器
2.1 Iterator接口
迭代的概念
-
概述:迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
-
迭代的步骤:
-
获取迭代器对象
-
使用迭代器对象判断集合中是否有元素可以取出
-
如果有元素可以取出,就直接取出来该元素,如果没有元素可以取出,就结束迭代
-
获取迭代器对象
Collection集合提供了一个获取迭代器的方法:
-
public Iterator iterator()
: 获取集合对应的迭代器,用来遍历集合中的元素的。
Iterator迭代器对象的常用方法
-
public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。 -
public E next()
:返回迭代的下一个元素。 -
void remove()
删除当前迭代出来的元素
2.2增强for
-
概述: 增强for循环(foreach循环),是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和Collection集合
-
原理: 内部基于Iterator迭代器实现,所以在遍历的过程中,不能对集合中的元素进行增删操作,否则抛出ConcurrentModificationException并发修改异常
三 泛型
3.1 泛型的概述
-
概述: JDK5之后,新增了泛型(Generic)语法,可以在类、接口或方法中预支地使用未知的类型
-
简而言之: 泛型其实就是表示一种未知的数据类型,在使用的时候确定其具体的数据类型
-
表示方式: <泛型变量>
-
泛型的好处:
-
将运行时期的ClassCastException,转移到了编译时期变成了编译失败
-
避免了类型转换的麻烦
-
-
案例:
-
集合不使用泛型
-
可能会发生类型转换异常
-
避免类型转换异常,就需要先做类型判断,再转型--->比较麻烦
-
-
集合使用泛型
-
概述:指定泛型的具体数据类型----->(只能是引用数据类型)
3.2 定义和使用含有泛型的类
使用含有泛型的类
-
创建含有泛型的类的对象的时候,指定泛型的具体数据类型(只能是引用数据类型)
3.3 定义和使用含有泛型的方法
使用含有泛型的方法
-
调用含有泛型方法的时候,确定泛型的具体数据类型
3.4 定义和使用含有泛型的接口
使用含有泛型的接口
-
方式一: 实现类实现接口的时候,确定接口泛型的具体数据类型
-
方式二:实现类实现接口的时候,不确定接口泛型的具体数据类型,而是创建实现类对象的时候确定泛型的具体数据类型
3.5 泛型通配符
-
概述: 泛型通配符用问号表示(?)
-
为什么需要泛型通配符:
-
泛型本身不存在继承关系,不可以给已指定泛型的变量接收有其他泛型类型的对象
-
Collection<Object> list = new ArrayList<String>(); //错误格式,泛型不存在继承关系
-
-
如果想要使变量在未来接收有泛型定义的对象,又不确定泛型要定义的类型可以使用泛型通配符
-
Collection<?> list 变量接收
-
-
-
通配符基本使用
-
格式:
数据类型<?> 变量
-
注意:
-
如果使用了泛型通配符,那么该集合变量元素类型默认是Object类型
-
如果使用了泛型通配符,那么该集合变量只能取元素,无法增删元素
-
-
四 数据结构
4.1 数据结构介绍
-
数据结构 :其实就是存储数据和表示数据的方式
-
常见的数据结构:栈、队列、数组、链表和红黑树
五 List接口
5.1 List接口介绍
-
List接口的概述
-
java.util.List接口继承自Collection接口,是单列集合的一个重要分支
-
-
List接口的特点
-
它是一个元素存取有序的集合
-
它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素
-
集合中可以有重复的元素
-
5.2 List接口中常用方法
List接口新增常用方法
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:
-
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。 -
public E get(int index)
:返回集合中指定位置的元素。 -
public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。 -
public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
5.3 List的子类
-
ArrayList集合: 底层采用的是数组结构,查询快,增删慢
-
方法: 来自Collection,List
-
-
LinkedList集合; 底层采用的是链表结构,查询慢,增删快
-
方法: 来自Collection,List,LinkedList特有的方法
-
特有的方法:
public void addFirst(E e):将指定元素插入此列表的开头
public void addLast(E e):将指定元素添加到此列表的结尾
public E getFirst():返回此列表的第一个元素
public E getLast():返回此列表的最后一个元素
public E removeFirst():移除并返回此列表的第一个元素
public E removeLast():移除并返回此列表的最后一个元素
public E pop():从此列表所表示的堆栈处弹出一个元素
public void push(E e):将元素推入此列表所表示的堆栈
六 Collections
1.1 Collections常用功能
-
概述:java.util.Collections是集合工具类,用来对集合进行操作。
-
常用方法:
-
public static void shuffle(List<?> list) :打乱集合顺序。
-
`public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
`
`public <T> void sort(List<T> list,Comparator<? super T> comp):将集合中元素按照指定规则排序
`
1.2 可变参数
-
概述: 在JDK1.5之后,定义了可变参数,用来表示一个方法需要接受的多个同类型参数。
-
格式: 修饰符 返回值类型 方法名(数据类型... 变量名){
}
注意事项:
-
可变参数一定是定义在方法的形参位置
-
一个方法只能有一个可变参数
-
如果方法中有多个参数,可变参数要放到最后。
-
Collections工具类中的批量添加元素的静态方法:
-
static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。
七 Set接口
7.1 Set接口介绍
-
概述: java.util.Set接口继承自Collection接口,是单列集合的一个重要分支。
-
特点: 元素没有索引,元素唯一(不重复)
-
注意事项:
-
Set集合元素没有索引,只能使用迭代器或者增强for循环进行遍历元素
-
Set集合没有特殊的方法,都是使用Collection的方法
-
Set接口就是Set集合,但凡实现了Set接口的类也叫做Set集合
-
-
常用实现类:
-
HashSet类: 元素没有索引,元素唯一,元素存取顺序不一致
-
存储结构采用的是哈希表结构,由哈希表保证元素唯一
-
-
LinkedHashSet类:元素没有索引,元素唯一,元素存取顺序一致
-
存储结构采用的是哈希表+链表结构,由哈希表保证元素唯一,由链表保证元素存取顺序一致
-
-
TreeSet类: 元素没有索引,元素唯一,可以对元素进行排序
-
存储结构采用的是红黑树结构,由红黑树保证元素唯一,由比较器来对元素进行排序
-
-
7.2 HashSet集合
-
概述:java.util.HashSet是Set接口的一个实现类, 底层的实现其实是一个java.util.HashMap支持
-
特点: 元素没有索引,元素唯一,元素存取顺序不一致
HashSet保证元素唯一原理
保证元素唯一的原理: 依靠hashCode和equals方法
1.存储元素的时候,会调用该元素的hashCode方法计算该元素的哈希值
2.判断该哈希值对应的位置上是否有元素
3.如果该哈希值对应的位置上没有元素,就直接存储
4.如果该哈希值对应的位置上有元素,说明产生了哈希冲突
5.产生了哈希冲突就会调用该元素的equals方法与该哈希值对应的位置上的所有元素进行一一比较:
5.1 如果比较完之后,没有一个元素与该元素相等,就直接存储
5.2 如果比较完之后,有任意一个元素与该元素相等,就不存储
注意:
1.hashCode和equals方法属于Object类的
2.任意类的对象都拥有hashCode和equals方法
3.Object类中的hashCode方法是主要根据地址值计算哈希值
4.Object类中的equals方法是比较地址值
7.3 HashSet存储自定义类型元素
-
需求: 使用HashSet集合存储学生对象
-
结论: HashSet存储自定义类型元素,要求该元素所属的类要重写hashCode和equals方法
7.4 LinkedHashSet
-
概述: java.util.LinkedHashSet 是HashSet的一个子类,底层采用链表+哈希表
-
特点:
-
元素没有索引,元素唯一,元素存取顺序一致
-
存储结构采用的是哈希表+链表结构,由哈希表保证元素唯一,由链表保证元素存取顺序一致
-
如果集合中存储的是自定义类型的元素,那么就要求该元素所属的类要重写hashCode和equals方法
-
7.5 TreeSet集合
-
概述: TreeSet集合是Set接口的一个实现类,底层依赖于TreeMap,是一种基于红黑树的实现
-
特点:
-
元素没有索引,元素唯一,可以对元素进行排序
-
存储结构采用的是红黑树结构,由红黑树保证元素唯一,由比较器来对元素进行排序
-
-
排序:
-
默认规则排序:
public TreeSet(); 创建TreeSet集合对象,该集合对象使用默认规则对元素进行排序
-
默认规则是在元素所属的类中指定的
-
要求集合元素所属的类必须实现Comparable接口,重写compareTo方法,在compareTo方法中指定排序规则
-
-
指定规则排序: public TreeSet(Comparator<? super E> comparator); 创建TreeSet集合对象,该集合对象使用指定规则对元素进行排序
八 Map集合
8.1 Map概述
概述: java.util.Map双列集合的顶层接口,用来存储具备映射关系对象的集合接口定义
特点:
-
Map<K,V>,K用来限制键的类型,V用来限制值的类型
-
Map集合以键值对的形式来存储数据
-
Map集合的键是唯一的,值可以重复,但键如果重复,值就会覆盖
-
Map集合是根据键来找值
实现类:
实现类都有的特点: 键是唯一的,值可以重复,但键如果重复,值就会覆盖
HashMap: 键值对存取顺序不一致
底层哈希表结构,由哈希表保证键唯一
LinkedHashMap:键值对存取顺序一致
底层哈希表+链表结构,由哈希表保证键唯一,由链表保证存取顺序一致
TreeMap: 可以对键进行排序,从而实现键值对排序
底层红黑树结构,由红黑树保证键唯一,由比较器对象对元素进行排序
8.2 Map的常用方法
-
ublic V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。 -
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 -
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。 -
public boolean containsKey(Object key)
:判断该集合中是否有此键 -
public boolean containsValue(Object value):
判断该集合中是否有此值 -
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。 -
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的 键值对对象 的集合(Set集合)。
8.3 Map的遍历
方式1:键找值方式
-
获取Map集合的所有键--->keySet()方法
-
循环遍历所有的键
-
根据键找值--->get(K k)方法
方式2:键值对对象方式
-
获取所有的键值对对象---->entrySet()方法
-
循环遍历所有的键值对对象
-
使用键值对对象获取键和值--->使用Entry接口的方法
-
Entry<K,V>接口:
-
Entry接口是Map接口的成员内部接口,使用的方式是Map.Entry<K,V>
-
Entry表示键值对对象,也就是说Entry是用来封装键值对的
-
Entry接口里面的常用方法:
-
K getKey(); 获取键值对对象封装的键
-
V getValue(); 获取键值对对象封装的值
-
-