黑马程序员java下篇笔记

Collections工具类

1.addAll方法可用于向指定集合添加一个或多个元素  Collections.addAll(集合名,要添加的集合元素可以是多个);

2.shuffle方法可以打乱数组中的元素顺序(只有List系列才可以用) Collections.shuffle(数组名);

3.还有排序sort,交换swap,而二分查找,拷贝等方法

不可变集合

  1. 定义完成后不可以修改,或者添加删除
  2. List,Set,Map接口中,都存在of方法可以创建不可变集合
  3. List:直接用

Set:元素不能重复

Map:元素不能重复,键值对数量最多是10个

(of方法的源码中只有10个键值对形参以内的重载方法体)

超过10个用ofEntries方法(该方法的形参把键值对看作一个整体,写成了可变参数,才实现了多个键值对的传入)

Stream流

  1. Collections集合可以通过stream方法创建stream流
  2. 双列集合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流中的数据不会影响原来集合或者数组中的数据

  1. Stream流的作用:结合了Lambda表达式,简化集合 数组的操作
  2. Stream流的使用步骤:

获取Stream流对象

使用中间方法处理数据

使用终结方法处理数据

  1. 如何获取Stream流对象

单列集合:Collection中的默认方法stream

双列集合:不能直接获取

数组:Arrays工具类型中的静态方法stream

一堆零散的数据:Stream接口中的静态方法of

  1. 常见方法

中间方法:filter(过滤),limit(获取前几个元素),skip(跳过前几个元素),distinct(去重),concat(合并两个流),map(数据类型转换)

终结方法:forEach(遍历),count(统计),collect(收集)

方法引用

方法引用的规则:

  1. 需要有函数式接口
  2. 被引用的方法必须已经存在
  3. 被引用方法的形参和返回值,需要跟抽象方法的形参返回值保持一致
  4. 被引用方法的功能需要满足当前的需求

引用静态方法

1.类名::静态方法

引用类中的成员方法

  1. 其他类:其他类对象::方法名
  2. 本类:this::方法名(不能是静态方法)
  3. 父类:super::方法名(不能是静态方法)

引用构造方法

  1. 类名::new  (要注意保证存在一种构造方法的形参与抽象方法的形参保持一致)

引用数组的构造方法

  1. 数据类型[]::new

异常

  1. 虚拟机默认处理异常的方式

把异常信息以红色字体打印在控制台,并结束程序

  1. 捕获:try。。。catch

一般用在调用处,能让代码继续往下运行

try{

   可能出现异常的代码

}catch(异常的类型 变量名){

  捕获到异常后运行的代码

}

注意:①当try中遇到一个发生异常的代码后,try中的下面其他代码不会运行,此时会直接跳转到catch中

②当try中的代码可能出现不止一种的异常时,可以在下面接多个catch,但最多只有一个catch语句能被执行

③如果try中的异常没有被catch捕获,就相当于try catch白写了,此时会交给虚拟机默认处理,即把异常以红色字体的形式在控制台输出并结束程序

④如果catch顺利捕获异常并执行完catch中的代码,此时程序会接着往下执行try catch体系外的代码,程序不会停止

  1. 手动抛出一个运行异常

throw new RuntimeException();

在方法中,出现异常了

方法就没有继续运行下去的意义了,采取抛出处理

让该方法结束运行并告诉调用者出现了问题

File类

  1. File对象表示路径,可以是文件,也可以是文件夹,这个路径可以是存在的,也可以是不存在的
  2. 绝对路径是带盘符的,相对路径是不带盘符的,默认到当前项目下去找
  3. File的三种构造方法的作用
  • public File(String pathname)把字符串表示的路径变成File对象
  • public File(String parent,String child)把父级路径和子级路径进行拼接

父级路径就是把原路径最后一个分隔符后面的文件名去掉后的路径

子级路径就是最后一个分隔符后的文件名

③public File(File parent,String child)把父级路径和子级路径进行拼接

IO流

  1. IO流是存储和读取数据的解决方案

I:input  O:output

流:像水流一样传输数据

  1. IO流的作用:用于读写数据(本地文件,网络)
  2. IO流按照流向可以分类哪两种流

输出流:程序->文件

输入流:文件->程序

  1. IO流按照操作文件的类型可以分类哪两种流

字节流:可以操作所有类型的文件

字符流:只能操作纯文本文件

  1. 什么是纯文本文件?

用Windows系统自带的记事本打开并且能读懂的文件

txt文件,md文件,xml文件,lrc文件等

  1. 字节输出流FileOutputStream

①创建字节输出流对象

参数是字符串表示的路径或者File对象都可以

如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

如果文件已经存在,则会清空文件

②写数据

write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCLL上对应的字符

③释放资源

每次使用完流之后都要用close方法释放资源

  1. 字符输出流FileWriter  字符输入流FileReader

①在创建字符输出流时,在有参构造中传入第二个参数为true为打开续写开关

(默认是关闭的,在关闭情况下,创建第二个字符输出流的时候会把文件之前的内容先清空)

②通过read和write方法对指定文件进行输入输出字符的操作

③当read方法读到文本的末尾时会返回-1

  1. 缓冲流

①字节缓冲输入流:BufferedInputStream

字节缓冲输出流:BufferedOutputStream

字符缓冲输入流:BufferedReader

