Java回顾4【笔记】

查漏补缺

源自于pad上的内容

1. IO数据流会以.dat结尾的文件存储,Object对象的流需要类实现序列化Serializable后才能运行

2. InvalidClassException:当你修改了对象,例如添加了一个属性,它的UID会改变,再去读取.dat会报错,因为UID改变。
   所以实现序列化后需要自定义序列化id,
   private static final long seriaVersionUID = 1L;//具体值随便写

3. transient
   如果不想某个属性被序列化,加关键字transient(静态的东西本身就不会被序列化)
   没有被序列化的属性,只会保持默认值,IO是修改不了的。
   结论:序列化一个对象,其属性要么是基本数据类型,要么是实现序列化了的引用数据类型

4. Externalizable接口
   第二种实现序列化的方法,实现该接口。需要重写两个方法:
   writeExternal: out.writeUTF(xxx);//即便是无法序列化的属性,写在这儿也能被序列化
   readExternal: brand = in.readUTF();

5. PrintStream打印流
   PrintStream out = System.out (Web阶段为PrintWriter类)
   注意PrintStream的有参构造,可以直接输出到文件中,也可以输出对象

   Scanner sc = new Scanner(System.in);// 默认情况下是从键盘输入进行扫描

6. JDK1.7新增try with resource专门为资源关闭准备
   try(需要关闭的资源){}
   catch(){}
   其实就是try多了个(),里面直接写需要关闭的资源,结束了以后就会自动将()里的资源关闭

7. 阻塞式IO
   非阻塞为NIO 
   Path接口与工具类Paths(就像Collection与Collections)
   很多新版的API都提供了报异常的方法,可以有更多的选择

网络

8. 网络通信三要素:地址、端口号、网络协议
   地址:IP地址,定位到一台设备
   端口号:定位到某个线程
   网络协议:保证如何准确地到达那里,正确地解析数据

9. TCP三次握手,四次挥手
   以下为A和B的对话:
   握手:~天王盖地虎  ~小鸡炖蘑菇,你刚发的是天王盖地虎吗?  ~收到小鸡。。我刚发的确实是天王。。
   挥手:~我要走了  ~我知道了  ~bye  ~bye(可能收不到,收不到就关了)

   UDP以报文发送,不可靠

类加载

10. 类的加载分为三步
    1. 加载:字节码读取到内存
    2. 连接
      (1)验证
      (2)准备:例如给类变量在方法区分配内存
      (3)解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程
(1、2完成时,方法区中已经有Class对象了)
    3. 类的初始化<clinit>():触发机制:new对象,反射

(类的加载大多数情况下是1、2、3一起完成,但有的时候3初始化不会一起完成)
没有进行初始化:
  1. 引用静态常量
  2. 子类调用父类的静态域(变量 方法),子类不会初始化
  3. 创建类的数组对象,其实还没new

11. 类加载器:
  1. Bootstrap ClassLoader(根类加载器)
    加载Java核心库,rt.jar等(像java.lang就在该jar中)
    不是用Java写的,所以String.class.getClassLoader()为null

  2. Extension ClassLoader(扩展类加载器)
    jre/lib/ext/*.jar

  3. Application ClassLoader(应用程序类加载器)
    bin目录下,通俗的讲应该是我们自己写的类

  4. 自定义类加载器
    字节码加密,解密或者字节码在其他路径下,如Tomcat里的类

12. 双亲委派模式:
    设想当你自己创建了一个package java.lang.String 调用String时会使用哪一个呢?
    每个类加载器都有getParent()方法来获取上一层的加载器
    
Application的父亲是Extension,再往上是Bootstrap
层级:Application-->Extension-->Bootstrap
查找到某一层的时候会先搜索内存中是否存在,若存在则直接返回
调用String后,先从Application开始,调用getParent,在Extension中也调用getParent。也就是一定要从父类中进行查找,
查到了就返回,没查到就自己查。
所以一定会先用rt.jar中的String而不是自己写的String

13. 类加载器作用,加载类或者加载类路径下的文件
    Properties pro = new Properties();
    pro.load(xxx.class.getClassLoader().getResourceAsStream("xxx.properties");

1.8新特性

14. Lambda表达式,简化匿名内部类

15. 方法引用或构造器引用,简化Lambda

16. Stream流,对集合、数组的数据进行处理、加工
    1. 创建Stream
    2. 加工
    3. 终结
    特点:不会改变源对象,延迟操作,所有操作延迟到终结,一起处理

17. Optional类
posted @ 2021-05-29 14:37  lwxx  阅读(53)  评论(0)    收藏  举报