JAVA -- 08

系统温习------黑马程序员Java+AI智能辅助编程全套视频教程

集合框架

Set集合

Set集合特点:无序 :添加数据的顺序和获取出的数据顺序不一致;无重复无索引

HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引。

TreeSet:按照大小默认升序排序、不重复、无索引。

HashSet集合的底层原理:

哈希值:int类型的随机值java中每个对象都有一个哈希值

Java中所有对象都可以调用Object类提供的hashCode方法返回该对象自己的哈希值Public int hashCode();返回对象的哈希码值

对象哈希值的特点:

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

不同的对象 ,它们的哈希值大概率不相等 ,但也有可能会相等(哈希碰撞)。

HashSet集合的底层原理:基于哈希表存储数据的。

哈希表在JDK8之前,哈希表 = 数组 + 链表 ;在JDK8开始,哈希表 = 数组+链表+红黑树。 哈希表是一种增删改查数据,性能都较好的数据结构。

哈希表存储数据的详细流程:

①创建一个默认长度为16的数组,默认加载因子为0.75,数组名table

②使用元素的哈希值数组的长度做运算计算出应存入的位置

③判断当前位置是否为null,如果是null直接存入

④如果不为null,表示有元素,则调用equals方法比较相等,则不存;不相等,则存入数组。 JDK8之前,新元素存入数组,占老元素位置 ,老元素挂下面。JDK8开始之后,新元素直接挂在老元素下面

只要整个哈希表的元素个数达到总长度16×加载因子0.75 ,哈希表就会扩容为原来的两倍

JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树。

二叉查找树:小的存左边,大的存右边,一样的不存。

二叉查找树存在的问题:当数据已经是排好序 的,导致查询的性能与单链表一样,查询速度变慢。

平衡二叉树:在满足二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能 。左右子树的高度差不超过1

红黑树是可以自平衡的二叉树

HashSet集合元素的去重操作:

如果希望Set集合认为两个内容一样的对象是重复的,必须重写对象的hashCode( )和equals( )方法

①定义学生类,创建HashSet集合对象,创建学生对象

②把学生添加到集合

③在学生类中重写两个方法,hashCode( )和equals( )自动生成即可

④遍历集合

LinkedHashSet底层依然是基于哈希表(数组、链表、红黑树)实现 的。但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置

TreeSet集合:不重复,无索引,可排序(默认升序)。底层基于红黑树实现的排序。

对于数值类型:Integer、Double默认按数值本身的大小进行升序排序 ;对于字符串类型默认按照首字符的编号升序排序 ;对于自定义类型 如Student对象,TreeSet默认是无法直接排序的。

解决TreeSet集合默认不能给自定义对象排序的方案:①对象类实现一个Comparable比较接口重写compareTo方法 ,制定大小比较规则。②通过调用TreeSet集合有参数构造器 ,可以设置Comparator对象指定比较规则

如果类本身有实现Comparable接口,TreeSet集合同时也自带比较器,默认使用集合自带的比较器排序

Map集合

Map集合也称为"键值对集合",格式{key1 = value1,key2 = value2,...}

Map集合的所有键是不允许重复 的,但值可以重复键和值是一一对应 的,每一个键只能找到自己对应的值。

Map集合的应用场景:需要存储一一对应的数据时。

Map系列集合的特点都是由键决定 的,值只是一个附属品值不做要求

Map集合的常用方法:

Map集合的遍历方式:

①键找值:先获取Map集合全部的键,再通过遍历键来找值。

②键值对:把键值对看作整体进行遍历。

③Lambda

entrySet( )方法底层会去遍历map集合里的各个元素,每遍历到一个数据都会把键和值封装为Entry对象存到set集合里。

统计投票信息

模拟80名学生投票:将四个景点放入一个字符串数组中。循环80次,每次循环中获取一个随机索引,将索引对应的景点加入到ArrayList集合里。

