前言

本片笔记为本人在复习JavaSE过程中所记录,参考课程、文中图片均来自黑马程序员,如有侵权,请联系本人删除

notes

String类的JVM内存原理

  • this的内存原理

  • 对字符串直接赋值,会先在字符串常量池中查找,若有,则复用;若无,则加入对应的字符串,从而节省内存。

static

  • 静态方法中只能访问静态
  • 非静态方法可以访问静态和非静态
  • 静态方法中没有this关键字

继承

  • 子类可以继承父类中的内容

  • 虚方法表

    • 非private
    • 非static
    • 非final
  • 成员方法是否可以被继承

    • 只有父类中的虚方法才能被子类继承
  • 方法重写注意事项

多态

  • 多态调用成员的特点

    • 成员变量

      • 编译看左边,运行看左边
    • 成员方法

      • 编译看左边,运行看右边

final

  • 方法

    • 表明该方法是最终方法,不能被重写
    • 表明该类是最终类,不能被继承
  • 变量

    • 叫做常量,只能被赋值一次
    • final修饰基本类型——变量存储的数据值不能发生改变
    • final修饰引用类型——变量存储的地址值不能发生改变,对象内部的可以改变

权限修饰符

代码块

  • 局部代码块

    • 写在方法内
    • 节约内存,目前已基本不使用
  • 构造代码块

    • 写在成员位置处
    • 可以把多个构造方法中重复的代码抽取出来
    • 执行时机:创建本类对象时会先执行构造代码块
    • 渐渐淘汰了
  • 静态代码块

    • 随着类的加载而加载,自动触发
    • 只执行一次
    • 使用场景:在类加载时,做一些数据初始化时使用

接口

接口中成员的特点

  • 成员变量:

    • 只能是常量
    • 默认修饰符:public static final
  • 构造方法

  • 成员方法

    • 只能是抽象方法
    • 默认修饰符:public abstract

接口中的方法体

JDK8以后,允许在接口中定义默认方法,需要用default修饰

  • 默认方法不是抽象方法,不强制被重写
  • 若被重写,被重写时去掉default关键字
  • 若实现了多个接口,多个接口中存在相同名字的默认方法,则子类必须对该方法进行重写

Lambda表达式

  • 可以用来简化匿名内部类的书写
  • 只能简化函数式接口的匿名内部类的写法

    • 函数式接口:有且仅有一个抽象方法的接口。接口上方可以加@FunctionalInterface注解

集合

Collection

List

List集合添加的是有序、可重复、有索引的元素

  1. ArrayList
  2. LinkedList
  3. Vector(淘汰)

Set

Set集合添加的是无序、不重复、无索引的元素

  1. HashSet

    1. LinkedHashSet
  2. TreeSet

Map

  1. HashMap
  2. LinkedHashMap
  3. TreeMap

数据结构

红黑树

泛型

泛型通配符

方法引用

把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体

需要满足的条件

  • 引用处

    • 必须是函数式接口
  • 被引用处

    • 被引用的方法必须已经存在
    • 被引用方法的形参和返回值需要跟抽象方法保持一致
    • 需要满足需求

分类

  1. 引用静态方法

    • 格式:类名::静态方法
  2. 引用成员方法

    • 格式:对象::成员方法
    1. 其他类:其他类对象::方法名
    2. 本类:this::方法名
    3. 父类:super::方法名
  3. 引用构造方法

    • 格式:对象::new
  4. 其他调用方式

    1. 使用类名引用成员方法

      • 规则:

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

      • 格式:数据类型[]::new

异常

异常分类

  • Error:系统级别错误。开发人员不用管
  • Exception:异常,代表程序可能出现的问题

    • RuntimeException:编译阶段不会出现异常提醒,运行时出现异常
    • 编译时异常:编译阶段出现异常,必须手动处理,否则代码报错
  • 两种异常区别:

    • 运行时异常:表示由于参数错误而导致的问题
    • 编译时异常:提醒程序员检查本地信息

异常的作用

  1. 异常是用来查询bug的关键参考信息
  2. 异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

异常的处理方式

  • JVM默认的处理方式

    1. 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
    2. 程序停止执行,异常下面的代码不会再执行了
  • 自己处理

    • 目的:当代码出现异常时,让代码继续运行下去

抛出处理

IO流

IO流体系

高级流

  • 缓冲流(缓冲区默认大小8192)

    • BufferedInputStream
    • BufferedOutputStream
    • BufferedFileReader
    • BufferedFileWriter
  • 转换流

    • 属于字符流
    • InputStreamReader
    • OutputStreamWriter
  • 序列化流/反序列化流

    • 可以把java中的对象写/读到本地文件中
    • java对象需要实现标记型接口Serializable
    • transient关键字:被该关键字标记的成员变量不参与序列化过程
  • 打印流

    • 字符打印流
    • 字节打印流
  • 解压缩流/压缩流

多线程

进程和线程

  • 进程

    • 进程是程序的基本执行实体
  • 线程

    • 线程是操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程中的实际运作单位

并发和并行

  • 并发

    • 同一时刻,多个指令在单个CPU上交替执行
  • 并行

    • 同一时刻,多个指令在多个CPU上同时执行

多线程的实现方式

  1. 继承Thread类

    • 继承Thread类,重写run方法,通过start()方法开启新线程
  2. 实现Runnable接口

    • 实现Runnable接口,重写run方法
    • 创建自己的类对象
    • 新建一个Thread类的对象,开启线程
  3. 利用Callable接口和Future接口实现

    • 创建一个类MyCallable实现Callable接口
    • 重写call(是有返回值的,表示多线程运行的结果)
    • 创建MyCallable的对象(表示多线程要执行的任务)
    • 创建FutureTask的对象(作用管理多线程运行的结果)
    • 创建Thread对象,并运行(表示线程)
  • 三种实现方式对比

线程的调度

  • Java采用抢占式调度
  • 抢占式调度具有随机性
  • 线程优先级越高(priority越大),随机到的概率越大,并不一定就更大

守护线程

  • 当其他非守护线程执行完毕之后,守护线程会陆续结束(不会按照原先流程完整运行)

线程的生命周期

线程安全问题

  • 同步代码块
1
2
sychronized(obj){ // 其中,obj为唯一的对象,可用单例实现,如当前类.class
}
  • 同步方法

    • 把synchronized关键字加到方法上

Lock锁

死锁

线程的状态

线程池

  • 主要核心原理

反射

反射允许对成员变量,成员方法和构造方法的信息进行编程访问

反射的作用

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态地创建对象并调用方法

动态代理

特点:无侵入式地给代码增加额外的功能