javaEE进阶小结与回顾(三)

集合概述
集合是Java中存储引用数据类型的一种容器

特点
大小不固定,长度可以动态变化,适合做数据的增删

如果集合不声明泛型,可以存入任意引用数据类型的数据(不推荐)

声明集合时,通过泛型可以指定集合中应该存储什么类型的元素(推荐)

注意:需要存储基本数据类型时,使用其对应的包装类类型

适用场景
数据的个数不确定,需要进行增删元素的时候

集合与数组对比
相同点,集合与数组一样,都是容器,可以保存多个元素
不同点,集合中只能存引用类型,保存基本类型泛型要用包装类,数组基本和引用类型都能存,集合长度可变,数组长度固定

Collection集合
集合
Collection单列
集合元素是一个值
Map双列
集合元素是一个键值对(两个值)
单列集合的顶层接口
List和Set
根据增删改查效率,遍历方式,特点来选择使用哪个集合
单列集合祖宗接口,它的功能是所有单列集合都可以使用的
常用API
public boolean add(E e)
把给定对象添加到当前集合中
public void clear()
清空集合中所有元素
public boolean remove(E e)
把给定对象在当前集合中删除
public boolean conteins(Object obj)
判断当前集合中是否包含给定的对象
public boolean isEmpty()
判断当前集合是否为空
public int size()
返回集合中元素的个数
遍历方式有三种:迭代器,增强for循环和lambda表达式
方式一_迭代器
代表是Iterator,迭代器是集合专用遍历方式

Iterator iterator()

返回集合中的迭代器对象,该迭代器的指针默认指向当前集合的第一个元素

Iterator中常用方法
boolean hasNext()

询问当前位置是否有元素存在,存在返回true,不存在返回false

E next()

获取当前指针位置的元素,同时将指针移向下一个位置

并发修改异常
指当使用迭代器遍历集合时,过程中如果利用集合对象取删除数据,有可能会出现一种并发修改异常问题

如何避免这种异常?

使用迭代器自己的删除方法
遍历时,不要对集合进行增删操作
如果要在遍历时进行增删,使用其他遍历方式,如get(),size()
方式二_增强for循环
可以遍历集合跟数组

jdk5后出现,内部原理是Iterator迭代器,增强for相当于迭代器的简化写法

格式

for(元素数据类型 变量名 : 数组/Collection集合){
//在此处使用变量即可,该变量就是元素
}
变量名是第三方的值,不会影响集合中的元素

