Collections工具类
1.addAll方法可用于向指定集合添加一个或多个元素 Collections.addAll(集合名,要添加的集合元素可以是多个);
2.shuffle方法可以打乱数组中的元素顺序(只有List系列才可以用) Collections.shuffle(数组名);
3.还有排序sort,交换swap,而二分查找,拷贝等方法
不可变集合
- 定义完成后不可以修改,或者添加删除
- List,Set,Map接口中,都存在of方法可以创建不可变集合
- List:直接用
Set:元素不能重复
Map:元素不能重复,键值对数量最多是10个
(of方法的源码中只有10个键值对形参以内的重载方法体)
超过10个用ofEntries方法(该方法的形参把键值对看作一个整体,写成了可变参数,才实现了多个键值对的传入)
Stream流
- Collections集合可以通过stream方法创建stream流
- 双列集合map需要通过entrySet或者keySet方法转化为单列集合后,才能调用stream方法,双列集合不能直接创建stream流
3.Arrays工具类中存在stream方法,把数组当作形参传入该方法后可以返回一个Stream流 Stream<String> stream=Arrays.stream(arr);
4.通过stream对象调用filter(过滤)方法,在形参中传入Lambda表达式可以实现对集合的选择性过滤,返回值为一个新的stream流
5.Stream接口中的静态方法of的细节:
方法的形参是一个可变参数,可以传递一堆零散的数据(统一数据类型),也可以传递数组
但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素放入Stream流中
6.中间方法返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
7.修改Stream流中的数据不会影响原来集合或者数组中的数据
- Stream流的作用:结合了Lambda表达式,简化集合 数组的操作
- Stream流的使用步骤:
获取Stream流对象
使用中间方法处理数据
使用终结方法处理数据
- 如何获取Stream流对象
单列集合:Collection中的默认方法stream
双列集合:不能直接获取
数组:Arrays工具类型中的静态方法stream
一堆零散的数据:Stream接口中的静态方法of
- 常见方法
中间方法:filter(过滤),limit(获取前几个元素),skip(跳过前几个元素),distinct(去重),concat(合并两个流),map(数据类型转换)
终结方法:forEach(遍历),count(统计),collect(收集)
方法引用
方法引用的规则:
- 需要有函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参和返回值,需要跟抽象方法的形参返回值保持一致
- 被引用方法的功能需要满足当前的需求
引用静态方法
1.类名::静态方法
引用类中的成员方法
- 其他类:其他类对象::方法名
- 本类:this::方法名(不能是静态方法)
- 父类:super::方法名(不能是静态方法)
引用构造方法
- 类名::new (要注意保证存在一种构造方法的形参与抽象方法的形参保持一致)
引用数组的构造方法
- 数据类型[]::new
异常
- 虚拟机默认处理异常的方式
把异常信息以红色字体打印在控制台,并结束程序
- 捕获:try。。。catch
一般用在调用处,能让代码继续往下运行
try{
可能出现异常的代码
}catch(异常的类型 变量名){
捕获到异常后运行的代码
}
注意:①当try中遇到一个发生异常的代码后,try中的下面其他代码不会运行,此时会直接跳转到catch中
②当try中的代码可能出现不止一种的异常时,可以在下面接多个catch,但最多只有一个catch语句能被执行
③如果try中的异常没有被catch捕获,就相当于try catch白写了,此时会交给虚拟机默认处理,即把异常以红色字体的形式在控制台输出并结束程序
④如果catch顺利捕获异常并执行完catch中的代码,此时程序会接着往下执行try catch体系外的代码,程序不会停止
- 手动抛出一个运行异常
throw new RuntimeException();
在方法中,出现异常了
方法就没有继续运行下去的意义了,采取抛出处理
让该方法结束运行并告诉调用者出现了问题
File类
- File对象表示路径,可以是文件,也可以是文件夹,这个路径可以是存在的,也可以是不存在的
- 绝对路径是带盘符的,相对路径是不带盘符的,默认到当前项目下去找
- File的三种构造方法的作用
- public File(String pathname)把字符串表示的路径变成File对象
- public File(String parent,String child)把父级路径和子级路径进行拼接
父级路径就是把原路径最后一个分隔符后面的文件名去掉后的路径
子级路径就是最后一个分隔符后的文件名
③public File(File parent,String child)把父级路径和子级路径进行拼接
IO流
- IO流是存储和读取数据的解决方案
I:input O:output
流:像水流一样传输数据
- IO流的作用:用于读写数据(本地文件,网络)
- IO流按照流向可以分类哪两种流
输出流:程序->文件
输入流:文件->程序
- IO流按照操作文件的类型可以分类哪两种流
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件
- 什么是纯文本文件?
用Windows系统自带的记事本打开并且能读懂的文件
txt文件,md文件,xml文件,lrc文件等
- 字节输出流FileOutputStream
①创建字节输出流对象
参数是字符串表示的路径或者File对象都可以
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
如果文件已经存在,则会清空文件
②写数据
write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCLL上对应的字符
③释放资源
每次使用完流之后都要用close方法释放资源
- 字符输出流FileWriter 字符输入流FileReader
①在创建字符输出流时,在有参构造中传入第二个参数为true为打开续写开关
(默认是关闭的,在关闭情况下,创建第二个字符输出流的时候会把文件之前的内容先清空)
②通过read和write方法对指定文件进行输入输出字符的操作
③当read方法读到文本的末尾时会返回-1
- 缓冲流
①字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutputStream
字符缓冲输入流:BufferedReader
字符缓冲输出流:BufferedWriter
②缓冲流为什么能提高性能
缓冲流自带长度为8192的缓冲区
可以显著提高字节流的读写性能
对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有的方法
③字符缓冲流两个特有的方法
字符缓冲输入流BufferedReader:readline()一下读一行的内容并返回
字符缓冲输出流BufferedWriter:newline()在输入时创建新的一行
- 转换流
- 字符转换输入流:InputStreamReader
字符转换输出流:OutputStreamWriter
- 转换流的作用:
①指定字符集读写数据(JDK11之后淘汰)
②字节流想要使用字符流中的方法(可以把字节流转换成字符流)
- 序列化流和反序列流
- 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口,否则,会出现NotSerializableException异常
- 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
- 序列化对象后,修i改了Javabean类,再次反序列化,会出问题,会抛出InvalidClassException
解决方案:给Javabean类添加seralVersionUID(序列号,版本号)
4.如果一个对象的某个成员变量的值不想被序列化,可以给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
11.打印流
1.打印流分为字节打印流和字符打印流
2.打印流不操作数据源,只能操作目的地
3.字节打印流:默认自动刷新,特有的println自动换行
4.字符打印流:自动刷新需要开启,特有的println自动换行
字符集
- 在计算机中任意数据都是以二进制的形式进行存储的
- ASCLL字符集中一个英文占一个字节
- 简体中文版Windows,默认使用GBK字符集
一个英文占一个字节,二进制第一位是0
一个中文占两个字节,二进制的高位的第一位是1
- Unicode(统一码)中的UTF-8编码规范中,一个英文占一个字节,二进制第一位是0,转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转化成十进制是负数
多线程
- 并发和并行
①并发:在同一时刻,有多个指令在单个CPU上交替执行
②并行:在同一时刻,有多个指令在多个CPU上同时执行
2.Thread(线程)类
Lock锁
- 为了更加清晰的表达如何加锁和释放锁,jdk5以后提供了一个新的锁对象Lock
- Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
- Lock中提供了获得锁和释放锁的方法
void lock();获得锁
void unlock();释放锁
- Lock是接口不能直接实例化,这里采用他的实现类ReentrantLock来实例化
- ReentrantLock的构造方法:ReentrantLock();创建一个Reentrantlock的实例
死锁
- 两个锁嵌套就会产生死锁,A锁等B锁打开,B锁等A锁打开
线程的状态
- 新建状态(new)创建线程对象
- 就绪状态(runnable)start方法
- 阻塞状态(blocked)无法获得锁对象
- 等待状态(waiting)wait方法
- 记时等待(timed waiting)sleep方法
- 结束状态(terminated)全部代码运行完毕
协议
- UDP协议
用户数据报协议
UDP是面向无连接通信协议 速度快 有大小限制最多发送64k,数据不安全,易丢失数据
- TCP协议
传输控制协议 TCP协议是面向连接的通信协议 速度慢,没有大小限制,数据安全
数据结构篇
- 栈,队列
- 数据进栈的过程叫做压栈
- 栈的特点是先进后出,类似于手枪的弹夹,第一发压进去的子弹是最后一发打出的
- java中方法体的加载就是在栈中进行的
先执行的方法先进栈,后执行的方法后进,所以最先执行的方法最后出栈
- 而队列的特点与栈刚好相反,队列的数据先进先出,后进后出,类似于排队过安检,排在前面的先出来
二.树
- 每个节点有两以上个子节点一个父节点组成的结构叫做树
二叉树
1.只有两个子节点的节点组成的叫做二叉树
2.最开始的节点叫做根节点,每个节点的两个子节点叫做 左子节点和右子节点
对于节点两边的子树叫做左子树和右子树
二叉查找树
- 每个节点的左子节点的值小于当前节点的值,右子节点的值大于当前节点的值
- 二叉查找树相对于二叉树的优点是查找效率更高
平衡二叉树
1.任意节点的左右子树的层数相差不超过1的二叉查找树叫做平衡二叉树
2.如何将二叉查找树转化为平衡二叉树?
左旋,右旋
3.当新加入一个节点后导致了树的不平衡时,就要进行旋转操作
红黑树
- 红黑树是一个二叉查找树,但不是高度平衡的,条件是特有的红黑规则
- 红黑规则:
①每一个节点或是红色的,或是黑色的
②根节点必须是黑色的
③如果一个节点(根节点除外)没有子节点或父节点,则该节点的指针属性值为Nil,这些Nil被视为叶节点,每个叶节点必须是黑色的
④如果一个节点是红色的,那它的子节点必须是黑色的(不能出现两个红色节点相连)
⑤对于每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
- 红黑树添加节点的时候默认是红色添加效率更高(改动次数少)
哈希值
1.哈希值是根据hashCode方法计算出的int类型的整数
2.该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
3.一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值
4.如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
5.如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
6.在小部分情况下,不同的属性值或地址值计算出来的哈希值有可能相同(哈希碰撞)