Java知识点01
Java知识点01
1、Java基础
1.1 不可变类
典型:String
设计不可变类:私有化变量,不要暴露set方法,有修改的需求要返回一个新对象。
1.2 JDK8 新特性
- 元空间代替永久代
- lambda表达式
- 引入了新的日期类(旧:可变且线程不安全,新:不可变的,安全性+维护性)
- 接口默认方法、静态方法
- Stream流式接口
- Optional类 优雅处理空指针
- CompletableFuture(新的异步编程模型)、StampedLock等并发实现类
- 修改了HashMap的实现
1.3 StringBuilder是怎么实现的
- 主要用于动态拼接字符串,大致需要实现append、insert、delete、replace、charAt...
- 底层用char[]存字符,count记录存放的字符数
- spring的char[]用final修饰 -- 不可变
- 数组是连续内存结构,如果预先能知道长度,可以减少数组扩容次数
- append:
- 计算对象转成字符需要占几位
- 判断是否需要扩容
- 扩容:容量翻两倍+2,再拷贝
- 对象转成字符,存入数组
- 更新字符数
- 优化:
- char数组可以改为byte数组+coder标志位,节省内存,因为char占两个字节,对拉丁系的字符来说是浪费的
1.4 JDK工具
- jps 虚拟机进程状况工具
- jstat 虚拟机统计信息监视工具
- jmap java内存映射工具
- jhat 虚拟机堆转储快照分析工具
- jstack Java堆栈跟踪工具
- visualvm 图形化工具,内存分析、CPU分析
1.5 SPI(Service Provider Interface)机制
- 服务提供接口,主要用于模块化开发和插件化拓展。
- 允许服务提供者通过特定的配置文件将自己的实现注册到系统中,系统通过反射机制动态加载实现,而不需要修改原始框架代码,实现系统的解耦
- 典型应用场景:JDBC,不同的数据库驱动程序开发者可以使用JDBC库,定制自己的数据库驱动程序。
1.6 Java注解分类
- SOURCE 编译器用的,不会写入class,如@Override ,只作为编译器代码检查
- CLASS 写入class,在类加载阶段丢弃,运行时没这个信息
- RUNTIME 写入class,永久保存,可以通过反射获取,如@Autowired
1.7 Java的类加载过程
把类加载到JVM,输入一段二进制流(class文件、字节码、网络)到内存,一番解析、处理后转化成可用的class类
类加载流程:加载、连接(验证、准备、解析)、初始化
- 加载:二进制流->内存,生成一个Class类
- 验证:二进制流是否符合格式、规范、当前JVM版本等
- 准备:为静态变量赋初始值(对应类型的初始值,不是代码中指定的初始化值),划分内存空间
- 解析:将常量池的符号引用(字面量,没意义)转为直接引用(真实引用,内存中可以通过这个引用查到目标)。
- 初始化:执行静态代码块,为静态变量赋值(代码里的赋值)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!