Java入门到精通(干就完了)

news/2025/1/15 19:38:39/

文章目录

  • 1、Java语言概述
  • 2、Java开发环境的准备:JDK简介、安装、常用命令
  • 3、Java入门程序
    • 3.1、Hello World
    • 3.2 常见问题
    • 3.3 Java程序的执行原理
    • 3.4 JDK组成、跨平台原理
    • 3.5 JDK安装后Path和Java_home环境变量
  • 4、IDEA开发工具:简介、下载、安装
    • 4.1 简介
    • 4.2 下载
    • 4.3 IDEA开发工具:开发第一个程序
    • 4.4 IDEA字体、主题、背景色设置
    • 4.5 常用快捷键介绍
    • 4.6 IDEA工程、模块常用操作
  • 5、Java基础语法
    • 5.1 注释
    • 5.2 字面量
    • 5.3 变量
    • 5.4 变量在计算机中的底层原理
    • 5.5 进制转换,八进制、十六进制
    • 5.6 数据类型
    • 5.7 关键字、标识符
  • 6、关于Java语言基础知识我们需要学会什么?
  • 7、类型转换
    • 7.1 自动类型转换
    • 7.2 表达式的自动类型转换
    • 7.3 强制类型转换
  • 8、运算符
    • 8.1 基本算数运算符
    • 8.2 +符号做连接符
    • 8.3 自增自减运算符
    • 8.4 赋值运算符
    • 8.5 关系运算符
    • 8.6 逻辑运算符
    • 8.7 三元运算符
    • 8.8 运算符优先级
  • 9、API介绍、案例技术:键盘录入
  • 10、程序流程控制
    • 10.1 分支结构
      • 10.1.1 if分支
      • 10.1.2 switch分支
    • 10.2 循环结构
      • 10.2.1 for循环
      • 10.2.2 while循环
      • 10.2.3 do-while循环
      • 10.2.4 死循环
      • 10.2.5 嵌套循环
      • 10.2.6 跳转关键字:break、continue
  • 11、 随机数Random
  • 12、数组
    • 12.1 概述
    • 12.2 定义方式一、访问、注意事项
    • 12.3 定义方式二、元素默认值规则
    • 12.4 数组遍历
    • 12.5 数组案例
      • 12.5.1 元素求和
      • 12.5.2 数组求最值
      • 12.5.3 猜数字游戏
      • 12.5.4 随机排名
      • 12.5.5 数组排序
    • 12.6 数组内存图、常见使用问题
    • 12.7 Debug工具
  • 13、方法
    • 13.1 概述
    • 13.2 方法定义格式、常见问题
    • 13.3 方法案例
      • 13.3.1 求和
      • 13.3.2 判断奇偶数
      • 13.3.3 求最值
    • 13.4 方法的内存原理
    • 13.5 方法参数传递机制
    • 13.6 方法参数传递的案例
      • 13.6.1 打印数组的内容
      • 13.6.2 从数组中查询元素分索引返回
      • 13.6.3 比较两个数组内容是否相等
    • 13.7 方法重载、return关键字
  • 14 编程训练
    • 14.1 买飞机票
    • 14.2 找素数
    • 14.3 验证码
    • 14.4 数组的复制
    • 14.5 评委打分
    • 14.6 数字加密
    • 14.7 双色球系统开发
  • 15 面向对象
    • 15.1 概述
    • 15.2 面向对象、注意事项
    • 15.3 内存机制
    • 15.4 面向对象实战
    • 15.5 构造器、this
    • 15.6 封装
    • 15.7 标准JavaBean
    • 15.8 成员变量、局部变量区别
    • 15.9 面向对象综合案例
  • 16 常用API(String、ArrayList)
    • 16.1 String
      • 16.1.1 概述
      • 16.1.2 对象创建的原理
      • 16.1.3 String类常见面试题
      • 16.1.4 Stirng类常用API
      • 16.1.5 String案例:验证码、登录、隐私号码
    • 16.2 ArrayList
      • 16.2.1 集合概述
      • 16.2.2 ArrayList集合快速入门
      • 16.2.3 ArrayList对于泛型的支持
      • 16.2.4 ArrayList常用API、遍历
      • 16.2.5 ArrayList集合案例
  • 17 ATM系统
  • 18、static静态关键字
    • 18.1 static是什么、修饰成员变量的用法
    • 18.2 static修饰成员变量的内存原理
    • 18.3 static修饰成员方法的基本用法
    • 18.4 static修饰成员方法的内存原理
    • 18.5 static注意事项
    • 18.6 工具类
    • 18.7 代码块
    • 18.9 单例模式
  • 19 继承
    • 19.1 概述、案例
    • 19.2 特点、访问特点、方法重写
    • 19.3 构造器特点、this、super小结
  • 20、语法
    • 20.1 包
    • 20.2 权限修饰符
    • 20.3 final的语法
    • 20.4 常量、常量在开发中的作用
    • 20.5 枚举、枚举作用
  • 21、抽象类
    • 21.1 概述
    • 21.2 案例
    • 21.3 特点
    • 21.4 模板方法模式
  • 22、接口
    • 22.1 概述
    • 22.2 多实现
    • 22.3 多继承
    • 22.4 JKD8后接口新增方法
    • 22.5 注意事项
  • 23、多态
    • 23.1 概述
    • 23.2 优势
    • 23.3 类型转换问题
    • 23.4 综合案例
  • 24、内部类
    • 24.1 静态内部类
    • 24.2 成员内部类
    • 24.3 局部内部类
    • 24.4 匿名内部类
  • 25、常用API
    • 25.1 Object
    • 25.2 Objects
    • 25.3 StringBuilder
    • 25.4 Math
    • 25.5 System
    • 25.6 BigDecimal
  • 26、日期与时间
    • 26.1 Date
    • 26.2 SimpleDateFormat
    • 26.3 Calendar
  • 27、JDK8开始新增日期API
    • 27.1 LocalTime、LocalDate、LocalDateTime
    • 27.2 Instant
    • 27.3 DateTimeFormatter
    • 27.4 Duration、Period
    • 27.5 ChronoUnit
  • 28、包装类
  • 29、正则表达式
    • 29.1 概述、初体验
    • 29.2 匹配规则
    • 29.3 常见案例
    • 29.4 在方法中的应用
    • 29.5 爬取信息
  • 30、Arrays类
  • 31、常见算法
    • 31.1 选择排序
    • 31.2 二分查找
  • 32、Lambda表达式
    • 32.1 概述
    • 32.2 实战-简化常见函数式接口
    • 32.3 表达式的省略规则
  • 33、集合
    • 33.1 概述
    • 33.2 collection集合的体系特点
    • 33.3 Collection集合常用API
    • 33.4 collection集合的遍历方式
    • 33.5 Collection集合存储自定义类型的对象
    • 33.6 常见数据结构
      • 33.6.1 概述、栈、队列
      • 33.6.2 数组
      • 33.6.3 链表
      • 33.6.4 二叉树、二叉查找树
      • 33.6.5 平衡二叉树
      • 33.6.6 红黑树
    • 33.7 List系列集合
      • 33.7.1 List集合特点、特有API
      • 33.8.2 List集合的遍历方式小结
      • 33.8.3 ArrayList集合的底层原理
      • 33.8.4 LinkedList集合的底层原理
    • 33.8 补充知识:集合的并发修改异常问题
    • 33.9 补充知识:泛型深入
      • 33.9.1 泛型的概述和优势
      • 33.9.2 自定义泛型类
      • 33.9.3 自定义泛型方法
      • 33.9.4 自定义泛型接口
      • 33.9.5 泛型通配符、上下限
    • 33.10 Set系列集合
      • 33.10.1 Set系列集系概述
      • 33.10.2 HashSet元素无序的底层原理:哈希表
      • 33.10.3HashSet元素去重复的底层原理
      • 33.10.4 实现类: LinkedHashset
      • 33.10.5 实现类:TreeSet
    • 33.11 Collection体系的特点、使用场景总结补充知识:可变参数
    • 33.12 补充知识:集合工具类Collections
    • 33.13 Collection体系的综合案例
    • 33.14 Map集合体系
      • 33.14.1 Map集合的概述
      • 33.14.2 Map集合体系特点
      • 33.14.3 Map集合常用API
      • 33.14.4 Map集合的遍历方式一:键找值
      • 33.14.5 Map集合的遍历方式二:键值对
      • 33.14.6 Map集合的遍历方式三: lambda表达式
      • 33.14.7 Map集合的实现类HashMap
      • 33.14.8 Map集合的实现类LinkedHashMap
      • 33.14.9 Map集合的实现类TreeMap
    • 33.15 补充知识:集合的嵌套
  • 34、创建不可变集合
  • 35、Stream流
    • 35.1 Stream流的概述
    • 35.2 Stream流的获取
    • 35.3 stream流的常用方法API
    • 35.4 Stream流的综合应用
    • 35.5 收集Stream流
  • 36、异常处理
    • 36.1 异常概述、体系
    • 36.1 常见运行时异常
    • 36.1 常见编译时异常
    • 36.1 异常的默认处理流程
    • 36.1 编译时异常的处理机制
    • 36.1 运行时异常的处理机制
    • 36.1 异常处理使代码更稳健的案例
    • 36.1 自定义异常
  • 37、日志框架
    • 37.1 日志技术的概述
    • 37.2 日志技术体系结构
    • 37.3 Logback概述
    • 37.4 Logback快速入门
    • 37.5 Logback配置详解-输出位置、格式设置
    • 37.6 Logback配置详解-日志级别设置
  • 38、阶段项目实战
    • 38.1 电影购票系统简介、项目功能演示
    • 38.2 日志框架搭建、系统角色分析
    • 38.3 首页设计、登录、商家界面、用户界面实现
    • 38.4 商家-详情页设计、影片上架、退出
    • 38.5 商家-影片下架、影片修改
    • 38.6 用户-展示全部影片
    • 38.7 用户-购票功能
    • 38.8 用户-评分功能
  • 39、File类
    • 39.1 创建File对象
    • 39.2 常用方法:判断文件类型、获取文件信息
    • 39.3 常用方法:创建文件、删除文件功能
    • 39.4 常用方法:遍历文件夹
  • 40、补充知识:方法递归、字符集
    • 40.1 方法递归的形式
    • 40.2 方法递归的应用、执行流程、递归算法的三个核心要素
    • 40.3 方法递归的经典案例
    • 40.4 其他形式的方法递归案例
    • 40.5 常见字符集介绍
    • 40.6 字符集的编码、解码操作
  • 41、IO流
    • 41.1 概述
    • 41.2 字节流
    • 41.3 资源释放的方式

1、Java语言概述

  • Java知识背景

在这里插入图片描述

  • 为什么用Java
    1、世界上最流行的编程语言之一,在国内使用最为广泛的编程语言。
    2、可移植性、安全可靠、性能较好。
    3、开发社区最完善,功能最丰富。
  • Java能做什么

在这里插入图片描述

  • Java技术体系
技术体系说明
Java SE(Java Standard Edition):标准版Java技术的核心和基础
Java EE(Java Enterprise Edition):企业版企业级应用开发的一套解决方案
Java ME(Java Micro Edition):小型版针对移动设备应用的解决方案
  • 总结
    1、Java是是一门高级编程语言
    2、Java是sun公司研发的,现在属于Oracle公司
    3、Java之父是詹姆斯·高斯林
    4、Java基本上什么都可以干,主要做互联网系统的开发
    5、Java技术平台:JavaSE(标准版)、JavaEE(企业版)、JavaME(小型版)

2、Java开发环境的准备:JDK简介、安装、常用命令

在这里插入图片描述

  • JDK下载
    Oracle官网:http://www.oracle.com/java/technologies/downloads/
    在这里插入图片描述

  • 如何验证JDK安装成功
    java.exe与javac.exe能正常运行即可
    在这里插入图片描述在这里插入图片描述

  • Javac和Java介绍
    在这里插入图片描述
    将来我们写好的Java程序都是高级语言,计算机底层是硬件不能识别这些语言。
    必须通过Javac编译工具进行翻译,然后再通过Java执行工具执行才可以驱动机器干活。

  • 命令行窗口的常用命令

常用命令作用
盘符:切换到某个盘下:D:,C:
dir查看当前路径下的文件信息
cd进入单级目录:cd itheima
进入多级目录:cd D:\itheima\JavaSE\第一天
回退到上一级目录:cd ..
回退到盘符根目录:cd \
(注意:按Table可以补全目录)
cls清屏

3、Java入门程序

3.1、Hello World

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 常见问题

1、windows的文件扩展名没有勾选
在这里插入图片描述

2、代码写了,但是忘记保存了
在这里插入图片描述

3、文件名和类名不一致。
在这里插入图片描述

4、大小写错误,单词拼写错误,存在中文符号,找不到Main方法。
在这里插入图片描述

5、括号不配对.
在这里插入图片描述

6、编译或执行工具使用不当.
在这里插入图片描述

7、…

3.3 Java程序的执行原理

  • 不管是什么样的高级编程语言,最终都是翻译成计算机底层可以识别的机器语言(0和1)

3.4 JDK组成、跨平台原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 JDK安装后Path和Java_home环境变量

在这里插入图片描述

  • 开始配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、IDEA开发工具:简介、下载、安装

4.1 简介

在这里插入图片描述

4.2 下载

下载UItimate旗舰版: https://www.jetbrains.com/idea/
安装:傻瓜式安装,建议修改安装路径(不要安装在有空格和中文的路径下)。

4.3 IDEA开发工具:开发第一个程序

在这里插入图片描述

在这里插入图片描述
① 创建project空工程
在这里插入图片描述
② 创建module模块
在这里插入图片描述
找到你下载JDK的路径位置,添加JDK
在这里插入图片描述
在这里插入图片描述
③创建package包
在这里插入图片描述
在这里插入图片描述
④创建class类
在这里插入图片描述
⑤在类中编写代码
在这里插入图片描述
⑥完成编译运行
在这里插入图片描述

