Java进阶之effective java 笔记(一)
一、 基本类型优先于装箱基本类型
java的类型系统,可分为基本类型和引用类型。
基本类型:java有8种基本类型,可分为三类:字符类型char , 布尔类型boolean ,以及数值类型byte、short、int、long、float、double;
引用类型: java有5种引用类型(对象类型):类 接口 数组 枚举 标注;如string list等;
每个基本类型都有其对应的引用类型,称为装箱基本类型。
要明白java中一切皆对象,而基本类型只有值,所以java为了管理基本类型,为每个基本类型都创建了一个包装类。
什么是自动装箱、自动拆箱?
提取装箱类型对用的基本类型的值的行为称为自动拆箱:当一项操作中混合着基本赖姓和装箱基本类型时,装箱基本类型就会自动拆箱。
基本类型和装箱基本类型的区别:
1、基本类型只有值,而包装类型则具有与它们的值不同的同一性(identity)。这个同一性是指,两个引用是否指向同一个对象,如果指向同一个对象,则说明具有同一性。(与此类似的还有等同性。)
2、基本类型只有功能完备的值,而包装类型除了其对应的基本类型所有的功能之外,还有一个非功能值:null。
3、基本类型通常比包装类型更节省时间与空间。
在如下三个地方,包装类型的使用会更合理:
1、作为集合中的元素、键和值。
2、在参数化类型中。比如:你不能这样写——ArryList<int>,你只能写ArrayList<Integer>.
3、在进行反射方法的调用时。
当必须使用装箱基本类型的时候需要注意一下几点:
* 1:比较对象的值是否相等,不能使用==一定要使用equals
* 2:当程序进行涉及装箱和拆箱基本类型的混合类型计算是,它会进行拆箱,当程序进行拆箱时,可能会抛出空指针异常。
* 3:当程序装箱了基本类型值时,会导致高开销和不必要的对象创建。
总结:当可以选择时,应尽量选择使用基本类型,基本类型更加简单、更加快速。
二、通过接口引用对象
应该优先使用接口而不是类来引用对象:如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就应该使用接口进行声明。
只有当利用构造器创建某个对象时,才需要真正引用这个类的对象。
eg:
List<String> list = new ArrayList<>();
因为这样会使得程序更加灵活。
三、类和接口
1. 不可变类:不可变类是指其实例不能被改变的类。
不可变类实际上是线程安全的,它们不要求同步。所以,不可变对象可以被自由的共享。客户端应该重用现有的实例:对于频繁使用的指,应该将不可变类设置为syatic final类型的。
不可变类提供一些静态工厂,它们把频繁请求的实例缓存起来,当现有实例符合请求时,就不必创建新的实例。
四、优先考虑泛型