字符缓冲输出流:BufferedWriter

②缓冲流为什么能提高性能

缓冲流自带长度为8192的缓冲区

可以显著提高字节流的读写性能

对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有的方法

③字符缓冲流两个特有的方法

字符缓冲输入流BufferedReader:readline()一下读一行的内容并返回

字符缓冲输出流BufferedWriter:newline()在输入时创建新的一行

  1. 转换流
  1. 字符转换输入流:InputStreamReader

字符转换输出流:OutputStreamWriter

  1. 转换流的作用:

①指定字符集读写数据(JDK11之后淘汰)

②字节流想要使用字符流中的方法(可以把字节流转换成字符流)

  1. 序列化流和反序列流
  1. 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口,否则,会出现NotSerializableException异常
  2. 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
  3. 序列化对象后,修i改了Javabean类,再次反序列化,会出问题,会抛出InvalidClassException

解决方案:给Javabean类添加seralVersionUID(序列号,版本号)

4.如果一个对象的某个成员变量的值不想被序列化,可以给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

11.打印流

1.打印流分为字节打印流和字符打印流

2.打印流不操作数据源,只能操作目的地

3.字节打印流:默认自动刷新,特有的println自动换行

4.字符打印流:自动刷新需要开启,特有的println自动换行

字符集

  1. 在计算机中任意数据都是以二进制的形式进行存储的
  2. ASCLL字符集中一个英文占一个字节
  3. 简体中文版Windows,默认使用GBK字符集

一个英文占一个字节,二进制第一位是0

一个中文占两个字节,二进制的高位的第一位是1

  1. Unicode(统一码)中的UTF-8编码规范中,一个英文占一个字节,二进制第一位是0,转成十进制是正数

一个中文占三个字节,二进制第一位是1,第一个字节转化成十进制是负数

多线程

  1. 并发和并行

①并发:在同一时刻,有多个指令在单个CPU上交替执行

②并行:在同一时刻,有多个指令在多个CPU上同时执行

2.Thread(线程)类

Lock锁

  1. 为了更加清晰的表达如何加锁和释放锁,jdk5以后提供了一个新的锁对象Lock
  2. Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
  3. Lock中提供了获得锁和释放锁的方法

void lock();获得锁

void unlock();释放锁

  1. Lock是接口不能直接实例化,这里采用他的实现类ReentrantLock来实例化
  2. ReentrantLock的构造方法:ReentrantLock();创建一个Reentrantlock的实例

死锁

  1. 两个锁嵌套就会产生死锁,A锁等B锁打开,B锁等A锁打开

线程的状态

  1. 新建状态(new)创建线程对象
  2. 就绪状态(runnable)start方法
  3. 阻塞状态(blocked)无法获得锁对象
  4. 等待状态(waiting)wait方法
  5. 记时等待(timed waiting)sleep方法
  6. 结束状态(terminated)全部代码运行完毕

协议

  1. UDP协议

用户数据报协议

UDP是面向无连接通信协议 速度快 有大小限制最多发送64k,数据不安全,易丢失数据

  1. TCP协议

传输控制协议 TCP协议是面向连接的通信协议 速度慢,没有大小限制,数据安全

数据结构篇

  • 栈,队列
  1. 数据进栈的过程叫做压栈
  2. 栈的特点是先进后出,类似于手枪的弹夹,第一发压进去的子弹是最后一发打出的
  3. java中方法体的加载就是在栈中进行的

先执行的方法先进栈,后执行的方法后进,所以最先执行的方法最后出栈

  1. 而队列的特点与栈刚好相反,队列的数据先进先出,后进后出,类似于排队过安检,排在前面的先出来

二.树

  1. 每个节点有两以上个子节点一个父节点组成的结构叫做树

二叉树

1.只有两个子节点的节点组成的叫做二叉树

2.最开始的节点叫做根节点,每个节点的两个子节点叫做 左子节点和右子节点

对于节点两边的子树叫做左子树和右子树

二叉查找树

  1. 每个节点的左子节点的值小于当前节点的值,右子节点的值大于当前节点的值
  2. 二叉查找树相对于二叉树的优点是查找效率更高

平衡二叉树

1.任意节点的左右子树的层数相差不超过1的二叉查找树叫做平衡二叉树

2.如何将二叉查找树转化为平衡二叉树?

左旋,右旋

3.当新加入一个节点后导致了树的不平衡时,就要进行旋转操作

红黑树

  1. 红黑树是一个二叉查找树,但不是高度平衡的,条件是特有的红黑规则
  2. 红黑规则:

①每一个节点或是红色的,或是黑色的

②根节点必须是黑色的

③如果一个节点(根节点除外)没有子节点或父节点,则该节点的指针属性值为Nil,这些Nil被视为叶节点,每个叶节点必须是黑色的

④如果一个节点是红色的,那它的子节点必须是黑色的(不能出现两个红色节点相连)

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

  1. 红黑树添加节点的时候默认是红色添加效率更高(改动次数少)

哈希值

1.哈希值是根据hashCode方法计算出的int类型的整数

2.该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算

3.一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

4.如果没有重写hashCode方法,不同对象计算出的哈希值是不同的

5.如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的

6.在小部分情况下,不同的属性值或地址值计算出来的哈希值有可能相同(哈希碰撞)

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值