这些基本数据类型为什么有对应的包装类?
1、因为基本数据类型不具备面向对象的思想,不能实例化,没有一些对应的方法可进行调用。
2、数据库允许有NULL,数据处理无法进行操作。
装箱与拆箱
1、装箱是将值类型转换成引用类型的过程,拆箱就是将引用类型转换成值类型的过程。
2、注:只有装过箱的对象才能拆箱;
Integer a = 1; // 自动装箱 具体实现是调用valueOf(1)
int b = a; // 自动拆箱 具体实现是调用intValue()
两个Integer的引用对象传给一个swap(交换)方法,在方法内部交换引用,返回后,两个引用值是否发生变化?
1、不会发生变化,因为Java中所有的参数传递都是值传递,不存在引用传递。
2、如果想让值发生变化,可以通过反射机制修改引用地址,则swap方法需要如下:
public void swap(Integer a,Integer b){
// 反射获取成员变量
Field value = Integer.class.getDeclaredField("value");
value.setAccessible(true);
int temp = a.intValue;
value.set(a,b.intValue);
value.set(b,temp);
}
两个Integer引用值相同,是否是同一个对象?
1、要看取值范围,在-128 - 127之间则是同一个对象,否则不是。
== 和 equals区别?
1、== 是位运算符,如果是基本数据类型则比较存储的值,如果是引用类型则比较的是堆内存地址。
2、equals是Object的一个方法,比较的是地址。
集合与数组
为什么ArrayList的elementData加上transient修饰?
1、不被反序列化破坏,elementData支持序列化。
2、序列化的时候先调用writeObject里面的defaultWriteObject,从ArrayList里面去遍历非transient的元素,检索了序列化后文件大小。
单例有多少种实现方法?哪些不会被序列化、反序列化破坏?怎么确保不会被破坏?
1、饿汉式(线程不安全)
①构造方法私有化
②在静态语句块实例化
③提供调用实例的方法
④空间换时间,不管有没有调用方法,实例都创建
2、懒汉式(线程安全)
①构造方法私有化
②在调用时判断是否实例化
③时间换空间,调用方法时创建实例对象
3、双检索懒汉式
①构造方法私有化
②在调用时判断是否实例化
③时间换空间,调用方法时创建实例对象
4、静态内部类
5、枚举