方式三_lambda表达式
lists.forEach(new Consumer(){

  @Override

  public void accept(String s){

    System.out.printIn(s);

}
lists.forEach(s->{

System.out.printIn(s);

});
常见数据结构
概述
数据结构是计算机底层存储,组织数据的方式,通常,精心选择的数据结构可以带来更高的运行或者存储效率,如栈,队列,数组,链表,二叉树,二叉查找树,平衡二叉树,红黑树...

栈特点
后进先出,先进后出

队列
先进先出,后进后出

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

数组
查询数据通过地址值和索引定位,查询任意数据耗时相同.

查询速度快

将原始数据删除,同时后面每个数据前移

删除效率低

添加位置后的每个数据后移,再添加元素

添加效率极低

链表
链表中的元素在内存中不连续存储,每个元素节点包含数据值和下一个元素的地址

特点
链表中元素是游离存储的

链表查询慢,无论查询哪个数据都要从头开始找

种类
单向链表
值,后一个节点地址

双向链表
前一个节点地址,值,后一个节点地址

二叉树
特点

只能有一个根节点,每个节点最多支持2个直接子节点

节点的度,拥有子树的个数,二叉树度不大于2,叶子节点度为0的节点,也称之为终端节点

高度,也叫深度,树有几层,高度就是几层,根节点在第一层,以此类推

兄弟节点,拥有共同父节点互称兄弟节点

二叉查找树
又称二叉排序树或二叉搜索树

特点
每个节点上最多两个子节点

左子树所有节点的值都小于根节点的值

右子树所有节点的值都大于根节点的值

目的,提高检索数据的性能

平衡二叉树
满足查找二叉树的大小规则下,让树尽可能矮小,提高查找数据性能

任意节点的左右两个子树高度差不超过1,任意节点的左右两个子树都是一颗平衡 二叉树

平衡二叉树在添加元素后可能导致不平衡,基本策略是进行左旋或右旋保证平衡

红黑树
概述
是一种自平衡的二叉查找树,是一种数据结构

每个节点是红或黑,不是高度平衡的,通过"红黑规则"进行实现的

增删改查性能都很好

红黑规则
每个节点或是红或是黑,根节点必须是黑色

如果一个节点没有子节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节 点,叶节点是黑色的

对每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点

添加节点
添加的节点的颜色,可以是红或黑

默认用红色效率高

List系列集合
List集合特点
有序:存储和取出的元素顺序一致

有索引:可以通过索引操作元素

可重复:存储的元素可以重复

List特有遍历方式

普通for遍历
(get(index),size())

特有API
void add(int index,E element)

在此集合中的指定位置插入指定的元素

E remove(int index)

删除指定索引处的元素,返回被删除的元素

E set(int index,E element)

修改指定索引处的元素,返回被修改的元素

E get(int index)

返回指定索引处的元素

ArrayList集合的底层原理
基于数组实现

LinkedList集合的底层原理
底层数据结构是双链表,查询慢,增删快

特有API
public void addFirst(E e)

在该列表开头插入指定的元素

public void addLast(E e)

将指定元素追加到此列表的末尾

public E getFirst()

返回此列表中的第一个元素

public E getLast()

返回此列表中最后一个元素

public E removeFirst()

从此列表中删除并返回第一个元素

public E removeLast()

从此列表中删除并返回最后一个元素

泛型
泛型概述

可以在编译阶段约束操作的数据类型,并进行检查,提高安全性

可以理解为参数化类型,类型不确定时用参数代替,使用时把数据类型传给它

Set集合
Set概述
无序

不保证存取顺序一致

不重复

不包含重复元素

无索引

没有带索引的方法,所以不能通过普通for遍历,也不能通过索引取元素

Set集合的功能上基本与Collection的API一致

HashSet元素无序的底层原理:哈希表
底层原理
采取哈希表储存数据

对增删改查性能都比较好的数据结构

哈希表组成
jdk7,数组+链表组成

jdk8以后,数组+链表+红黑树

哈希值的概念
是JDK根据对象的地址,按照某种规则算出来的int类型的数值

public int hashCode()

返回对象的哈希值

对象的哈希值特点
同一个对象多次调用hashCode()方法返回的哈希值是相同的

默认情况下,不同对象哈希值是不同的

不同元素哈希值一般不同,计算得到的索引是随机的,所以无序

jdk1.8后底层原理
哈希表结构
数组,链表,红黑树

当挂在下面的数据过多,查询性能降低,所以链表长度达到8,自动转换为红黑树,进一步提高操作数据的性能

哈希表添加元素的流程(了解,加分项拓展)
HashSet元素去重复的底层原理
默认创建长度为16的数组

根据元素哈希值跟数组长度求余计算出应存入的位置(哈希算法)

判断当前位置是否为null

不为null调用equals方法比较

如果一样,则不存,不一样则存入数组

元素之间比较,依赖元素的hashCode()和equals()

Object类的hashCode()和equals()都与物理地址相关,自定义对象时需要重写

实现类:LinkedHashSet
有序,唯一
有序指取出的顺序与添加的顺序一致

原理
底层数据结构依旧时哈希表,只是每个元素额外多一个双链表机制记录存 储的顺序

底层是哈希表(保证去重)+双链表(保证有序)

实现类:TreeSet
去重,可以排序(按照元素大小排序,默认升序是小到大)

特点
底层是红黑树,增删改查性能好

TreeSet集合可排序,那么必须提供元素之间比较的规则

默认的比较规则
对于数值类型:Integer,Double 在包装类种已经定义了相互比较的规则

对于字符串类型:String类也定义字符串比较规则

对于自定义类型如Student对象,TreeSet无法直接排序,需重写比较规则
方式一:TreeSet()空参构造

让元素所在类(如学生类)实现Comparable接口重写compareTo方法来 定制比较规则
方式二:TreeSet(Comparator comparator)有参构造器

设置Comparator接口对应的比较器对象,来定制比较规则

int compareTo(T o):将当前对象与参数o进行比较

方法返回正数,调用此方法的当前对象this比较大

方法返回负数,参数o比较大

如果方法返回0,2个数据相等

Collection单列集合小结
如何选择使用哪种集合

元素需要重复?

查询多还是增删多?

要排序吗?

希望存取顺序一致吗?

可变参数
概念
可变参数在形参中可以接收多个数据

格式:

数据类型...参数名称

int sum(int... num)
作用
传输参数非常灵活,方便,可以不传参数,可以传一个或多个,甚至传输一个数组

可变参数在方法内部本质上就是一个数组

注意
一个形参列表中可变参数只能有一个

如果还有其他参数,可变参数必须放在形参列表最后面

Collections集合工具类
概念
java.utils.Collections:是集合工具类

作用
Collections并不属于集合,是用来操作集合的工具类

常用API
public static boolean addAll(Collection<? super T> c, T... elements)

给集合对象批量添加元素

public static void shuffle(List<?> list)

打乱List集合元素的顺序

public static void sort(List list)

将集合中元素按照默认规则排序

public static void sort(List list,Comparator<? super T> c)

将集合中元素按照指定规则排序

Map集合
Map集合概述
概念与使用
Collection是单列集合,Map<K,V>是双列集合

Map<>集合保存键值对对象(包含一个键对象和一个值对象)

键在Map中是唯一的,值随意

一个键只能对应一个值

特点
ap是双列集合的顶层接口,保存的是键值对对象,键是唯一的,值随意,一个键只 对应一个值.

Map集合非常适合保存有对应关系的键值对对象

Map继承体系
Map
HashMap------LinkedHashMap

HashTable------Properties

...... ------TreeMap

使用最多的Map集合是HashMap

Map集合常用API
V put(K key,V value)

添加元素

V remove(Object key)

根据键删除键值对元素

void clear()

移除所有的键值对元素

V get(Object key)

返回指定键对应的值,如果键不存在,则返回null

boolean containsKey(Object key)

判断集合是否包含指定的键

boolean containsValue(Object value)

判断集合是否包含指定的值

boolean isEmpty()

判断集合是否为空

int size()

集合的长度,也就是集合中键值对的个数

Map集合遍历方式一
键找值

先获取Map集合的全部键的Set集合

遍历键的Set集合,然后通过键提取对应值

Map集合遍历方式二
键值对

先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型

然后遍历Set集合,提取键以及提取值

Map集合遍历方式三
结合Lambda遍历的API

default void forEach(BiConsumer<? super K, ? super V> action)

Map集合的实现类HashMap
特点
特点都是由键决定的:无序、不重复

没有额外需要学习的特有方法,直接使用Map里面的方法就可以了

HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap 的每个元素包含两个值而已

实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键 数据,不要值数据而已

总结
HashMap底层是哈希表,键对象的唯一性,依赖键所在类的hashCode()和 equals()

HashMap<String,V>:String作为键能保证唯一,因为String类已经重写hashCode() 和 equals()2个方法

HashMap<Student,V>:自定义的Student作为键,默认不能保证键的唯一性,需要 让 Student类重写hashCode()和equals()2个方法

Map集合的实现类LinkedHashMap
由键决定:有序、唯一

这里的有序指的是保证获取的顺序与添加的一致

底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制 记录存储的顺序

Map集合的实现类TreeMap
特点
键是唯一的,键可以排序

底层基于红黑树实现排序,增删改查性能较好

自定义排序规则的方式
TreeMap():空参构造,让键所在类实现自然排序接口Comparable

Integer作为键,默认可以实现排序,因为Integer类实现了自然排序接口

自定义的Student作为键,需要让键所在类实现自然排序接口

TreeMap(Comparator comparator):带参构造,使用传入的规则对键进行排序

猜你喜欢

转载自blog.csdn.net/douyinbuwen/article/details/130043235