JavaSE-notes
前言
本片笔记为本人在复习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集合添加的是有序、可重复、有索引的元素
- ArrayList
- LinkedList
- Vector(淘汰)
Set
Set集合添加的是无序、不重复、无索引的元素
HashSet
- LinkedHashSet
- TreeSet
Map
- HashMap
- LinkedHashMap
- TreeMap
数据结构
红黑树
泛型
泛型通配符
PECS
- Producer extends, consumer super
- PECS(Producer Extends Consumer Super)原则_mylomen的博客-CSDN博客
方法引用
把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体
需要满足的条件
引用处
- 必须是函数式接口
被引用处
- 被引用的方法必须已经存在
- 被引用方法的形参和返回值需要跟抽象方法保持一致
- 需要满足需求
分类
引用静态方法
- 格式:类名::静态方法
引用成员方法
- 格式:对象::成员方法
- 其他类:其他类对象::方法名
- 本类:this::方法名
- 父类:super::方法名
引用构造方法
- 格式:对象::new
其他调用方式
使用类名引用成员方法
规则:
- 需要有函数式接口
- 被引用的方法必须已经存在
- 被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致
- 被引用方法的功能需要满足当前的需求
引用数组的构造方法
- 格式:数据类型[]::new
异常
异常分类
- Error:系统级别错误。开发人员不用管
Exception:异常,代表程序可能出现的问题
- RuntimeException:编译阶段不会出现异常提醒,运行时出现异常
- 编译时异常:编译阶段出现异常,必须手动处理,否则代码报错
两种异常区别:
- 运行时异常:表示由于参数错误而导致的问题
- 编译时异常:提醒程序员检查本地信息
异常的作用
- 异常是用来查询bug的关键参考信息
- 异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方式
JVM默认的处理方式
- 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
- 程序停止执行,异常下面的代码不会再执行了
自己处理
- 目的:当代码出现异常时,让代码继续运行下去
抛出处理
IO流
IO流体系
高级流
缓冲流(缓冲区默认大小8192)
- BufferedInputStream
- BufferedOutputStream
- BufferedFileReader
- BufferedFileWriter
转换流
- 属于字符流
- InputStreamReader
- OutputStreamWriter
序列化流/反序列化流
- 可以把java中的对象写/读到本地文件中
- java对象需要实现标记型接口Serializable
- transient关键字:被该关键字标记的成员变量不参与序列化过程
打印流
- 字符打印流
- 字节打印流
- 解压缩流/压缩流
多线程
进程和线程
进程
- 进程是程序的基本执行实体
线程
- 线程是操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程中的实际运作单位
并发和并行
并发
- 同一时刻,多个指令在单个CPU上交替执行
并行
- 同一时刻,多个指令在多个CPU上同时执行
多线程的实现方式
继承Thread类
- 继承Thread类,重写run方法,通过
start()
方法开启新线程
- 继承Thread类,重写run方法,通过
实现Runnable接口
- 实现Runnable接口,重写run方法
- 创建自己的类对象
- 新建一个Thread类的对象,开启线程
利用Callable接口和Future接口实现
- 创建一个类MyCallable实现Callable接口
- 重写call(是有返回值的,表示多线程运行的结果)
- 创建MyCallable的对象(表示多线程要执行的任务)
- 创建FutureTask的对象(作用管理多线程运行的结果)
- 创建Thread对象,并运行(表示线程)
- 三种实现方式对比
线程的调度
- Java采用抢占式调度
- 抢占式调度具有随机性
- 线程优先级越高(priority越大),随机到的概率越大,并不一定就更大
守护线程
- 当其他非守护线程执行完毕之后,守护线程会陆续结束(不会按照原先流程完整运行)
线程的生命周期
线程安全问题
- 同步代码块
1 | sychronized(obj){ // 其中,obj为唯一的对象,可用单例实现,如当前类.class |
同步方法
- 把synchronized关键字加到方法上
Lock锁
死锁
线程的状态
线程池
主要核心原理
反射
反射允许对成员变量,成员方法和构造方法的信息进行编程访问
反射的作用
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态地创建对象并调用方法
动态代理
特点:无侵入式地给代码增加额外的功能
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Rashawn's Blog!