一、自动拆装箱
Q:自动拆装箱是在什么时期发生的?
A:编译期。可以通过反编译java代码看到有关拆装箱的细节。
Integer a = new Integer(a);
int b = a;
Integer c = b;
反编译的结果为
Integer a = new Integer(a);
int b = a.intValue();
Integer c = Integer.valueOf(b);
ps:自动拆箱可能会导致空指针异常,所以在进行引用类型和基本数据类型值比较的时候,使用Integer.valueOf(基本数据类型值).equals(引用类型引用)进行比较
二、自动装箱比较
Q:Integer a = 100, b = 100, c = 128, d = 128,为啥 a == b 返回true,c == d 返回false
A:引用类型之间的==比较是比较的是否指向的为同一个对象,a == b为true是因为IntegerCache,它存储了-128 ~ 127之间的所有Integer对象,当int值在 -128 ~127之间时,自动装箱得到的是IntegerCache中存储的Integer对象,超出范围时会新建Integer对象,所以判断对象的值是否相等用equals()方法
/**
* 将会输出
* true
* false
*/
Integer a = 100, b = 100, c = 128, d = 128;
System.out.println(a==b);
System.out.println(c==d);
三、语法糖
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身的功能来说没有什么影响,只是为了方便程序员进行开发,提高开发效率,使用这种语法写出来的程序可读性也更高。说白了,语法糖就是对现有语法的一个封装。
但其实,Java虚拟机是并不支持语法糖的,语法糖在程序编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。所以在Java中真正支持语法糖的是Java编译器。
四、代理
代理:proxy
在java中有两类实现:静态代理、动态代理
常见用途
① 控制真实对象的访问权限:通过代理对象控制真实对象的使用权限
② 增强真实对象的功能:通过代理可以在调用真实对象的方法的前后增加额外功能
静态代理和动态代理的比较
① 静态代理是编码进去的,侵入源代码,编译期就确定好的
② 动态代理则是运行期动态生成的,不侵入源代码
动态代理的实现方式
jdk、cglib(Code Generation Library)
jdk动态代理:java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力
cglib动态代理:cglib 是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展
两种方式的动态代理的比较
① jdk动态代理需要被代理的对象,实现一个或多个接口
② cglib动态代理则没有这个要求,所以当需要代理的对象未实现接口时,选择用cglib,但注意需要代理的对象不能被final修饰
五、节点流和处理流
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。
一个流对象经过其他流的多次包装,称为流的链接。
不定期更新...