java 基础整理

装箱就是自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型
1. 只发生在编译阶段
2. 自动装箱会涉及到缓存。普通的new 不会
3. 拆箱时可能发生NullPointerException

1. jedis. 
2. set nx px[分布式锁]
3. del nx [只能删除自己的]
4. lua脚本

1. class对象。 反射   student.getClass Student.Class  forName
2. 在运行期间,一个类,只有一个Class对象产生

1. 加载-》链接-》初始化
2. 加载-会产生用于反射的Class对象
3. 链接分为三个子阶段:验证 -> 准备 -> 解析
4. 准备阶段:为类变量(static变量)分配内存并且设置该类变量的默认初始值,即零值
5. 解析阶段:将常量池内的符号引用转换为直接引用的过程
6. 初始化阶段:clinit
7. 双亲委派机制(引导类加载器/扩展类加载器/系统类加载器)

1. 全局异常捕获(SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获)
2. ExceptionHandler

1. 序列化是把一个java对象变成二进制内容   Serializable
2. 反序列化的对象是由 JVM 自己生成的对象,而不会通过构造方法生成
3. 使用transient关键字,将一些重要的信息(如密码)不被进行序列化
4. 序列化ID,决定者是否可以成功反序列化    Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较

1. GuavaCache 本地缓存方案【基于容量lru、时间的缓存回收】
2. CacheBuilder采用构建者模式设置对象
3. 线程安全,与ConcurrentMap相似。但是移除场景更优秀[缓存核心类LocalCache里面的内部类Segment与jdk1.7及以前的ConcurrentHashMap非常相似,都继承于ReetrantLock]

1. Throwable包含两个子类:Error(错误)和Exception(异常)
2. NullPointerException、ArithmeticException、ArrayIndexOutOfBoundException、IllegalArgumentException。
3. 不可查异常定义【包括RuntimeException和错误】,无需throws子句进行声明
4. 受检异常【Exception 中除 RuntimeException 及其子类之外的异常】,必须使用try-cache、throws    IOException、ClassNotFoundException
5. JVM的架构模型-基于栈的指令集架构【为了更好的跨平台】
6. Arrays.sort(person) 需要实现Comparable.    Integer已经实现了Comparbale
7. 堆、方法区、虚拟机栈【栈帧-方法, -Xss栈空间 StackoverflowError OutofMemoryError】、程序计数器【指令相关的现场信息】、本地方法栈   
8. 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射 【gc、编译、信号调度】
9. 泛型【编译阶段】、通配符、上限【List<? extends Number>】、下限【List<? super Number>】
10. 栈帧中包含局部变量表-编译期确定、操作数栈
11. synchronized 单例 饿汉、懒汉、Doubel Check、静态内部类
12. Voliate,避免指令重排。数据快速写会
13. 构建者模式 builder 静态方法builder,静态内部类,链式编程,返回当前对象
14. 适配器模式 网线,转化器【面向接口编程】
15. 桥接模式 将多个变化的维度进行组合【Brand+Type】
16. 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
    动态代理利用了JDK API、动态地在内存中构建代理对象.  InvocationHandler invoke getProxy[Proxy.newProxyInstance]
    [其实这里基本上就是AOP的一个简单实现了,在目标对象的方法执行之前和执行之后进行了增强。Spring的AOP实现其实也是用了Proxy和InvocationHandler这两个东西的]
17. AOP
18. cglib (Code Generation Library )是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展                             
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它需要你对JVM内部结构包括class文件的格式和指令集都很熟悉
cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类
19. Atomic类具有原子性,在多线程的环境下使用是线程安全的。【AtomicBoolean是java.util.concurrent.atomic的原子变量的类】
20. 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象


JVM体系
1. 跨平台、跨语言
2. Java虚拟机是一台执行Java字节码的虚拟计算机、在操作系统之上【HotSpot VM】
3. 基于栈的指令集架构【跨平台】
4. JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。

类加载子系统
1. 类加载后在方法区中生成Class对象,可以用于反射
2. 加载-》【验证(cafe baby)-准备(static进行初始化 0)-解析(符号引用转直接引用)】—》初始化(clinit)
3. 应用类加载器、扩展类加载器、系统类加载器

运行时数据区
1. 堆、方法区是共享的
2. 每个JVM只有一个运行实例【JVM允许一个应用有多个线程并行的执行】【在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射】
3. GC线程、编译线程、信号调度线程
4. PC寄存器【存储指令相关的现场信息,指向下一条指令的地址】【它是唯一一个在Java虚拟机规范中没有规定任何OutofMemoryError情况的区域】
5. 程序计数器会存储当前线程正在执行的Java方法的JVM指令地址
6. 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令


虚拟机栈
1. 内部保存着一个个栈帧,对应着一次次的java方法调用
2. 栈帧里面有局部变量表、操作数栈
3. -Xss StackoverflowError OutofMemoryError


1. java8之后,方法区在元空间,存在在本地方法内存中,不会触发gc
2. 不同对象的生命周期不同。70%-99%的对象是临时对象。所以需要堆分待
3. 如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配
4. Java7及以前版本的Hotspot中方法区位于永久代中,永久代和堆是相互隔离的,但它们使用的物理内存是连续的...永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集

intern()    jdk6是复制 , jdk7是引用
可达性分析:判断对象的引用链是否可达
标记-清除算法【会产生碎片化】
复制算法【对象面、空闲面】, 年轻代
标记-整理
2. 标记清理 【FUll GC】
3. 标记整理【FUll GC】
4. 复制算法【YOUNG GC】

我们在不改变原来的代码的情况下,实现了对原有功能的增强,这是AOP中最核心的思想[面向切面编程,通过预编译和动态代理技术,对业务逻辑各个部分进行隔离,使得耦合度降低]
IOC?
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值