4.4 IDEA字体、主题、背景色设置

在这里插入图片描述
在这里插入图片描述

4.5 常用快捷键介绍

在这里插入图片描述

Ctrl + Alt + T 分支、循环快捷键

4.6 IDEA工程、模块常用操作

1、删除类文件
在这里插入图片描述

2、修改类名称
在这里插入图片描述

3、修改模块
在这里插入图片描述
在这里插入图片描述

4、导入模块

关联导入:原路径模块删除,此模块也会删除

在这里插入图片描述
在这里插入图片描述

建议新建一个模块,名称就是导入模块的名称,将代码拷贝进去,避免原路径删除导致模块丢失

5、删除模块

方法1:Remove Module,此方法只是在IDEA界面中删除,源文件并没有删除

在这里插入图片描述

方法2:到整个项目路径下找到要删除的文件,直接删除

方法3:在IDEA中点击模块,顶部显示模块名称后右键,delete。

在这里插入图片描述

当然方法3也有bug,不能删除干净,源文件还会复原,但是IDEA界面上不显示出来,如下操作做完再重启IDEA,即可删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

建议使用方法1 + 方法2,出问题重启IDEA

6、 打开工程
在这里插入图片描述
在这里插入图片描述
7、关闭工程
在这里插入图片描述
或者直接X掉,关闭IDEA

5、Java基础语法

5.1 注释

什么是注释

注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。

注释有哪些

在这里插入图片描述

注释的特点

注释不影响程序的执行
在这里插入图片描述

多学一招

在这里插入图片描述

5.2 字面量

计算机是用来处理数据的,字面量就是告诉程序员∶数据在程序中的书写格式。

常用数据

在这里插入图片描述
在这里插入图片描述

5.3 变量

什么是变量

变量就是用来存储一一个数据的内存区域(可以理解成盒子),且里面存储的数据可以变化。
1、必须以字母、下划线、或者美元符$开头;

以美元符$ 开头命名的变量虽然能够编译通过但是不建议使用;

中文也可以作为命名开头且编译也能通过,但是不建议使用。

2、除开头外后面的部分可以有字母、下划线、美元符$以及数字组成;

3、虽然变量名不限制长度,但能表达清楚命名的含义即可;

4、变量名不可以和java的关键字冲突;

5、再命名中大小写是又区别的,即使由同一个单词命名但是有个别字母的大小写的区别,产生的就是两个不同的变量。
在这里插入图片描述

变量使用注意事项

在这里插入图片描述

5.4 变量在计算机中的底层原理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 进制转换,八进制、十六进制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.7 关键字、标识符

在这里插入图片描述
在这里插入图片描述

6、关于Java语言基础知识我们需要学会什么?

在这里插入图片描述

7、类型转换

7.1 自动类型转换

在这里插入图片描述

7.2 表达式的自动类型转换

在这里插入图片描述

面试题

在这里插入图片描述

咋一看 i 和 j 都是byte变量,但是两者相加的值需要 int 类型承接 。
因为 i 和 j 在运算时默认是 int 类型 进行运算。同时,如果i=120,j=100,两者都不超过byte类型范围,但是相加得到的值就不一定了。
索性当成int类型计算能保证能赋值。

7.3 强制类型转换

在这里插入图片描述
在这里插入图片描述

8、运算符

8.1 基本算数运算符

在这里插入图片描述

数值拆分案例

在这里插入图片描述
在这里插入图片描述

8.2 +符号做连接符

在这里插入图片描述

8.3 自增自减运算符

在这里插入图片描述
在这里插入图片描述

面试案例

在这里插入图片描述

8.4 赋值运算符

在这里插入图片描述

8.5 关系运算符

在这里插入图片描述

8.6 逻辑运算符

在这里插入图片描述
在这里插入图片描述

8.7 三元运算符

在这里插入图片描述

8.8 运算符优先级

在这里插入图片描述

9、API介绍、案例技术:键盘录入

在这里插入图片描述
在这里插入图片描述

10、程序流程控制

在这里插入图片描述
在这里插入图片描述

10.1 分支结构

10.1.1 if分支

  • 根据判定的结果( 真或假)决定执行某个分支的代码,适合做区间匹配
    在这里插入图片描述

10.1.2 switch分支

在这里插入图片描述

switch使用的注意事项
在这里插入图片描述

  • 不支持浮点数原因是https://www.jb51.net/article/231618.htm

在这里插入图片描述

10.2 循环结构

10.2.1 for循环

在这里插入图片描述

10.2.2 while循环

在这里插入图片描述

10.2.3 do-while循环

在这里插入图片描述

10.2.4 死循环

在这里插入图片描述

10.2.5 嵌套循环

在这里插入图片描述

10.2.6 跳转关键字:break、continue

在这里插入图片描述

11、 随机数Random

在这里插入图片描述
在这里插入图片描述

当然也可以指定随机区间 Random rm = new Random(); rm.nextInt(10,30);

12、数组

12.1 概述

在这里插入图片描述
在这里插入图片描述

12.2 定义方式一、访问、注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.3 定义方式二、元素默认值规则

在这里插入图片描述
在这里插入图片描述

12.4 数组遍历

在这里插入图片描述

快捷写法 数组变量.for初始化变量,例如:ages.fori,就会弹出提示
在这里插入图片描述

12.5 数组案例

12.5.1 元素求和

在这里插入图片描述

12.5.2 数组求最值

在这里插入图片描述

12.5.3 猜数字游戏

在这里插入图片描述
在这里插入图片描述

12.5.4 随机排名

在这里插入图片描述

12.5.5 数组排序

在这里插入图片描述
在这里插入图片描述

12.6 数组内存图、常见使用问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.7 Debug工具

在这里插入图片描述

13、方法

13.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.2 方法定义格式、常见问题

用static修饰符,表示是该类的方法,不是实例的方法,可以在static修饰的方法中调用static修饰的方法。
不用static修饰符,则需要new类的实例,来调用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.3 方法案例

在这里插入图片描述

13.3.1 求和

在这里插入图片描述

13.3.2 判断奇偶数

在这里插入图片描述

13.3.3 求最值

在这里插入图片描述

13.4 方法的内存原理

在这里插入图片描述
在这里插入图片描述
详细动画看这里https://editor.csdn.net/md/?articleId=127215629

13.5 方法参数传递机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.6 方法参数传递的案例

13.6.1 打印数组的内容

在这里插入图片描述

13.6.2 从数组中查询元素分索引返回

在这里插入图片描述

13.6.3 比较两个数组内容是否相等

在这里插入图片描述

13.7 方法重载、return关键字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14 编程训练

14.1 买飞机票

在这里插入图片描述

