1,Java 中有哪 8 种基本数据类型?它们的默认值和占⽤的空间大小知道不? 说说这 8 种基本数据类型对应的包装类型。
- 6种数字类型:byte,short,int,long,float,double
- 1种字符类型:char
- 1中布尔型:boolean
| 数据类型 | 字节 | 包装类型 | 默认值 |
|---|---|---|---|
| byte | 1 | Byte | 0 |
| short | 2 | Short | 0 |
| int | 4 | Integer | 0 |
| long | 8 | Long | 0 |
| float | 4 | Float | 0.0 |
| double | 8 | Double | 0.0 |
| char | 2 | Character | 空 |
| boolean | 1 | Boolean | false |
2.包装类型的常量池技术了解么?
Java基本类型除了float和double,都实现了常量池技术。
Byte,Short,Integer,Long这四种包装类默认创建了数值在 **[-128,127] **的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
Integer缓存源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}
如果创建对象的范围在 [-128,127] 则使用缓存池中的对象,超过范围创建新的对象。
3,为什么要有包装类型?
很多业务场景下,对于没有值的属性,希望值为null,而基本数据类型会赋默认值。
- 1,基本数据类型不能为NULL值。
- 2,基本数据类型不支持泛型,集合元素
- 3,包装类型提供很多包装好的方法。
4,什么是自动拆装箱?原理?
基本数据类型和包装数据类型之间的互转。
- 装箱 :将基本类型用它们对应的引用类型包装起来;
- 拆箱 :将包装类型转换为基本数据类型;
原理:装箱其实就是调⽤了 包装类的 valueOf() ⽅法,拆箱其实就是调⽤了 xxxValue() ⽅法。
5,遇到过自动拆箱引发的 NPE 问题吗?
场景
- 数据库的查询结果可能是 null,因为⾃动拆箱,⽤基本数据类型接收有 NPE ⻛险
- 三⽬运算符使⽤不当会导致诡异的 NPE(NullPointerException) 异常
#反例
Integer a = 1;
Integer b = 2;
Integer c = null;
Boolean flag = false;
//a*b的结果是int类型,那么c会强制拆箱成int类型,抛出NPE异常。
Integer result = (flag?a*b:c)
6,String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?
可变性
String类中保存字符串的数组使用了final关键字修饰,所以String对象是不可变的。
StringBuilder和StringBuffer都继承AbstractStringBuilder类,在AbstractStringBuilder中保存字符串的数组没有使用final关键字修饰。
线程安全性
String中的对象不可变,线程安全。
StringBuffer对方法加了同步锁,线程安全。
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
性能
每次对String类型进行修改时,都会生成一个新的String对象,然后将指针指向新的对象。
StringBuffer和StringBuilder对对象本身进行操作。
总结:
-
操作少量的数据 = String
-
单线程操作字符串缓冲区下操作大量数据 = StringBuilder
-
多线程操作字符串缓冲区下操作大量数据 = StringBuffer
7,重载和重写的区别?
重写是子类方法覆盖父类方法。
重载是同一个类型有两个或两个以上相同方法名的方法。
- 范围:重载是在一个类中,重写是子类和父类之间。
- 参数列表:重写必须保持相同;重载参数的个数和参数的类型都不能相同。
- 返回值类型:重写保存相同,重载没要求。
- 发生阶段:重写发生在运行时,重载发生在编译时。
- 异常:重写时的访问修饰符限制一定大于等于被重写方法的访问修饰权限。重载可以有不同的访问修饰符。
- 访问修饰符:重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。重载可以抛出不同异常。
8,== 和 equals() 的区别
对于基本数据类型和String常量,比较的是值。
对于引用类型,“==”比较的是引用地址,“equals”中的Object方法,没有重写,也是比较引用地址的值,如果重写,根据用户自定义的条件比较。
9,Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?
定义:Java在运行状态中,对任意一个类,都知道这个类的所有属性和方法,对任意一个对象,都可以调用方法和属性,这种动态获取信息和动态调用对象方法称为反射。
优点
- 赋予jvm动态编译的能力。(运行时改变程序的行为)。
- 提高java程序的灵活性和扩展性。
- 降低代码的耦合性。
缺点
- 降低程序的可读性。
- 降低程序的效率。主要原因:加载字节码,invoke方法对参数的封箱,拆箱操作,检查参数和方法的合法性。
如何理解反射
优点+缺点。反射主要的作用是增强程序的抽象性,使我们的程序适应更多的场景,而框架的作用就是抽象各种业务场景的共同点,解决各种业务场景的共同问题。
10,谈谈对 Java 注解的理解,解决了什么问题?
注解本身的作用是标记,真正起作用的是解释类,注解和解释的关系靠反射来实现。
解决问题:增加了代码的可读性,降低了代码的耦合性。
11,内部类了解吗?匿名内部类了解吗?
12,Java 泛型了解么?泛型的作⽤?什么是类型擦除?泛型有哪些限制?介绍⼀下常⽤的通配符?
泛型就是所操作的数据类型被指定为一个参数。
泛型提供了编译时 类型安全检测机制 该机制允许程序员在编译时检测到非法的类型。
13,BIO,NIO,AIO 有什么区别?
BIO:同步并阻塞。
NIO:同步非阻塞。
AIO:异步非阻塞。