遍历80个学生的投票,通过set集合统计票数。遍历set集合即可。

,Map集合的实现类:

HashMap(由键决定特点):无序、不重复、无索引;

LinkedHashMap(由键决定特点):有序、不重复、无索引;

TreeMap(由键决定特点):按照(键)大小默认升序、不重复、无索引。

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

HashMap跟HashSet的底层原理是一模一样的,都基于哈希表实现。

LinkedHashSet的底层原理就是LinkedHashMap。每个键值对元素多了一个双链表的机制记录元素顺序(保证有序)。

TreeMap和TreeSet集合的底层原理一样,都是基于红黑树实现的排序。

TreeMap集合同样支持两种方式来指定排序规则:①让类实现Compatable接口,重写比较规则;②TreeMap集合有一个有参构造,支持创建Comparator比较器对象,以便用来指定比较规则。

Stream流

Stream流是jdk8开始新增的用于简化集合、数组操作的API,结合了Lambda表达式。

优势:Stream流大量地结合了Lambda的语法风格 来编程,功能强大,性能高效,代码简洁,可读性好

Stream流的使用步骤:

获取Stream流的方法:

Stream流的常用方法

中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。

如果希望自定义对象能够去重复,重写对象的hashCode和equals方法,才可以去重复。

Stream流的终结方法

终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。

收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。

Stream流:方便操作 集合/数组的手段 ;整合/数组:才是开发中的目的

流只能收集一次

方法中可变参数:是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型...参数名称

可变参数的特点和好处:可以不传数据给它;可以传一个或者同时传多个数据给它 ;也可以传一个数组给它 。好处是用来灵活地接收数据

可变参数对内实际上就是一个数组

可变参数在形参列表中只能有一个 ,可变参数必须放在形参列表的最后面

Collections是一个用来操作集合的工具类

Collections提供的常用静态方法

斗地主游戏

①每张牌都是一个对象,定义牌类。

②游戏房间也是一个对象:定义房间类(准备54张牌;开始游戏)。

③在房间类里定义私有成员集合变量来存储54张牌。在开始游戏方法里使用Collections工具类的shuffle方法进行洗牌。

④发牌需要定义三个玩家,每个玩家都要有各自装牌的容器。使用Map集合,玩家的名称作为键,装牌的容器作为值。用循环遍历牌库中的51张牌,根据取余数不同,将牌分散地发给三个玩家。拿最后三张底牌使用arrayList的subList方法进行截取最后三张牌,此方法返回一个新集合。使用Collections类提供的addall( )即可将新集合的所有数据注入到某一个玩家的牌中。

⑤对牌进行排序,是对list集合中的牌对象进行排序。将此功能独立成方法,使用Collections工具类中的sort方法对集合进行排序,接收一个比较器参数,重写比较规则。根据牌的大小进行排序即可。(牌的大小属于牌固有的属性,在用二重循环制牌时,在外层对点数的循环处,声明一个整型变量记录牌的大小,并将此属性注入到每张牌中)

⑥看牌---遍历Map集合即可。

相关推荐
kong79069282 小时前
Java新特性-(二)Java基础语法
java·新特性·java 基础语法
yangminlei2 小时前
springboot pom.xml配置文件详细解析
java·spring boot·后端
黄俊懿2 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的提交
java·后端·spring·spring cloud·微服务·架构·架构师
JAVA+C语言2 小时前
String Constant Pool
java·开发语言
快乐肚皮2 小时前
一文了解XSS攻击:分类、原理与全方位防御方案
java·前端·xss
白宇横流学长3 小时前
基于SpringBoot实现的历史馆藏系统设计与实现【源码+文档】
java·spring boot·后端
moxiaoran57533 小时前
Go语言结构体
开发语言·后端·golang
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 高校教学资源共享系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
爱海贼的无处不在3 小时前
现在还有Java面试者不会开发Starter组件
后端·面试·架构