package com.itheima.demo;
import java.util.Scanner;public class Test1 {public static void main(String[] args) {//目标:完成买飞机票的价格计算。// 1、让用户输入机票原价,月份,仓位类型Scanner sc = new Scanner(System.in);System. out. println("请您输入机票原价: ");double money = sc. nextDouble() ;System. out. println("请您输入机票的月份(1-12) : ");int month = sc. nextInt();System. out. printLn("请您选择仓位类型: ");String type = sc.next();// 4.调用方法,统计结果.System . out . printLn("机票优惠后的价格是: + calc(money, month, type));}public static doubLe calc(doubLe money, int month, String type] {// 3.判断用户选择的信息情况if (month >= 5 && money <= 10) {//旺季switch (type) {case "头等舱":money *= 0.9; // money = money★0.9;break;case "经济舱":money *= 0.85; // money = money * 0.85;break;default:System.out.printLn("您输入的仓位类型有误~~");money = -1; //表示当前无法计算价格!}else if(month == 11 II month == 12 II month >= 1 & month <= 4){ //淡季switch (type) {case "头等舱":money *= 0.7; // money = money★0.9;break;case "经济舱":money *= 0.65; // money = money * 0.85;break;default:System.out.printLn("您输入的仓位类型有误~~");money = -1; //表示当前无法计算价格!}else {System.out.println("对不起,您输入的月份有问题~~");money = -1; //表示当前无法计算价格!}}return money; //最终价格
}

14.2 找素数

在这里插入图片描述
在这里插入图片描述

14.3 验证码

在这里插入图片描述
在这里插入图片描述

14.4 数组的复制

在这里插入图片描述
在这里插入图片描述

14.5 评委打分

在这里插入图片描述

14.6 数字加密

在这里插入图片描述

14.7 双色球系统开发

在这里插入图片描述

15 面向对象

15.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.2 面向对象、注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.3 内存机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

垃圾回收

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
  • Java存在自动垃圾回收器,会定期进行清理。

15.4 面向对象实战

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Goods类

package com.itheima.demo;public class Goods {int id; //编号String name; //名称double price; //价格int buyNumber; // 购买数量
}

测试模块

package com.itheima.demo;import java.util.Scanner;/**
目标:面向对象编程训练:购物车模块模拟。
*/public class ShopCarTest {public static void main(String[] args) {// 1.定义商品类,用于后期创建商品对象// 2.定义购物车对象:使用一 个数组对象表示。Goods[] shopCar = new Goods[100]; // [null, null, ...]// 3.搭建操作架构while(true){System. out . println("请您选择如下命令进行操作: "); .System. out. printLn("添加商品到购物车: add");System. out. println("查询购物车商品展示: query");System. out. printLn("修改商品购买数量: update");System. out . println("结算购买商品的金额: pay");Scanner sc = new Scanner(System.in);System. out . printLn("请您输入命令: ");String command = sc.next();switch (command){case "add" ://添加商品到购物车addGoods(shopCar,sc);break;case "query"://查询购物车商品展示queryGoods(shopCar);break;case "update"://修改商品购买数量updateGoods (shopCar,sc);break;case "pay"://结算购买商品的金额pay(shopCar);break;default :System. out. print1n("没有该功能! ");}}}/**查询购物车中的商品对象信息,并展示出来*/public static void queryGoods (Goods[] shopCar) {System. out. printLn("===========查询购物车信息如下============");System. out. println("编号\t\t名称\t\t\t价格\t\t\t购买数量");// shopCar = [g1, g2, g3, null, null, ...]for (int i =; i < shopCar.length; i++) {Goods g = shopCar[i];if(g != null){//展示这个商品对象System. out. println(g.id +"\t\t" + g.name+"\t\t\t" + g.price +"\t\t\t" + g.buyNumber);}else {//遍历结束break;}}}public static void updateGoods (Goods[] shopCar ,Scanner sc) {//让用户输入要修改商品的id,根据id查询出要修改的商品对象。while (true) {System. out . printLn("请您输入要修改的商品id:");int id = sc.nextInt();Goods g = getGoodsById(shopCar, id);if(g == null){//没有该商品.System . out . printIn("对不起,没有购买商品! ");}else {//说明存在该商品对象,可以修改它了System. out. println("请您输入:”+ g.name +" 商品最新购买数量: ");int buyNumber = sc.nextInt();g. buyNumber = buyNumber;System. out. println("修改完成! ");queryGoods(shopCar);break;}}}public static Goods getGoodsById(Goods[] shopCar ,int id){// shopCar = [g1, g2, g3,null, null, ...] .for (int i = 0; i < shopCar .length; i++) {Goods g = shopCar[i];if(g != null){//判断这个商品对象的id是否是我们要找的if(g.id == id){return g;}}else {return null; //找完了全面存在的商品,都没有找到!}}return null; //代表找完了100个商品都没有找到id - -样的商品}public static void pay(Goods[] shopCar) {query6oods(shopCar);//1.定义一个求和变量累加金额double money =;// 2、遍历购物车数组中的全部商品对象,累加单价*数量// [g1, g2, null, ...1for (int i = 0; i < shopCar.length; i++) {Goods g = shopCar[i];if(g != null){money += (g.price * g. buyNumber);}else {break;}}System . out . println("订单总金额:"+ money);}/**完成商品添加到购物车的功能*/public static void addGoods(Goods[] shopCar ,Scanner sc) {// 1.录入用户输入的购买商品的信息。System. out.println("请您输入购买商品的编号(不重复) : ");int id = sc.nextInt();System. out.println("请您输入购买商品的名称: ");String name = sc.next();System. out . println("请您输入购买商品的数量: ");int buyNumber = sc.nextInt();System. out. println("请您输入购买商品的价格: ");doubLe price = sc.nextDouble();// 2、把这个购买商品的信息封装成一 个商品对象Goods g = new Goods();gl.id = id;g.name = name;g. buyNumber = buyNumber;g.price = price;// 3、把这个商品对象添加到购物车数组中去。// shopCar = [a, a2, null, ........]//						ifor (int i = 0; i < shopCar.length; i++) {if(shopCar[i] == null){//说明此位置没有元素存入,把我们新买的商品添加到此处即可shopCar[i] I g;break; //结束,因为商品已经成功存入了,不需要继续找位置了}}System. out. println("您的商品:”+ g.name +" 添加到购物车完成! ");}
}

15.5 构造器、this

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

this调用本类中的其他方法:指在普通成员方法中使用this调用另一个成员方法
this调用本类中的其他构造方法,调用时要放在构造方法的首行。

15.6 封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.7 标准JavaBean

在这里插入图片描述

15.8 成员变量、局部变量区别

在这里插入图片描述
在这里插入图片描述

15.9 面向对象综合案例

在这里插入图片描述
在这里插入图片描述

16 常用API(String、ArrayList)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1 String

16.1.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1.2 对象创建的原理

在这里插入图片描述
在这里插入图片描述

16.1.3 String类常见面试题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1.4 Stirng类常用API

在这里插入图片描述
在这里插入图片描述

String的equals比较,如果a.equals(b)的a是null会报空指针异常

在这里插入图片描述

public boolean contains(CharSequence s):判断传入字符串是否包含其中。
public boolean startsWith(String prefix):判断是否由传入字符串开头
public String[] split(String s):按照某个内容把字符串分割成字符串数组返回。

16.1.5 String案例:验证码、登录、隐私号码

在这里插入图片描述

public class StringExec6 {public static void main(String[] args) {// 1、定义可能出现的字符信息String datas = "abcdefghijkLmnopqrstuwxyZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 2、循环5次,每次生成- - 个随机的索引,提取对应的字符连接起来即可String code =“";Random r = new Random();for(inti=;i<5;i++){//随机一个索引int index = r.nextInt (datas . Length());char C = datas. charAt(index);code += c;}// 3.输出宇符串变量即可System. out. println(code);
}

在这里插入图片描述

	// 1、定义正确的登录名称和密码String okLoginName =” admin";String okPassword = " itheima";// 2、定义一个循环,循环3次,让用户登录Scanner sc = new Scanner(System.in);for(inti=1;i<=3;i++){System. out. println("请您输入登录名称: ");String loginName = sc.next();System. out. println("请您输入登录密码: ");String password = sc.next();// 3、判断登录是否成功! if (okLoginName . equals (loginName)){// 4、判断密码是否正确if(okPassword . equals(password)){System . out. printLn("登录成功!欢迎进入系统随意浏览~~~~");break;}else {//密码错误了System. out . println("您的密码不正确!您还剩余"+ (3 - i) +"次机会登录机会!");}}else {System. out. println("您的登录名称不正确!您还剩余"+ (3 - i) +"次机会登录机会!");}}

在这里插入图片描述

public class StringExec8 {public static void main(String[] args) {// 1、键盘录入一个手机号码Scanner sc = new Scanner(System. in);System. out. println("请您输入您的手机号码: ");String tel = sc.next();// 2、截取号码的前三位, 后四位 18665666520String before = tel. substring(0, 3); //日1 2String after = tel. substring(7); // 从索引7开始截取到手机号码的末尾String s = before + "****" + after;System. out . printLn(s);}
}

16.2 ArrayList

16.2.1 集合概述

数组变量输出是地址
集合变量输出是数据

在这里插入图片描述
在这里插入图片描述

16.2.2 ArrayList集合快速入门

在这里插入图片描述

16.2.3 ArrayList对于泛型的支持

在这里插入图片描述

16.2.4 ArrayList常用API、遍历

在这里插入图片描述

// 3、完成集合的遍历
for (int i =0; i < list.size(); i++) {System. out. println(list.get(i));
}

16.2.5 ArrayList集合案例

在这里插入图片描述

public class ArrayListTest4 {public static void main(String[] args) {//目标:学习遍历并删除元素的正确方案。// 1、创建一个ArrayList集合存储- -个班级学生的成绩ArrayList<Integer> scores = new ArrayList<>();scores . add(98);scores . add(77);scores. add(66);scores . add(89);scores . add(79);scores . add(50);scores . add(100);System . out . printLn(scores);// 2、把低于80分的成绩从集合中去掉。// scores = [98, 77, 66, 89,79, 50, 100]]// scores = [98, 66, 89, 50,100]// 									i// 有毛病的代码!// for (int i =日; i < scores.size(); i++) {// 	   int score = scores.get(i);//	   if(score < 80){//		      这个分数必须删除//			  scores. remove(i);//		}//	}//	System. out. printIn(scores);// 完关的方案之一for (int i = 0; i < scores.size(); i++) {int score = scores. get(i);if(score < 80){//这个分数必须删除scores. remove(i);i--; //删除成功后,必须退一步,这样可以保证下次回到这个位置,如此则不会跳过数据}}System . out . println(scores);// 完美的方案之二// 从后面倒着遍历再删除就可以。for (int i = scores.size() - 1; i >= 0;i--) {int score = scores.get(i);if(score < 80){scores. remove(i);}}System . out . println(scores); .}
}

17 ATM系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ATMSystme

package com.itheima;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;/**ATM系统的入口类。*/
public class ATMSystem {public static void main(String[] args) {// 1、定义账户类// 2、定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作。ArrayList<Account> accounts = new ArrayList<>();Scanner sc = new Scanner(System.in);// 3、展示系统的首页while (true) {System.out.println("===============黑马ATM系统=================");System.out.println("1、账户登录");System.out.println("2、账户开户");System.out.println("请您选择操作:");int command = sc.nextInt();switch (command){case 1:// 用户登录操作login(accounts, sc);break;case 2:// 用户账户开户(ALT + ENTER)register(accounts,sc);break;default:System.out.println("您输入的操作命令不存在~~");}}}/*** 登录功能* @param accounts 全部账户对象的集合* @param sc 扫描器*/private static void login(ArrayList<Account> accounts, Scanner sc) {System.out.println("===================系统登录操作========================");// 1、判断账户集合中是否存在账户,如果不存在账户,登录功能不能进行。if(accounts.size() == 0) {System.out.println("对不起,当前系统中,无任何账户,请先开户,再来登录~~");return; // 卫语言风格,解决方法的执行。}// 2、正式进入登录操作while (true) {System.out.println("请您输入登录卡号:");String cardId = sc.next();// 3、判断卡号是否存在:根据卡号去账户集合中查询账户对象。Account acc = getAccountByCardId(cardId, accounts);if(acc != null){while (true) {// 卡号存在的// 4、让用户输入密码,认证密码System.out.println("请您输入登录密码:");String passWord = sc.next();// 判断当前账户对象的密码是否与用户输入的密码一致if(acc.getPassWord().equals(passWord)) {// 登录成功了System.out.println("恭喜您," + acc.getUserName() +"先生/女生进入系统,您的卡号是:" + acc.getCardId());// .... 查询 转账 取款 ....// 展示登录后的操作页。showUserCommand(sc, acc, accounts);return; // 干掉登录方法}else {System.out.println("对不起,您输入的密码有误~~");}}}else {System.out.println("对不起,系统中不存在该账户卡号~~");}}}/**展示登录后的操作页*/private static void showUserCommand(Scanner sc, Account acc, ArrayList<Account> accounts) {while (true) {System.out.println("===============用户操作页===================");System.out.println("1、查询账户");System.out.println("2、存款");System.out.println("3、取款");System.out.println("4、转账");System.out.println("5、修改密码");System.out.println("6、退出");System.out.println("7、注销账户");System.out.println("请选择:");int command = sc.nextInt();switch (command) {case 1:// 查询账户(展示当前登录的账户信息)showAccount(acc);break;case 2:// 存款depositMoney(acc, sc);break;case 3:// 取款drawMoney(acc, sc);break;case 4:// 转账transferMoney(sc, acc, accounts);break;case 5:// 修改密码updatePassWord(sc, acc);return; // 让当前方法停止执行,跳出去case 6:// 退出System.out.println("退出成功,欢迎下次光临");return; // 让当前方法停止执行,跳出去case 7:// 注销账户if(deleteAccount(acc,sc,accounts)){// 销户成功了,回到首页return; // 让当前方法停止执行,跳出去}else {// 没有销户成功, 还是在操作页玩break;}default:System.out.println("您输入的操作命令不正确~~");}}}/*** 销户功能* @param acc* @param sc* @param accounts*/private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {System.out.println("===================用户销户========================");System.out.println("您真的要销户?y/n");String rs = sc.next();switch (rs) {case "y":// 真正的销户// 从当前账户集合中,删除当前账户对象,销毁就完成了。if(acc.getMoney() > 0){System.out.println("您账户中还有钱没有取完,不允许销户~");}else {accounts.remove(acc);System.out.println("您的账户销户完成~~");return true; // 销户成功}break;default:System.out.println("好的,当前账户继续保留~");}return false;}/*** 修改密码* @param sc 扫描器* @param acc 当前登录成功的账户对象。*/private static void updatePassWord(Scanner sc, Account acc) {System.out.println("===================用户密码修改========================");while (true) {System.out.println("请您输入当前密码:");String passWord = sc.next();// 1、判断这个密码是否正确if(acc.getPassWord().equals(passWord)){while (true) {// 密码正确// 2、输入新密码。System.out.println("请您输入新密码:");String newPassWord = sc.next();System.out.println("请您确认新密码:");String okPassWord = sc.next();if(newPassWord.equals(okPassWord)) {// 2次密码一致,可以修改了acc.setPassWord(newPassWord);System.out.println("恭喜您,您密码修改成功了~~");return;}else {System.out.println("您输入的2次密码不一致~~");}}}else {System.out.println("您输入的密码不正确~");}}}/*** 转账功能* @param sc 扫描器* @param acc  自己的账户对象* @param accounts 全部账户的集合。*/private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {System.out.println("===================用户转账操作========================");// 1、判断是否足够2个账户if(accounts.size() < 2){System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户吧~~");return; // 结束当前方法}// 2、判断自己的账户是否有钱if(acc.getMoney() == 0) {System.out.println("对不起,您自己都都没钱,就别转了吧~~");return;// 结束当前方法}while (true) {// 3、真正开始转账System.out.println("请您输入对方账户的卡号:");String cardId = sc.next();// 这个卡号不能是自己的卡号if(cardId.equals(acc.getCardId())){System.out.println("对不起,您不可以给自己进行转账~~");continue; // 结束当次执行,死循环进入下一次}// 判断这个卡号是存在的:根据这个卡号去查询对方账户对象。Account account = getAccountByCardId(cardId, accounts);if(account == null){System.out.println("对不起,您输入对方的这个账号不存在~~");}else {// 这个账户对象存在了:继续认证他的姓氏String userName = account.getUserName(); // 黑马周芷若String tip = "*" + userName.substring(1);System.out.println("请您输入["+ tip +"]的姓氏");String preName = sc.next();// 认证姓氏是否输入正确。if(userName.startsWith(preName)) {while (true) {// 认证通过,真正开始转账了System.out.println("请您输入转账金额:");double money = sc.nextDouble();// 判断余额是否足够if(money > acc.getMoney()) {System.out.println("对不起,您余额不足,您最多可以转账:" + acc.getMoney());}else {// 余额足够,可以转了acc.setMoney(acc.getMoney() - money);account.setMoney(account.getMoney() + money);System.out.println("转账成功!您的账户还剩余:" + acc.getMoney());return; // 直接干掉转账方法}}}else {System.out.println("对不起,您输入的信息有误~~");}}}}/*** 取钱功能* @param acc 当前账户对象* @param sc  扫描器*/private static void drawMoney(Account acc, Scanner sc) {System.out.println("===================用户取钱操作========================");// 1、判断是否足够100元。if(acc.getMoney() < 100) {System.out.println("对不起,当前账户中不够100元,不能取钱~");return;}while (true) {// 2、提示用户输入取钱金额System.out.println("请您输入取款金额:");double money = sc.nextDouble();// 3、判断这个金额是否满足要求。if(money > acc.getQuotaMoney()) {System.out.println("对不起,您当前取款金额超过每次限额,每次最多可取:" + acc.getQuotaMoney());}else {// 没有超过当次限额。// 4、判断是否超过了账户的总余额。if(money > acc.getMoney()){System.out.println("余额不足,您账户目前总余额是:" + acc.getMoney());}else {// 可以取钱了。System.out.println("恭喜您,取钱" + money +"元,成功!");// 更新余额acc.setMoney(acc.getMoney() - money);// 取钱结束了。showAccount(acc);return; // 干掉取钱方法}}}}/*** 存钱* @param acc 当前账户对象* @param sc  扫描器*/private static void depositMoney(Account acc, Scanner sc) {System.out.println("===================用户存钱操作========================");System.out.println("请您输入存款金额:");double money = sc.nextDouble();// 更新账户余额:原来的钱 + 新存入的钱acc.setMoney(acc.getMoney() + money);System.out.println("恭喜您,存钱成功,当前账户信息如下:");showAccount(acc);}/*** 展示账户信息* @param acc*/private static void showAccount(Account acc) {System.out.println("===================当前账户信息如下========================");System.out.println("卡号:" + acc.getCardId());System.out.println("户主:" + acc.getUserName());System.out.println("余额:" + acc.getMoney());System.out.println("限额:" + acc.getQuotaMoney());}/*** 用户开户功能的实现* @param accounts 接收的账户集合。*/private static void register(ArrayList<Account> accounts, Scanner sc) {System.out.println("===================系统开户操作========================");// 1、创建一个账户对象,用于后期封装账户信息。Account account = new Account();// 2、录入当前这个账户的信息,注入到账户对象中去。System.out.println("请您输入账户用户名:");String userName = sc.next();account.setUserName(userName);while (true) {System.out.println("请您输入账户密码:");String passWord = sc.next();System.out.println("请您输入确认密码:");String okPassWord = sc.next();if(okPassWord.equals(passWord)){// 密码认证通过,可以注入给账户对象account.setPassWord(okPassWord);break; // 密码已经录入成功了,死循环没有必要继续了!}else {System.out.println("对不起,您输入的2次密码不一致,请重新确认~~");}}System.out.println("请您输入账户当次限额:");double quotaMoney = sc.nextDouble();account.setQuotaMoney(quotaMoney);// 为账户随机一个8位且与其他账户的卡号不重复的号码。(独立功能,独立成方法)。String cardId = getRandomCardId(accounts);account.setCardId(cardId);// 3、把账户对象添加到账户集合中去。accounts.add(account);System.out.println("恭喜您," + userName + "先生/女生,您开户成功,您的卡号是:" + cardId + ",请您妥善保管卡号" );}/***  为账户生成8位与其他账户卡号不同的号码。* @return*/private static String getRandomCardId(ArrayList<Account> accounts) {Random r = new Random();while (true) {// 1、先生成8位数字String cardId = ""; // 03442522for (int i = 0; i < 8; i++) {cardId += r.nextInt(10);}// 2、判断这个8位的卡号是否与其他账户的卡号重复了。// 根据这个卡号去查询账户的对象Account acc = getAccountByCardId(cardId, accounts);if(acc == null){// 说明cardId 此时没有重复,这个卡号是一个新卡号了,可以使用这个卡号作为新注册账户的卡号了return cardId;}}}/*** 根据卡号查询出一个账户对象出来* @param cardId  卡号* @param accounts 全部账户的集合* @return  账户对象 | null*/private static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){for (int i = 0; i < accounts.size(); i++) {Account acc = accounts.get(i);if(acc.getCardId().equals(cardId)){return acc;}}return null; // 查无此账户}
}

Account

package com.itheima;/**账户类*/
public class Account {/**成员变量,私有*/private String cardId;private String userName; // 用户名private String passWord; // 密码private double money; // 账户余额private double quotaMoney; // 每次取现额度public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public double getQuotaMoney() {return quotaMoney;}public void setQuotaMoney(double quotaMoney) {this.quotaMoney = quotaMoney;}
}

18、static静态关键字

18.1 static是什么、修饰成员变量的用法

在这里插入图片描述
在这里插入图片描述

同一个类中,静态成员变量的访问可以省略类名

18.2 static修饰成员变量的内存原理

在这里插入图片描述

18.3 static修饰成员方法的基本用法

在这里插入图片描述

18.4 static修饰成员方法的内存原理

在这里插入图片描述

18.5 static注意事项

在这里插入图片描述

18.6 工具类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习1

public class ArrayUtil {/**私有构造器*/private ArrayUtil({}/**工具方法:静态方法*/public static string toString(int[ ] arr){// 1、一些校验if(arr == null){return null;}//2、拼接内容并返回arr = {}string result = "[";for (int i = 0; i < arr.length; i++) {result +=(i == arr.length - 1 ? arr[i] : arr[i] + ",");}result +=]";return result;}
}// 测试类
public class TestDemo2 {public static void main(String[ ] args) {int[ ] arr = null;int[ ] arr1 = {};int[ ] arr2 = {12234499};system.out.printin(ArrayUtil.toString(arr));system.out.println(ArrayUtil.toString(arr1));system.out.println(ArrayUtil.toString(arr2));}
}

18.7 代码块

在这里插入图片描述
在这里插入图片描述

/**1、定义一个静态的集合,这样这个集合只加载 一个。因为当前房间只需要一副牌。*/public static ArrayList<String> cards = new ArrayList<>();/**2、在程序真正运行main方法前,把54张牌放进去吧,后续游戏可以直接使用了。*/static {// 3、正式做牌,放到集合中去。// a、定义一个数组存储全部点数:类型确定了,个数确定了。String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};// b、定义一个数组存储全部的花色:类型确定了,个数确定了。String[] colors = {"♥", "♠", "♦", "♣"};// c、遍历点数for (int i = 0; i < sizes.length; i++) {// sizes[i]// d、遍历花色for (int j = 0; j < colors.length; j++) {// colors[j]// 一张牌String card = sizes[i] + colors[j];cards.add(card);}}// e、单独加入大小王。cards.add("小🃏");cards.add("大🃏");}public static void main(String[] args) {// 目标:模拟游戏启动前,初始化54张牌数据。System.out.println("新牌:" + cards);}

18.9 单例模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public static singleInstance2 getInstance() {if(instance == null){// 第一次来拿对象﹔此时需要创建对象。instance = new singleInstance2((;}return instance;
}

19 继承

19.1 概述、案例

子类继承父类除构造方法的所有成员,对于私有成员,简而言之:只是拥有但不能使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19.2 特点、访问特点、方法重写

在这里插入图片描述

疑问?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19.3 构造器特点、this、super小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20、语法

20.1 包

20.2 权限修饰符

在这里插入图片描述

对于“不同包下的子类”不清楚原理,从21:00看起https://www.bilibili.com/video/BV1Cv411372m/?p=105&spm_id_from=pageDriver&vd_source=5061eb5d9c29eda75a5e1981cbcb4d12

在这里插入图片描述

20.3 final的语法

在这里插入图片描述

20.4 常量、常量在开发中的作用

在这里插入图片描述
在这里插入图片描述

20.5 枚举、枚举作用

在这里插入图片描述
在这里插入图片描述

详细链接:https://blog.csdn.net/weixin_52385232/article/details/125430591

在这里插入图片描述

21、抽象类

21.1 概述

在这里插入图片描述
在这里插入图片描述

首先先来说一下抽象类
要想了解抽象类先看一下抽象方法,抽象方法是一个特殊的方法,他只有声明没有具体的实现。抽象方法用abstract关键字修饰。有抽象方法的类就就是抽象类,抽象类也有abstract关键字修饰。
需要注意的是,
1,抽象类的存在就是为了继承,所以用private方法来修饰抽象方法。
2,包含抽象方法的类叫做抽象类,但并不是抽象类里只有抽象方法。可以有正常变量和方法
3,子类继承了抽象类必须实现父类的抽象方法,如果没有实现,那么子类也将会是抽象类。
4,抽象类不能用来创建对象。
再来看一下接口:
接口用关键字interface来实现,接口指的是调用别人的方法或者函数。接口可以看出java是一种对行为的抽象。
接口需要注意的是:
1,接口中可以有变量和方法,并且接口中的变量会被隐式的被public static final来修饰(并且只能用public static final来修饰),方法会隐式的被public abstract来修饰,并且只能用来public abstract来修饰。也就是说接口中所有的方法不能有实现方法,也就是说接口中的方法都是抽象方法。
2,如果要写这个接口的实现方法,需要定义一个实现类,并且通过implements来实现接口中的方法。
重点来了,看完上面就可以看出接口和抽象类的区别了。
主要区别:
 1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
  3)抽象类是一个类,而接口不是类。

在这里插入图片描述

21.2 案例

在这里插入图片描述

21.3 特点

在这里插入图片描述
在这里插入图片描述

21.4 模板方法模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

22、接口

22.1 概述

在这里插入图片描述

22.2 多实现

在这里插入图片描述

22.3 多继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

22.4 JKD8后接口新增方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • java中的接口,不经可以定义抽象方法,也可以定义非抽象方法
  • 抽象方法和以前一样,默认加上public abstract,不能有方法体
  • 非抽象方法,必须有方法体,声明上必须加上default或者static

在这里插入图片描述

22.5 注意事项

在这里插入图片描述

23、多态

23.1 概述

在这里插入图片描述

23.2 优势

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

23.3 类型转换问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

23.4 综合案例

在这里插入图片描述

Use接口

package com.itheima.d4_polymorphic_test;public interface USB {void connect();void unconnect();
}

键盘类

package com.itheima.d4_polymorphic_test;/**实现类(子类)*/
public class KeyBoard implements USB{private String name;public KeyBoard(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功的接入了设备了~~~");}@Overridepublic void unconnect() {System.out.println(name + "成功的从设备弹出了~~~");}/**独有功能*/public void keyDown(){System.out.println(name + "写下了:老铁,6666,下次再来哦,老弟~~~~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

鼠标类

package com.itheima.d4_polymorphic_test;/**实现类(子类)*/
public class Mouse implements USB{private String name;public Mouse(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功的接入了设备了~~~");}@Overridepublic void unconnect() {System.out.println(name + "成功的从设备弹出了~~~");}/**独有功能*/public void click(){System.out.println(name + "双击点亮小红心~~~~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

电脑类

package com.itheima.d4_polymorphic_test;public class Computer {/**提供一个安装的入口:行为。*/public void installUSB(USB u){u.connect();// 独有功能if(u instanceof Mouse){Mouse m = (Mouse) u;m.click();}else if(u instanceof KeyBoard) {KeyBoard k = (KeyBoard) u;k.keyDown();}u.unconnect();}
}

测试类

package com.itheima.d4_polymorphic_test;/**目标:USB设备模拟1、定义USB接口:接入 拔出2、定义2个USB的实现类:鼠标、键盘。3、创建一个电脑对象,创建USB设备对象,安装启动。*/
public class Test {public static void main(String[] args) {// a、创建电脑对象Computer c = new Computer();// b、创建USB设备对象USB u = new Mouse("罗技鼠标");c.installUSB(u);USB k = new KeyBoard("双飞燕键盘");c.installUSB(k);}}

24、内部类

在这里插入图片描述

类实际上分为外部类和内部类(inner class),一般的类都是外部类,内部类需要依赖外部类生成,内部类可以用各种访问修饰符修饰
但是外部类只能用public、default修饰,不能用private、protected修饰
why?
我们使用访问修饰符去修饰类,就是为了让类之间根据各种权限来访问。
假如外部类使用private修饰,则不能被其它类所访问,这个类也就失去了意义。
假如外部类使用protected修饰,看起来与default相比,在包内可访问的基础上,包外的子类也可访问。但包外想成为子类需要先继承父类,然而无法找到该父类实际上无法继承(先有鸡还是先有蛋的问题),效果与default一致,也就没必要存在了。

在这里插入图片描述

24.1 静态内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

24.2 成员内部类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

24.3 局部内部类

在这里插入图片描述
在这里插入图片描述

24.4 匿名内部类

在这里插入图片描述

匿名内部类常见使用形式

在这里插入图片描述

package com.itheima.d8_innerclass_anonymous;/**目标:掌握匿名内部类的使用形式(语法)*/
public class Test2 {public static void main(String[] args) {Swimming s = new Swimming() {@Overridepublic void swim() {System.out.println("学生快乐的自由泳🏊‍");}};go(s);System.out.println("--------------");Swimming s1 = new Swimming() {@Overridepublic void swim() {System.out.println("老师泳🏊的贼快~~~~~");}};go(s1);System.out.println("--------------");go(new Swimming() {@Overridepublic void swim() {System.out.println("运动员🏊的贼快啊~~~~~");}});}/**学生 老师 运动员可以一起参加游泳比赛*/public static void go(Swimming s){System.out.println("开始。。。");s.swim();System.out.println("结束。。。");}
}interface Swimming{void swim();
}

在这里插入图片描述

25、常用API

在这里插入图片描述

25.1 Object

在这里插入图片描述

方法一解释

在这里插入图片描述

方法二解释

在这里插入图片描述

equals()和==的区别:
==
基本类型:对比它们的值是否相等
引用类型:对比它们的内存地址是否相等
equals()
引用类型:默认情况下,对比它们的地址是否相等;如果equals()方法被重写,则根据重写过程来比较(比如String的equals)

25.2 Objects

在这里插入图片描述
在这里插入图片描述

25.3 StringBuilder

StringBuffer和StringBuilder区别:https://www.runoob.com/java/java-stringbuffer.html

在这里插入图片描述
在这里插入图片描述

package com.itheima.d11_api_stringbuilder;/**目标:学会使用StringBuilder操作字符串,最终还需要知道它性能好的原因*/
public class StringBuilderDemo1 {public static void main(String[] args) {StringBuilder sb = new StringBuilder(); // ""sb.append("a");sb.append("b");sb.append("c");sb.append(1);sb.append(false);sb.append(3.3);sb.append("abc");System.out.println(sb);StringBuilder sb1 = new StringBuilder();// 支持链式编程sb1.append("a").append("b").append("c").append("我爱你中国");System.out.println(sb1);// 反转sb1.reverse().append("110");System.out.println(sb1);System.out.println(sb1.length());// 注意:StringBuilder只是拼接字符串的手段:效率好。// 最终的目的还是要恢复成String类型。StringBuilder sb2 = new StringBuilder();sb2.append("123").append("456");// 恢复成String类型String rs = sb2.toString();check(rs);}public static void check(String data){System.out.println(data);}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.d11_api_stringbuilder;public class StringBuilderTest2 {public static void main(String[] args) {int[] arr1 = null;System.out.println(toString(arr1));int[] arr2 = {10, 88, 99};System.out.println(toString(arr2));int[] arr3 = {};System.out.println(toString(arr3));}/**1、定义方法接收任意整型数组,返回数组内容格式*/public static String toString(int[] arr){if(arr != null){// 2、开始拼接内容。StringBuilder sb = new StringBuilder("[");for (int i = 0; i < arr.length; i++) {sb.append(arr[i] ).append(i == arr.length - 1 ? "" : ", ");}sb.append("]");return sb.toString();}else {return null;}}
}

25.4 Math

在这里插入图片描述

25.5 System

在这里插入图片描述
在这里插入图片描述

package com.itheima.d13_system;import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Arrays;/**目标:System系统类的使用。System代表当前系统。(虚拟机系统)静态方法:1.public static void exit(int status):终止JVM虚拟机,非0是异常终止。2.public static long currentTimeMillis():获取当前系统此刻时间毫秒值。(重点)3.可以做数组的拷贝。arraycopy(Object var0, int var1, Object var2, int var3, int var4);* 参数一:原数组* 参数二:从原数组的哪个位置开始赋值。* 参数三:目标数组* 参数四:赋值到目标数组的哪个位置* 参数五:赋值几个。*/
public class SystemDemo {public static void main(String[] args) {System.out.println("程序开始。。。");// System.exit(0); // JVM终止!// 2、计算机认为时间有起源:返回1970-1-1 00:00:00 走到此刻的总的毫秒值:时间毫秒值。long time = System.currentTimeMillis();System.out.println(time);long startTime = System.currentTimeMillis();// 进行时间的计算:性能分析for (int i = 0; i < 100000; i++) {System.out.println("输出:" + i);}long endTime = System.currentTimeMillis();System.out.println((endTime - startTime)/1000.0 + "s");// 3、做数组拷贝(了解)/**arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length)参数一:被拷贝的数组参数二:从哪个索引位置开始拷贝参数三:复制的目标数组参数四:粘贴位置参数五:拷贝元素的个数*/int[] arr1 = {10, 20, 30, 40, 50, 60, 70};int[] arr2 = new int[6]; // [0, 0, 0, 0, 0, 0] ==>  [0, 0, 40, 50, 60, 0]System.arraycopy(arr1, 3, arr2, 2, 3);System.out.println(Arrays.toString(arr2));System.out.println("程序结束。。。。");}
}

25.6 BigDecimal

在这里插入图片描述
在这里插入图片描述

package com.itheima.d14_bigdecimal;import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;/**目标:BigDecimal大数据类。引入:浮点型运算的时候直接+  * / 可能会出现数据失真(精度问题)。BigDecimal可以解决浮点型运算数据失真的问题。BigDicimal类:包:java.math.创建对象的方式(最好的方式:)public static BigDecimal valueOf(double val) :包装浮点数成为大数据对象。方法声明public BigDecimal add(BigDecimal value)       加法运算public BigDecimal subtract(BigDecimal value)  减法运算 public BigDecimal multiply(BigDecimal value)  乘法运算 public BigDecimal divide(BigDecimal value)    除法运算public double doubleValue(): 把BigDecimal转换成double类型。*/
public class BigDecimalDemo {public static void main(String[] args) {// 浮点型运算的时候直接+  * / 可能会出现数据失真(精度问题)。System.out.println(0.09 + 0.01);System.out.println(1.0 - 0.32);System.out.println(1.015 * 100);System.out.println(1.301 / 100);System.out.println("-------------------------");double a = 0.1;double b = 0.2;double c = a + b;System.out.println(c);System.out.println("--------------------------");// 包装浮点型数据成为大数据对象 BigDeciamlBigDecimal a1 = BigDecimal.valueOf(a);BigDecimal b1 = BigDecimal.valueOf(b);BigDecimal c1 = a1.add(b1);// BigDecimal c1 = a1.subtract(b1);// BigDecimal c1 = a1.multiply(b1);// BigDecimal c1 = a1.divide(b1);System.out.println(c1);// 目的:doubledouble rs = c1.doubleValue();System.out.println(rs);// 注意事项:BigDecimal是一定要精度运算的BigDecimal a11 = BigDecimal.valueOf(10.0);BigDecimal b11 = BigDecimal.valueOf(3.0);/**参数一:除数 参数二:保留小数位数  参数三:舍入模式*/BigDecimal c11 = a11.divide(b11, 2, RoundingMode.HALF_UP); // 3.3333333333System.out.println(c11);System.out.println("-------------------");}
}

26、日期与时间

26.1 Date

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

26.2 SimpleDateFormat

在这里插入图片描述

这样子做不符合实际大众看时间标准

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.d2_simpledateformat;import javax.xml.crypto.Data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class SimpleDateFormatDemo2 {public static void main(String[] args) throws ParseException {// 目标: 学会使用SimpleDateFormat解析字符串时间成为日期对象。// 有一个时间 2021年08月06日 11:11:11 往后 2天 14小时 49分 06秒后的时间是多少。// 1、把字符串时间拿到程序中来String dateStr = "2021年08月06日 11:11:11";// 2、把字符串时间解析成日期对象(本节的重点):形式必须与被解析时间的形式完全一样,否则运行时解析报错!SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date d = sdf.parse(dateStr);// 3、往后走2天 14小时 49分 06秒long time = d.getTime() + (2L*24*60*60 + 14*60*60 + 49*60 + 6) * 1000;// 4、格式化这个时间毫秒值就是结果System.out.println(sdf.format(time));}
}

在这里插入图片描述

package com.itheima.d2_simpledateformat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class SimpleDateFormatTest3 {public static void main(String[] args) throws ParseException {// 1、开始 和 结束时间String startTime = "2021-11-11 00:00:00";String endTime = "2021-11-11 00:10:00";// 2、小贾 小皮String xiaoJia =  "2021-11-11 00:03:47";String xiaoPi =  "2021-11-11 00:10:11";// 3、解析他们的时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d1 = sdf.parse(startTime);Date d2 = sdf.parse(endTime);Date d3 = sdf.parse(xiaoJia);Date d4 = sdf.parse(xiaoPi);if(d3.after(d1) && d3.before(d2)){System.out.println("小贾秒杀成功,可以发货了!");}else {System.out.println("小贾秒杀失败!");}if(d4.after(d1) && d4.before(d2)){System.out.println("小皮秒杀成功,可以发货了!");}else {System.out.println("小皮秒杀失败!");}}
}

26.3 Calendar

在这里插入图片描述
在这里插入图片描述

27、JDK8开始新增日期API

在这里插入图片描述

27.1 LocalTime、LocalDate、LocalDateTime

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.d4_jdk8_time;import java.time.LocalDate;
import java.time.LocalTime;
import java.time.MonthDay;public class Demo04UpdateTime {public static void main(String[] args) {LocalTime nowTime = LocalTime.now();System.out.println(nowTime);//当前时间System.out.println(nowTime.minusHours(1));//一小时前System.out.println(nowTime.minusMinutes(1));//一分钟前System.out.println(nowTime.minusSeconds(1));//一秒前System.out.println(nowTime.minusNanos(1));//一纳秒前System.out.println("----------------");System.out.println(nowTime.plusHours(1));//一小时后System.out.println(nowTime.plusMinutes(1));//一分钟后System.out.println(nowTime.plusSeconds(1));//一秒后System.out.println(nowTime.plusNanos(1));//一纳秒后System.out.println("------------------");// 不可变对象,每次修改产生新对象!System.out.println(nowTime);System.out.println("---------------");LocalDate myDate = LocalDate.of(2018, 9, 5);LocalDate nowDate = LocalDate.now();System.out.println("今天是2018-09-06吗? " + nowDate.equals(myDate));//今天是2018-09-06吗? falseSystem.out.println(myDate + "是否在" + nowDate + "之前? " + myDate.isBefore(nowDate));//2018-09-05是否在2018-09-06之前? trueSystem.out.println(myDate + "是否在" + nowDate + "之后? " + myDate.isAfter(nowDate));//2018-09-05是否在2018-09-06之后? falseSystem.out.println("---------------------------");// 判断今天是否是你的生日LocalDate birDate = LocalDate.of(1996, 8, 5);LocalDate nowDate1 = LocalDate.now();MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());MonthDay nowMd = MonthDay.from(nowDate1);System.out.println("今天是你的生日吗? " + birMd.equals(nowMd));//今天是你的生日吗? false}
}

27.2 Instant

在这里插入图片描述

package com.itheima.d4_jdk8_time;import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;public class Demo05Instant {public static void main(String[] args) {// 1、得到一个Instant时间戳对象,是格林尼治时间,世界标准时间,与北京时间相比差了8小时Instant instant = Instant.now();System.out.println(instant);// 2、系统此刻的时间戳怎么办?Instant instant1 = Instant.now();System.out.println(instant1.atZone(ZoneId.systemDefault()));// 3、如何去返回Date对象,默认当前系统时区Date date = Date.from(instant);System.out.println(date);Instant i2 = date.toInstant();System.out.println(i2);}
}

27.3 DateTimeFormatter

在这里插入图片描述

27.4 Duration、Period

在这里插入图片描述
在这里插入图片描述

27.5 ChronoUnit

在这里插入图片描述

28、包装类

在这里插入图片描述
在这里插入图片描述

29、正则表达式

29.1 概述、初体验

在这里插入图片描述

package com.itheima.d6_regex;public class RegexDemo1 {public static void main(String[] args) {// 需求:校验qq号码,必须全部数字 6 - 20位System.out.println(checkQQ("251425998"));System.out.println(checkQQ("2514259a98"));System.out.println(checkQQ(null));System.out.println(checkQQ("2344"));System.out.println("-------------------------");// 正则表达式的初体验:System.out.println(checkQQ2("251425998"));System.out.println(checkQQ2("2514259a98"));System.out.println(checkQQ2(null));System.out.println(checkQQ2("2344"));}public static boolean checkQQ2(String qq){return qq != null && qq.matches("\\d{6,20}");}public static boolean checkQQ(String qq){// 1、判断qq号码的长度是否满足要求if(qq == null || qq.length() < 6 || qq.length() > 20 ) {return false;}// 2、判断qq中是否全部是数字,不是返回false//  251425a87for (int i = 0; i < qq.length(); i++) {// 获取每位字符char ch = qq.charAt(i);// 判断这个字符是否不是数字,不是数字直接返回falseif(ch < '0' || ch > '9') {return false;}}return true; // 肯定合法了!}
}

29.2 匹配规则

在API文档中搜索Pattern

package com.itheima.d6_regex;/**目标:全面、深入学习正则表达式的规则*/
public class RegexDemo02 {public static void main(String[] args) {//public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true// 只能是 a  b  cSystem.out.println("a".matches("[abc]")); // trueSystem.out.println("z".matches("[abc]")); // false// 不能出现a  b  cSystem.out.println("a".matches("[^abc]")); // falseSystem.out.println("z".matches("[^abc]")); // trueSystem.out.println("a".matches("\\d")); // falseSystem.out.println("3".matches("\\d")); // trueSystem.out.println("333".matches("\\d")); // falseSystem.out.println("z".matches("\\w")); // trueSystem.out.println("2".matches("\\w")); // trueSystem.out.println("21".matches("\\w")); // falseSystem.out.println("你".matches("\\w")); //falseSystem.out.println("你".matches("\\W")); // trueSystem.out.println("---------------------------------");//  以上正则匹配只能校验单个字符。// 校验密码// 必须是数字 字母 下划线 至少 6位System.out.println("2442fsfsf".matches("\\w{6,}"));System.out.println("244f".matches("\\w{6,}"));// 验证码 必须是数字和字符  必须是4位System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));System.out.println("23dF".matches("[\\w&&[^_]]{4}"));System.out.println("23_F".matches("[\\w&&[^_]]{4}"));}
}

29.3 常见案例

在这里插入图片描述

package com.itheima.d6_regex;import java.util.Arrays;
import java.util.Scanner;public class RegexTest3 {public static void main(String[] args) {// 目标:校验 手机号码 邮箱  电话号码// checkPhone();// checkEmail();// checkTel();// 同学可以完成校验金额是否格式金额: 99  0.5  99.5  019   | 0.3.3int[] arr = {10, 4, 5,3, 4,6,  2};System.out.println(Arrays.binarySearch(arr, 2));}public static void checkTel(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入您的电话号码:");String tel = sc.next();// 判断邮箱格式是否正确   027-3572457  0273572457if(tel.matches("0\\d{2,6}-?\\d{5,20}")){System.out.println("格式正确,注册完成!");break;}else {System.out.println("格式有误!");}}}public static void checkEmail(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入您的注册邮箱:");String email = sc.next();// 判断邮箱格式是否正确   3268847878@qq.com// 判断邮箱格式是否正确   3268847dsda878@163.com// 判断邮箱格式是否正确   3268847dsda878@pci.com.cnif(email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){System.out.println("邮箱格式正确,注册完成!");break;}else {System.out.println("格式有误!");}}}public static void checkPhone(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入您的注册手机号码:");String phone = sc.next();// 判断手机号码的格式是否正确if(phone.matches("1[3-9]\\d{9}")){System.out.println("手机号码格式正确,注册完成!");break;}else {System.out.println("格式有误!");}}}
}

29.4 在方法中的应用

在这里插入图片描述

package com.itheima.d6_regex;
/**目标:正则表达式在方法中的应用。public String[] split(String regex):-- 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。public String replaceAll(String regex,String newStr)-- 按照正则表达式匹配的内容进行替换*/
public class RegexDemo04 {public static void main(String[] args) {String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";String[] arrs = names.split("\\w+");for (int i = 0; i < arrs.length; i++) {System.out.println(arrs[i]);}String names2 = names.replaceAll("\\w+", "  ");System.out.println(names2);}
}

29.5 爬取信息

在这里插入图片描述

30、Arrays类

在这里插入图片描述
请添加图片描述

ArraysDemo2.java

package com.itheima.d7_arrays;import java.util.Arrays;
import java.util.Comparator;public class ArraysDemo2 {public static void main(String[] args) {// 目标:自定义数组的排序规则:Comparator比较器对象。// 1、Arrays的sort方法对于有值特性的数组是默认升序排序int[] ages = {34, 12, 42, 23};Arrays.sort(ages);System.out.println(Arrays.toString(ages));// 2、需求:降序排序!(自定义比较器对象,只能支持引用类型的排序!!)Integer[] ages1 = {34, 12, 42, 23};/**参数一:被排序的数组 必须是引用类型的元素参数二:匿名内部类对象,代表了一个比较器对象。*/Arrays.sort(ages1, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 指定比较规则。
//                if(o1 > o2){
//                    return 1;
//                }else if(o1 < o2){
//                    return -1;
//                }
//                return 0;// return o1 - o2; // 默认升序return o2 - o1; //  降序}});System.out.println(Arrays.toString(ages1));System.out.println("-------------------------");Student[] students = new Student[3];students[0] = new Student("吴磊",23 , 175.5);students[1] = new Student("谢鑫",18 , 185.5);students[2] = new Student("王亮",20 , 195.5);System.out.println(Arrays.toString(students));// Arrays.sort(students);  // 直接运行奔溃Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// 自己指定比较规则// return o1.getAge() - o2.getAge(); // 按照年龄升序排序!// return o2.getAge() - o1.getAge(); // 按照年龄降序排序!!// return Double.compare(o1.getHeight(), o2.getHeight()); // 比较浮点型可以这样写 升序return Double.compare(o2.getHeight(), o1.getHeight()); // 比较浮点型可以这样写  降序}});System.out.println(Arrays.toString(students));}
}

Student.java

package com.itheima.d7_arrays;public class Student {private String name;private int age;private double height;public Student() {}public Student(String name, int age, double height) {this.name = name;this.age = age;this.height = height;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}

31、常见算法

31.1 选择排序

在这里插入图片描述

31.2 二分查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

32、Lambda表达式

32.1 概述

在这里插入图片描述

32.2 实战-简化常见函数式接口

在这里插入图片描述

package com.itheima.d9_lambda;public class LambdaDemo2 {public static void main(String[] args) {// 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式// 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口)
//        Swimming s1 = new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("老师游泳贼溜~~~~~");
//            }
//        };//        Swimming s1 = () -> {
//            System.out.println("老师游泳贼溜~~~~~");
//        };Swimming s1 = () -> System.out.println("老师游泳贼溜~~~~~");go(s1);System.out.println("---------------------");
//        go(new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("学生游泳很开心~~~");
//            }
//        });//        go(() ->{
//                System.out.println("学生游泳很开心~~~");
//        });go(() -> System.out.println("学生游泳很开心~~~"));}public static void go(Swimming s){System.out.println("开始。。。");s.swim();System.out.println("结束。。。");}
}@FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
interface Swimming{void swim();
}

在这里插入图片描述

32.3 表达式的省略规则

在这里插入图片描述

33、集合

33.1 概述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

33.2 collection集合的体系特点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.3 Collection集合常用API

在这里插入图片描述

33.4 collection集合的遍历方式

第一种

在这里插入图片描述
在这里插入图片描述

第二种

在这里插入图片描述
在这里插入图片描述

第三种

在这里插入图片描述

33.5 Collection集合存储自定义类型的对象

在这里插入图片描述

Movies.java

package com.itheima.d4_collection_object;public class Movie {private String name;private double score;private String actor;public Movie() {}public Movie(String name, double score, String actor) {this.name = name;this.score = score;this.actor = actor;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}@Overridepublic String toString() {return "Movie{" +"name='" + name + '\'' +", score=" + score +", actor='" + actor + '\'' +'}';}
}

TestDemo.java

package com.itheima.d4_collection_object;import java.util.ArrayList;
import java.util.Collection;public class TestDemo {public static void main(String[] args) {// 1、定义一个电影类// 2、定义一个集合对象存储3部电影对象Collection<Movie> movies = new ArrayList<>();movies.add(new Movie("《你好,李焕英》", 9.5, "张小斐,贾玲,沈腾,陈赫"));movies.add(new Movie("《唐人街探案》", 8.5, "王宝强,刘昊然,美女"));movies.add(new Movie("《刺杀小说家》",8.6, "雷佳音,杨幂"));System.out.println(movies);// 3、遍历集合容器中的每个电影对象for (Movie movie : movies) {System.out.println("片名:" + movie.getName());System.out.println("得分:" + movie.getScore());System.out.println("主演:" + movie.getActor());}}
}

33.6 常见数据结构

33.6.1 概述、栈、队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.6.2 数组

在这里插入图片描述

33.6.3 链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.6.4 二叉树、二叉查找树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.6.5 平衡二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.6.6 红黑树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

范例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.7 List系列集合

33.7.1 List集合特点、特有API

在这里插入图片描述
在这里插入图片描述

33.8.2 List集合的遍历方式小结

在这里插入图片描述

33.8.3 ArrayList集合的底层原理

在这里插入图片描述

33.8.4 LinkedList集合的底层原理

在这里插入图片描述
在这里插入图片描述

33.8 补充知识:集合的并发修改异常问题

在这里插入图片描述

33.9 补充知识:泛型深入

33.9.1 泛型的概述和优势

在这里插入图片描述
在这里插入图片描述

33.9.2 自定义泛型类

在这里插入图片描述

33.9.3 自定义泛型方法

在这里插入图片描述

33.9.4 自定义泛型接口

在这里插入图片描述

33.9.5 泛型通配符、上下限

在这里插入图片描述

33.10 Set系列集合

33.10.1 Set系列集系概述

在这里插入图片描述

33.10.2 HashSet元素无序的底层原理:哈希表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.10.3HashSet元素去重复的底层原理

在这里插入图片描述
在这里插入图片描述

Student.java

package com.itheima.d1_collection_set;import java.util.Objects;public class Student {private String name;private int age;private char sex;public Student() {}public Student(String name, int age, char sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}/**只要2个对象内容一样,结果一定是true* @param o* @return*/@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && sex == student.sex && Objects.equals(name, student.name);}/**s1 = new Student("无恙", 20, '男')s2 = new Student("无恙", 20, '男')s3 = new Student("周雄", 21, '男')*/@Overridepublic int hashCode() {return Objects.hash(name, age, sex);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex=" + sex +'}';}
}

Test.java

package com.itheima.d1_collection_set;import java.util.HashSet;
import java.util.Set;/**目标:让Set集合把重复内容的对象去掉一个(去重复)*/
public class SetDemo3 {public static void main(String[] args) {// Set集合去重复原因:先判断哈希值算出来的存储位置是否相同 再判断equalsSet<Student> sets = new HashSet<>();Student s1 = new Student("无恙", 20, '男');Student s2 = new Student("无恙", 20, '男');Student s3 = new Student("周雄", 21, '男');System.out.println(s1.hashCode());System.out.println(s2.hashCode());System.out.println(s3.hashCode());sets.add(s1);sets.add(s2);sets.add(s3);System.out.println(sets);}
}

33.10.4 实现类: LinkedHashset

在这里插入图片描述

33.10.5 实现类:TreeSet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Apple.java

package com.itheima.d1_collection_set;public class Apple implements Comparable<Apple>{private String name;private String color;private double price;private int weight;public Apple() {}public Apple(String name, String color, double price, int weight) {this.name = name;this.color = color;this.price = price;this.weight = weight;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "Apple{" +"name='" + name + '\'' +", color='" + color + '\'' +", price=" + price +", weight=" + weight +'}';}/**方式一:类自定义比较规则o1.compareTo(o2)* @param o* @return*/@Overridepublic int compareTo(Apple o) {// 按照重量进行比较的return this.weight - o.weight ; // 去重重量重复的元素// return this.weight - o.weight >= 0 ? 1 : -1; // 保留重量重复的元素}
}

Test.java

package com.itheima.d1_collection_set;import java.util.Set;
import java.util.TreeSet;/**目标:观察TreeSet对于有值特性的数据如何排序。学会对自定义类型的对象进行指定规则排序*/
public class SetDemo5 {public static void main(String[] args) {Set<Integer> sets = new TreeSet<>(); // 不重复 无索引 可排序sets.add(23);sets.add(24);sets.add(12);sets.add(8);System.out.println(sets);Set<String> sets1 = new TreeSet<>(); // 不重复 无索引 可排序sets1.add("Java");sets1.add("Java");sets1.add("angela");sets1.add("黑马");sets1.add("Java");sets1.add("About");sets1.add("Python");sets1.add("UI");sets1.add("UI");System.out.println(sets1);System.out.println("------------------------------");// 方式二:集合自带比较器对象进行规则定制//
//        Set<Apple> apples = new TreeSet<>(new Comparator<Apple>() {
//            @Override
//            public int compare(Apple o1, Apple o2) {
//                // return o1.getWeight() - o2.getWeight(); // 升序
//                // return o2.getWeight() - o1.getWeight(); // 降序
//                // 注意:浮点型建议直接使用Double.compare进行比较
//                // return Double.compare(o1.getPrice() , o2.getPrice()); // 升序
//                return Double.compare(o2.getPrice() , o1.getPrice()); // 降序
//            }
//        });Set<Apple> apples = new TreeSet<>(( o1,  o2) ->  Double.compare(o2.getPrice() , o1.getPrice())  );apples.add(new Apple("红富士", "红色", 9.9, 500));apples.add(new Apple("青苹果", "绿色", 15.9, 300));apples.add(new Apple("绿苹果", "青色", 29.9, 400));apples.add(new Apple("黄苹果", "黄色", 9.8, 500));System.out.println(apples);}
}

在这里插入图片描述

33.11 Collection体系的特点、使用场景总结补充知识:可变参数

在这里插入图片描述

在这里插入图片描述

package com.itheima.d2_params;import java.util.Arrays;
public class MethodDemo {public static void main(String[] args) {sum(); // 1、不传参数sum(10); // 2、可以传输一个参数sum(10, 20, 30); // 3、可以传输多个参数sum(new int[]{10, 20, 30, 40, 50}); // 4、可以传输一个数组}/**注意:一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面* @param nums*/public static void sum(  int...nums){// 注意:可变参数在方法内部其实就是一个数组。 numsSystem.out.println("元素个数:" + nums.length);System.out.println("元素内容:" + Arrays.toString(nums));}
}

33.12 补充知识:集合工具类Collections

在这里插入图片描述
在这里插入图片描述

33.13 Collection体系的综合案例

在这里插入图片描述

Card.java

package com.itheima.d4_collection_test;public class Card {private String size;private String color;private int index; // 牌的真正大小public Card(){}public Card(String size, String color, int index) {this.size = size;this.color = color;this.index = index;}public String getSize() {return size;}public void setSize(String size) {this.size = size;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}@Overridepublic String toString() {return size + color;}
}

GameDemo.java

package com.itheima.d4_collection_test;import java.util.*;/**目标:斗地主游戏的案例开发。业务需求分析:斗地主的做牌, 洗牌, 发牌, 排序(拓展知识), 看牌。业务: 总共有54张牌。点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2"花色: "♠", "♥", "♣", "♦"大小王: "👲" , "🃏"点数分别要组合4种花色,大小王各一张。斗地主:发出51张牌,剩下3张作为底牌。功能:1.做牌。2.洗牌。3.定义3个玩家4.发牌。5.排序(拓展,了解,作业)6.看牌*/
public class GameDemo {/**1、定义一个静态的集合存储54张牌对象*/public static List<Card> allCards = new ArrayList<>();/**2、做牌:定义静态代码块初始化牌数据*/static {// 3、定义点数:个数确定,类型确定,使用数组String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};// 4、定义花色:个数确定,类型确定,使用数组String[] colors = {"♠", "♥", "♣", "♦"};// 5、组合点数和花色int index = 0; // 记录牌的大小for (String size : sizes) {index++;for (String color : colors) {// 6、封装成一个牌对象。Card c = new Card(size, color, index);// 7、存入到集合容器中去allCards.add(c);}}// 8 大小王存入到集合对象中去 "👲" , "🃏"Card c1 = new Card("" ,  "🃏", ++index);Card c2 = new Card("" ,  "👲",++index);Collections.addAll(allCards , c1 , c2);System.out.println("新牌:" + allCards);}public static void main(String[] args) {// 9、洗牌Collections.shuffle(allCards);System.out.println("洗牌后:" + allCards);// 10、发牌(定义三个玩家,每个玩家的牌也是一个集合容器)List<Card> linhuchong = new ArrayList<>();List<Card> jiumozhi = new ArrayList<>();List<Card> renyingying = new ArrayList<>();// 11、开始发牌(从牌集合中发出51张牌给三个玩家,剩余3张作为底牌)// allCards = [🃏, A♠, 5♥, 2♠, 2♣, Q♣, 👲, Q♠ ...//    i        0  1   2   3   4   5    6  7      %  3for (int i = 0; i < allCards.size() - 3; i++) {// 先拿到当前牌对象Card c = allCards.get(i);if(i % 3 == 0) {// 请阿冲接牌linhuchong.add(c);}else if(i % 3 == 1){// 请阿鸠jiumozhi.add(c);}else if(i % 3 == 2){// 请盈盈接牌renyingying.add(c);}}// 12、拿到最后三张底牌(把最后三张牌截取成一个子集合)List<Card> lastThreeCards = allCards.subList(allCards.size() - 3 , allCards.size());// 13、给玩家的牌排序(从大到小 可以自己先试试怎么实现)sortCards(linhuchong);sortCards(jiumozhi);sortCards(renyingying);// 14、输出玩家的牌:System.out.println("啊冲:" + linhuchong);System.out.println("啊鸠:" + jiumozhi);System.out.println("盈盈:" + renyingying);System.out.println("三张底牌:" + lastThreeCards);}/**给牌排序* @param cards*/private static void sortCards(List<Card> cards) {// cards = [J♥, A♦, 3♥, 🃏, 5♦, Q♥, 2♥Collections.sort(cards, new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {// o1 = J♥// o2 = A♦// 知道牌的大小,才可以指定规则return o2.getIndex() - o1.getIndex();}});}
}

33.14 Map集合体系

33.14.1 Map集合的概述

在这里插入图片描述
在这里插入图片描述

33.14.2 Map集合体系特点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.14.3 Map集合常用API

在这里插入图片描述

33.14.4 Map集合的遍历方式一:键找值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.d7_map_traversal;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**目标:Map集合的遍历方式一:键找值Map集合的遍历方式有:3种。(1)“键找值”的方式遍历:先获取Map集合全部的键,再根据遍历键找值。(2)“键值对”的方式遍历:难度较大。(3)JDK 1.8开始之后的新技术:Lambda表达式。(暂时了解)a.“键找值”的方式遍历Map集合。1.先获取Map集合的全部键的Set集合。2.遍历键的Set集合,然后通过键找值。小结:代码简单,需要记住!*/
public class MapDemo01 {public static void main(String[] args) {Map<String , Integer> maps = new HashMap<>();// 1.添加元素: 无序,不重复,无索引。maps.put("娃娃",30);maps.put("iphoneX",100);maps.put("huawei",1000);maps.put("生活用品",10);maps.put("手表",10);System.out.println(maps);// maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}// 1、键找值:第一步:先拿到集合的全部键。Set<String> keys = maps.keySet();// 2、第二步:遍历每个键,根据键提取值for (String key : keys) {int value = maps.get(key);System.out.println(key + "===>" + value);}}
}

33.14.5 Map集合的遍历方式二:键值对

在这里插入图片描述

package com.itheima.d7_map_traversal;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**目标:Map集合的遍历方式。Map集合的遍历方式有:3种。(1)“键找值”的方式遍历:先获取Map集合全部的键,再根据键找值。(2)“键值对”的方式遍历:难度较大。(3)JDK 1.8开始之后的新技术:Lambda表达式。b.“键值对”的方式遍历:1.把Map集合转换成一个Set集合:Set<Map.Entry<K, V>> entrySet();2.此时键值对元素的类型就确定了,类型是键值对实体类型:Map.Entry<K, V>3.接下来就可以用foreach遍历这个Set集合,类型用Map.Entry<K, V>*/
public class MapDemo02 {public static void main(String[] args) {Map<String , Integer> maps = new HashMap<>();// 1.添加元素: 无序,不重复,无索引。maps.put("娃娃",30);maps.put("iphoneX",100);maps.put("huawei",1000);maps.put("生活用品",10);maps.put("手表",10);System.out.println(maps);// maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}/**maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}👇使用foreach遍历map集合.发现Map集合的键值对元素直接是没有类型的。所以不可以直接foreach遍历集合。👇可以通过调用Map的方法 entrySet把Map集合转换成Set集合形式  maps.entrySet();👇Set<Map.Entry<String,Integer>> entries =  maps.entrySet();[(huawei=1000), (手表=10), (生活用品=10), (iphoneX=100), (娃娃=30)]entry👇此时可以使用foreach遍历*/// 1、把Map集合转换成Set集合Set<Map.Entry<String, Integer>> entries = maps.entrySet();// 2、开始遍历for(Map.Entry<String, Integer> entry : entries){String key = entry.getKey();int value = entry.getValue();System.out.println(key + "====>" + value);}}
}

33.14.6 Map集合的遍历方式三: lambda表达式

在这里插入图片描述

package com.itheima.d7_map_traversal;import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;/**目标:Map集合的遍历方式。Map集合的遍历方式有:3种。(1)“键找值”的方式遍历:先获取Map集合全部的键,再根据键找值。(2)“键值对”的方式遍历:难度较大。(3)JDK 1.8开始之后的新技术:Lambda表达式。c.JDK 1.8开始之后的新技术:Lambda表达式。(暂时了解)*/
public class MapDemo03 {public static void main(String[] args) {Map<String , Integer> maps = new HashMap<>();// 1.添加元素: 无序,不重复,无索引。maps.put("娃娃",30);maps.put("iphoneX",100);//  Map集合后面重复的键对应的元素会覆盖前面重复的整个元素!maps.put("huawei",1000);maps.put("生活用品",10);maps.put("手表",10);System.out.println(maps);//  maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30}//        maps.forEach(new BiConsumer<String, Integer>() {
//            @Override
//            public void accept(String key, Integer value) {
//                System.out.println(key + "--->" + value);
//            }
//        });maps.forEach((k, v) -> {System.out.println(k + "--->" + v);});}
}

在这里插入图片描述

package com.itheima.d8_map_test;import java.util.*;/**需求:统计投票人数*/
public class MapTest1 {public static void main(String[] args) {// 1、把80个学生选择的数据拿进来。String[] selects = {"A" , "B", "C", "D"};StringBuilder sb = new StringBuilder();Random r = new Random();for (int i = 0; i < 80; i++) {sb.append(selects[r.nextInt(selects.length)]);}System.out.println(sb);// 2、定义一个Map集合记录最终统计的结果: A=30 B=20 C=20 D=10  键是景点 值是选择的数量Map<Character, Integer> infos = new HashMap<>(); //// 3、遍历80个学生选择的数据for (int i = 0; i < sb.length(); i++) {// 4、提取当前选择景点字符char ch = sb.charAt(i);// 5、判断Map集合中是否存在这个键if(infos.containsKey(ch)){// 让其值 + 1infos.put(ch , infos.get(ch) + 1);}else {// 说明此景点是第一次被选infos.put(ch , 1);}}// 4、输出集合System.out.println(infos);}
}

33.14.7 Map集合的实现类HashMap

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33.14.8 Map集合的实现类LinkedHashMap

在这里插入图片描述

33.14.9 Map集合的实现类TreeMap

在这里插入图片描述

33.15 补充知识:集合的嵌套

在这里插入图片描述

package com.itheima.d9_map_impl;import java.util.*;/**需求:统计投票人数*/
public class MapTest4 {public static void main(String[] args) {// 1、要求程序记录每个学生选择的情况。// 使用一个Map集合存储。Map<String, List<String>> data = new HashMap<>();// 2、把学生选择的数据存入进去。List<String> selects = new ArrayList<>();Collections.addAll(selects, "A", "C");data.put("罗勇", selects);List<String> selects1 = new ArrayList<>();Collections.addAll(selects1, "B", "C" , "D");data.put("胡涛", selects1);List<String> selects2 = new ArrayList<>();Collections.addAll(selects2 , "A",  "B", "C" , "D");data.put("刘军", selects2);System.out.println(data);// 3、统计每个景点选择的人数。Map<String, Integer> infos = new HashMap<>(); // {}// 4、提取所有人选择的景点的信息。Collection<List<String>> values = data.values();System.out.println(values);// values = [[A, B, C, D], [B, C, D], [A, C]]//             valuefor (List<String> value : values) {for (String s : value) {// 有没有包含这个景点if(infos.containsKey(s)){infos.put(s, infos.get(s) + 1);}else {infos.put(s , 1);}}}System.out.println(infos);}
}

34、创建不可变集合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

35、Stream流

35.1 Stream流的概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.d2_stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/**目标:初步体验Stream流的方便与快捷*/
public class StreamTest {public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names, "张三丰","张无忌","周芷若","赵敏","张强");System.out.println(names);
//
//        // 1、从集合中找出姓张的放到新集合
//        List<String> zhangList = new ArrayList<>();
//        for (String name : names) {
//            if(name.startsWith("张")){
//                zhangList.add(name);
//            }
//        }
//        System.out.println(zhangList);
//
//        // 2、找名称长度是3的姓名
//        List<String> zhangThreeList = new ArrayList<>();
//        for (String name : zhangList) {
//            if(name.length() == 3){
//                zhangThreeList.add(name);
//            }
//        }
//        System.out.println(zhangThreeList);// 3、使用Stream实现的names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));}
}

在这里插入图片描述
在这里插入图片描述

35.2 Stream流的获取

在这里插入图片描述
在这里插入图片描述

package com.itheima.d2_stream;import java.util.*;
import java.util.stream.Stream;/**目标:Stream流的获取Stream流式思想的核心:是先得到集合或者数组的Stream流(就是一根传送带)然后就用这个Stream流操作集合或者数组的元素。然后用Stream流简化替代集合操作的API.集合获取流的API:(1) default Stream<E> stream();小结:集合获取Stream流用: stream();数组:Arrays.stream(数组)   /  Stream.of(数组);*/
public class StreamDemo02 {public static void main(String[] args) {/** --------------------Collection集合获取流-------------------------------   */Collection<String> list = new ArrayList<>();Stream<String> s =  list.stream();/** --------------------Map集合获取流-------------------------------   */Map<String, Integer> maps = new HashMap<>();// 键流Stream<String> keyStream = maps.keySet().stream();// 值流Stream<Integer> valueStream = maps.values().stream();// 键值对流(拿整体)Stream<Map.Entry<String,Integer>> keyAndValueStream =  maps.entrySet().stream();/** ---------------------数组获取流------------------------------   */String[] names = {"赵敏","小昭","灭绝","周芷若"};Stream<String> nameStream = Arrays.stream(names);Stream<String> nameStream2 = Stream.of(names);}
}

35.3 stream流的常用方法API

在这里插入图片描述

package com.itheima.d2_stream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;/**目标:Stream流的常用APIforEach : 逐一处理(遍历)count:统计个数-- long count();filter : 过滤元素-- Stream<T> filter(Predicate<? super T> predicate)limit : 取前几个元素skip : 跳过前几个map : 加工方法concat : 合并流。*/
public class StreamDemo03 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");// Stream<T> filter(Predicate<? super T> predicate)list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));long size = list.stream().filter(s -> s.length() == 3).count();System.out.println(size);// list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));// rlist.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);// map加工方法: 第一个参数原材料  -> 第二个参数是加工后的结果。// 给集合元素的前面都加上一个:黑马的:list.stream().map(s -> "黑马的:" + s).forEach(a -> System.out.println(a));// 需求:把所有的名称 都加工成一个学生对象。list.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
//        list.stream().map(Student::new).forEach(System.out::println); // 构造器引用  方法引用// 合并流。Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));Stream<String> s2 = Stream.of("java1", "java2");// public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)Stream<String> s3 = Stream.concat(s1 , s2);s3.distinct().forEach(s -> System.out.println(s));}
}

在这里插入图片描述

35.4 Stream流的综合应用

在这里插入图片描述

Test.java

package com.itheima.d2_stream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo04 {public static double allMoney ;public static double allMoney2 ; // 2个部门去掉最高工资,最低工资的总和public static void main(String[] args) {List<Employee> one = new ArrayList<>();one.add(new Employee("猪八戒",'男',30000 , 25000, null));one.add(new Employee("孙悟空",'男',25000 , 1000, "顶撞上司"));one.add(new Employee("沙僧",'男',20000 , 20000, null));one.add(new Employee("小白龙",'男',20000 , 25000, null));List<Employee> two = new ArrayList<>();two.add(new Employee("武松",'男',15000 , 9000, null));two.add(new Employee("李逵",'男',20000 , 10000, null));two.add(new Employee("西门庆",'男',50000 , 100000, "被打"));two.add(new Employee("潘金莲",'女',3500 , 1000, "被打"));two.add(new Employee("武大郎",'女',20000 , 0, "下毒"));// 1、开发一部的最高工资的员工。(API)// 指定大小规则了
//        Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(),  e2.getSalary() + e2.getBonus()))
//                .get();
//       System.out.println(e);Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(),  e2.getSalary() + e2.getBonus())).map(e -> new Topperformer(e.getName(),  e.getSalary() + e.getBonus())).get();System.out.println(t);// 2、统计平均工资,去掉最高工资和最低工资one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(),  e2.getSalary() + e2.getBonus())).skip(1).limit(one.size() - 2).forEach(e -> {// 求出总和:剩余员工的工资总和allMoney += (e.getSalary() + e.getBonus());});System.out.println("开发一部的平均工资是:" + allMoney / (one.size() - 2));// 3、合并2个集合流,再统计Stream<Employee> s1 = one.stream();Stream<Employee> s2 = two.stream();Stream<Employee> s3 = Stream.concat(s1 , s2);s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(),  e2.getSalary() + e2.getBonus())).skip(1).limit(one.size() + two.size() - 2).forEach(e -> {// 求出总和:剩余员工的工资总和allMoney2 += (e.getSalary() + e.getBonus());});// BigDecimalBigDecimal a = BigDecimal.valueOf(allMoney2);BigDecimal b = BigDecimal.valueOf(one.size()  + two.size() - 2);System.out.println("开发部的平均工资是:" + a.divide(b,2, RoundingMode.HALF_UP));}
}

Topperformer.java

package com.itheima.d2_stream;public class Topperformer {private String name;private double money; // 月薪public Topperformer() {}public Topperformer(String name, double money) {this.name = name;this.money = money;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}@Overridepublic String toString() {return "Topperformer{" +"name='" + name + '\'' +", money=" + money +'}';}
}

Student.java

package com.itheima.d2_stream;public class Student {private String name;public Student() {}public Student(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}
}

35.5 收集Stream流

在这里插入图片描述
在这里插入图片描述

package com.itheima.d2_stream;import java.util.*;
import java.util.function.IntFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;/**目标:收集Stream流的数据到 集合或者数组中去。*/
public class StreamDemo05 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));List<String> zhangList = s1.collect(Collectors.toList()); // 可变集合zhangList.add("java1");System.out.println(zhangList);//       List<String> list1 = s1.toList(); // 得到不可变集合
//       list1.add("java");
//       System.out.println(list1);// 注意注意注意:“流只能使用一次”Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));Set<String> zhangSet = s2.collect(Collectors.toSet());System.out.println(zhangSet);Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
//         Object[] arrs = s3.toArray();String[] arrs = s3.toArray(String[]::new); // 可以不管,拓展一下思维!!System.out.println("Arrays数组内容:" + Arrays.toString(arrs));}
}

36、异常处理

36.1 异常概述、体系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

36.1 常见运行时异常

在这里插入图片描述

36.1 常见编译时异常

在这里插入图片描述

36.1 异常的默认处理流程

在这里插入图片描述

36.1 编译时异常的处理机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

36.1 运行时异常的处理机制

在这里插入图片描述

36.1 异常处理使代码更稳健的案例

package com.itheima.d8_exception_handle_runtime;import java.util.Scanner;/**需求:需要输入一个合法的价格为止 要求价格大于 0*/
public class Test2 {public static void main(String[] args) {Scanner sc  = new Scanner(System.in);while (true) {try {System.out.println("请您输入合法的价格:");String priceStr = sc.nextLine();// 转换成double类型的价格double price = Double.valueOf(priceStr);// 判断价格是否大于 0if(price > 0) {System.out.println("定价:" + price);break;}else {System.out.println("价格必须是正数~~~");}} catch (Exception e) {System.out.println("用户输入的数据有毛病,请您输入合法的数值,建议为正数~~");}}}
}

36.1 自定义异常

在这里插入图片描述
在这里插入图片描述

try-catch-finallyhttps://blog.csdn.net/weixin_42168421/article/details/120744192

37、日志框架

37.1 日志技术的概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

37.2 日志技术体系结构

在这里插入图片描述
在这里插入图片描述

37.3 Logback概述

在这里插入图片描述

logback日志下载流程:
1、点开前面的官网连接–>点击标题LOGBACK下拉选框选择Download–>文字中有Maven字样的链接–>依照版本下载即可
2、在搜索框输入logback,前两个结果分别是classic和core,进去之后找到1.2.3版本,再点进去——jump
3、在文件(files)那一栏,点击jar(283KB),浏览器会自动下载,注意左下角的下载信息——jump
4.slf4j的下载也是一样——jump

在这里插入图片描述

37.4 Logback快速入门

在这里插入图片描述

37.5 Logback配置详解-输出位置、格式设置

在这里插入图片描述

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--CONSOLE :表示当前的日志信息是可以输出到控制台的。--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--输出流对象 默认 System.out 改为 System.err--><target>System.out</target><encoder><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern></encoder></appender><!-- File是输出的方向通向文件的 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern><charset>utf-8</charset></encoder><!--日志输出路径--><file>C:/IT黑马/JavaBasics/logback-app/code/itheima-data.log</file><!--指定日志文件拆分和压缩规则--><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--通过指定压缩文件名称,来确定分割文件方式--><fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.zip</fileNamePattern><!--文件拆分大小--><maxFileSize>1MB</maxFileSize></rollingPolicy></appender><!--level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。--><root level="ALL"><!--注意:如果这里不配置关联打印位置,该位置将不会记录日志--><appender-ref ref="CONSOLE"/><appender-ref ref="FILE" /></root>
</configuration>

37.6 Logback配置详解-日志级别设置

在这里插入图片描述
在这里插入图片描述

38、阶段项目实战

38.1 电影购票系统简介、项目功能演示

在这里插入图片描述
在这里插入图片描述

38.2 日志框架搭建、系统角色分析

在这里插入图片描述

38.3 首页设计、登录、商家界面、用户界面实现

在这里插入图片描述

38.4 商家-详情页设计、影片上架、退出

在这里插入图片描述

38.5 商家-影片下架、影片修改

在这里插入图片描述

38.6 用户-展示全部影片

在这里插入图片描述

38.7 用户-购票功能

在这里插入图片描述

38.8 用户-评分功能

在这里插入图片描述

39、File类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

39.1 创建File对象

在这里插入图片描述

package com.itheima.d1_file;import java.io.File;/**目标:学会创建File对象定位操作系统的文件(文件 文件夹的)*/
public class FileDemo {public static void main(String[] args) {// 1、创建File对象(指定了文件的路径)// 路径写法: D:\resources\xueshan.jpeg//          D:/resources/xueshan.jpeg//          File.separator
//        File f = new File("D:\\resources\\xueshan.jpeg");
//        File f = new File("D:/resources/xueshan.jpeg");File f = new File("D:" + File.separator+"resources"+ File.separator +"xueshan.jpeg");long size = f.length(); // 是文件的字节大小System.out.println(size);// 2、File创建对象,支持绝对路径 支持相对路径(重点)File f1 = new File("D:\\resources\\beauty.jpeg"); // 绝对路径System.out.println(f1.length());// 相对路径:一般定位模块中的文件的。 相对到工程下!!File f2 = new File("file-io-app/src/data.txt");System.out.println(f2.length());// 3、File创建对象 ,可以是文件也可以是文件夹File f3 = new File("D:\\resources");System.out.println(f3.exists()); // 判断这个路径是否存在,这个文件夹存在否}
}

在这里插入图片描述
在这里插入图片描述

39.2 常用方法:判断文件类型、获取文件信息

在这里插入图片描述

package com.itheima.d1_file;
import java.io.File;
import java.text.SimpleDateFormat;/**目标:File类的获取功能的API- public String getAbsolutePath()  :返回此File的绝对路径名字符串。- public String getPath()  : 获取创建文件对象的时候用的路径- public String getName()  : 返回由此File表示的文件或目录的名称。- public long length()  :    返回由此File表示的文件的长度。*/
public class FileDemo02 {public static void main(String[] args) {// 1.绝对路径创建一个文件对象File f1 = new File("D:/resources/xueshan.jpeg");// a.获取它的绝对路径。System.out.println(f1.getAbsolutePath());// b.获取文件定义的时候使用的路径。System.out.println(f1.getPath());// c.获取文件的名称:带后缀。System.out.println(f1.getName());// d.获取文件的大小:字节个数。System.out.println(f1.length()); // 字节大小// e.获取文件的最后修改时间long time = f1.lastModified();System.out.println("最后修改时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time));// f、判断文件是文件还是文件夹System.out.println(f1.isFile()); // trueSystem.out.println(f1.isDirectory()); // falseSystem.out.println("-------------------------");File f2 = new File("file-io-app\\src\\data.txt");// a.获取它的绝对路径。System.out.println(f2.getAbsolutePath());// b.获取文件定义的时候使用的路径。System.out.println(f2.getPath());// c.获取文件的名称:带后缀。System.out.println(f2.getName());// d.获取文件的大小:字节个数。System.out.println(f2.length()); // 字节大小// e.获取文件的最后修改时间long time1 = f2.lastModified();System.out.println("最后修改时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time1));// f、判断文件是文件还是文件夹System.out.println(f2.isFile()); // trueSystem.out.println(f2.isDirectory()); // falseSystem.out.println(f2.exists()); // trueFile file = new File("D:/");System.out.println(file.isFile()); // falseSystem.out.println(file.isDirectory()); // trueSystem.out.println(file.exists()); // trueFile file1 = new File("D:/aaa");System.out.println(file1.isFile()); // falseSystem.out.println(file1.isDirectory()); // falseSystem.out.println(file1.exists()); // false}
}

39.3 常用方法:创建文件、删除文件功能


在这里插入图片描述

package com.itheima.d1_file;import java.io.File;
import java.io.IOException;/**目标:File类的创建和删除的方法- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 (几乎不用的,因为以后文件都是自动创建的!)- public boolean delete() :删除由此File表示的文件或目录。 (只能删除空目录)- public boolean mkdir() :创建由此File表示的目录。(只能创建一级目录)- public boolean mkdirs() :可以创建多级目录(建议使用的)*/
public class FileDemo03 {public static void main(String[] args) throws IOException {File f = new File("file-io-app\\src\\data.txt");// a.创建新文件,创建成功返回true ,反之 ,不需要这个,以后文件写出去的时候都会自动创建System.out.println(f.createNewFile());File f1 = new File("file-io-app\\src\\data02.txt");System.out.println(f1.createNewFile()); // (几乎不用的,因为以后文件都是自动创建的!)// b.mkdir创建一级目录File f2 = new File("D:/resources/aaa");System.out.println(f2.mkdir());// c.mkdirs创建多级目录(重点)File f3 = new File("D:/resources/ccc/ddd/eee/ffff");
//        System.out.println(f3.mkdir());System.out.println(f3.mkdirs()); // 支持多级创建// d.删除文件或者空文件夹System.out.println(f1.delete());File f4 = new File("D:/resources/xueshan.jpeg");System.out.println(f4.delete()); // 占用一样可以删除// 只能删除空文件夹,不能删除非空文件夹.File f5 = new File("D:/resources/aaa");System.out.println(f5.delete());}
}

39.4 常用方法:遍历文件夹

在这里插入图片描述
在这里插入图片描述

40、补充知识:方法递归、字符集

40.1 方法递归的形式

在这里插入图片描述

40.2 方法递归的应用、执行流程、递归算法的三个核心要素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

40.3 方法递归的经典案例

在这里插入图片描述
在这里插入图片描述

40.4 其他形式的方法递归案例

在这里插入图片描述

package com.itheima.d2_recusion;import java.io.File;
import java.io.IOException;/**目标:去D判断搜索 eDiary.exe文件*/
public class RecursionDemo05 {public static void main(String[] args) {// 2、传入目录 和  文件名称searchFile(new File("D:/") , "eDiary.exe");}/*** 1、搜索某个目录下的全部文件,找到我们想要的文件。* @param dir  被搜索的源目录* @param fileName 被搜索的文件名称*/public static void searchFile(File dir,String fileName){// 3、判断dir是否是目录if(dir != null && dir.isDirectory()){// 可以找了// 4、提取当前目录下的一级文件对象File[] files = dir.listFiles(); // null  []// 5、判断是否存在一级文件对象,存在才可以遍历if(files != null && files.length > 0) {for (File file : files) {// 6、判断当前遍历的一级文件对象是文件 还是 目录if(file.isFile()){// 7、是不是咱们要找的,是把其路径输出即可if(file.getName().contains(fileName)){System.out.println("找到了:" + file.getAbsolutePath());// 启动它。try {Runtime r = Runtime.getRuntime();r.exec(file.getAbsolutePath());} catch (IOException e) {e.printStackTrace();}}}else {// 8、是文件夹,需要继续递归寻找searchFile(file, fileName);}}}}else {System.out.println("对不起,当前搜索的位置不是文件夹!");}}
}

在这里插入图片描述

package com.itheima.d2_recusion;import java.io.File;
import java.io.IOException;
import java.util.Arrays;/**目标:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。答案:15瓶 3盖子 1瓶子*/
public class RecursionDemo06 {// 定义一个静态的成员变量用于存储可以买的酒数量public static int totalNumber; // 总数量public static int lastBottleNumber; // 记录每次剩余的瓶子个数public static int lastCoverNumber; // 记录每次剩余的盖子个数public static void main(String[] args) {// 1、拿钱买酒buy(10);System.out.println("总数:" + totalNumber);System.out.println("剩余盖子数:" + lastCoverNumber);System.out.println("剩余瓶子数:" + lastBottleNumber);}public static void buy(int money){// 2、看可以立马买多少瓶int buyNumber = money / 2; // 5totalNumber += buyNumber;// 3、把盖子 和瓶子换算成钱// 统计本轮总的盖子数  和 瓶子数int coverNumber = lastCoverNumber + buyNumber;int bottleNumber = lastBottleNumber + buyNumber;// 统计可以换算的钱int allMoney = 0;if(coverNumber >= 4){allMoney += (coverNumber / 4) * 2;}lastCoverNumber = coverNumber % 4;if(bottleNumber >= 2){allMoney += (bottleNumber / 2) * 2;}lastBottleNumber = bottleNumber % 2;if(allMoney >= 2){buy(allMoney);}Integer[] arr2 = new Integer[]{11, 22, 33};Arrays.sort(arr2);}
}

40.5 常见字符集介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

40.6 字符集的编码、解码操作

41、IO流

41.1 概述

41.2 字节流

41.3 资源释放的方式


http://www.ppmy.cn/news/723594.html

相关文章

GAMES101笔记 Lecture10 Geometry1 (Introduction)

目录 Application for Texture(纹理的应用)Environment Map(环境光贴图)Spherical Environment Map(球形环境光贴图)Cube Map(立方体贴图) Texture can affect shading!(纹理可以作用于着色)How to perturb the normal (in flatland)(如何计算法线如何变化呢&#xff1f;)Displ…

探秘高逼格艺术二维码的制作过程-AI绘画文生图

前几天看到几个逼格比较高的二维码&#xff0c;然后自己动手做了一下&#xff0c;给大家看看效果&#xff1a; 1、文生图&#xff08;狮子&#xff09;&#xff1a; 2、文生图&#xff08;城市&#xff09;&#xff1a; 下边将开始介绍怎么做的&#xff0c;有兴趣的可以继续读…

android不设密码装证书,安卓4.0不设置锁屏安装根证书教程

Android 4.0 已经支持用户安装根证书了&#xff0c;只需要将根证书放到sdcard根目录&#xff0c;然后到设置(Settings) – 安全(Security) – 从存储设备安装(Install from storage)就可以了&#xff0c;但是这样安装需要设置锁屏PIN或密码才可以。 绿茶小编提示&#xff1a;经…

Android锁屏实践

转载请注意&#xff1a;http://blog.csdn.net/wjzj000/article/details/78511303 本菜开源的一个自己写的Demo&#xff0c;希望能给Androider们有所帮助&#xff0c;水平有限&#xff0c;见谅见谅… https://github.com/zhiaixinyang/PersonalCollect &#xff08;拆解GitH…

利用ADB Root权限破解锁屏密码(原)

本文主要介绍Android ENG版本以及Root授权过ADB进程的手机解锁方法。 一、破解方法 1.1、破解条件 该方法适用范围较为特殊&#xff0c;分为两种&#xff1a; 1、手机是ENG版本。 2、手机被ROOT&#xff0c;并且ADB可以直接升级为ROOT用户。 第一种情况一般出现…

Android破解锁屏密码(已root)

常在江湖飘&#xff0c;哪有不挨刀。有时候我们会忘了手机的图形密码&#xff0c;花钱请人去修吗&#xff1f;身为一个有情怀Android开发者&#xff0c;say no! 那么怎么才能破解图形密码呢&#xff1f;我们在设置图形密码的时候系统会自动帮我们生成一个gesture.key文件&#…

android 锁屏代码分析,Android锁屏状态下的安全分析

简介 Android从6.0开始&#xff0c;默认开启了全盘加密(Full Disk Encryption&#xff0c;即FDE)&#xff0c;设备开机后第一次解锁时&#xff0c;用户数据处于加密状态&#xff0c;大多数功能在开机解锁前不可用。如下图&#xff1a; 如果没有输入正确的密码&#xff0c;用户数…

破解锁屏密码和获取Wifi密码

问题一&#xff1a;忘记手机的锁屏密码了 Android中在设置中的安全菜单栏中是可以设置锁屏密码的&#xff0c;有直接的文本密码和手势密码(我们一般会用到的两个密码)&#xff0c;但是有时候脑子不好使&#xff0c;密码总是忘了&#xff0c;到时候该怎么办呢&#xff1f; 方法一…