点击上方“蓝字”关注我们
1
Q:自动装箱和拆箱是什么?
自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。原始类型: boolean,char,byte,short,int,long,float,double 封装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型。
2
Q:关于String?
1、String 类中使用 final 关键字修饰字符数组来保存字符串,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,但是却没有使用final 关键字修饰,所以这两种对象都是可变的。
2、String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
3、每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
4、对于三者使用的总结:操作少量的数据: 适用String;单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder;多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer。
3
Q:static 关键字的理解?
1、修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()。
2、 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。该类不管创建多少对象,静态代码块只执行一次。
3、静态内部类(static修饰类的话只能修饰内部类):静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
4、静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
4
Q:final,finalize和finally?
final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变。finalize方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用finalize没有保证。finally是一个关键字,与try和catch一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。
5
Q:final有哪些用法?
1、被final修饰的类不可以被继承。
2、被final修饰的方法不可以被重写。
3、被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
4、被final修饰的方法,JVM会尝试将其内联,以提高运行效率。
5、被final修饰的常量,在编译阶段会存入常量池中。
6
Q:break 和 continue 的区别?
1、break 和 continue 都是用来控制循环的语句。
2、break 用于完全结束一个循环,跳出循环体执行循环后面的语句。
3、continue 用于跳过本次循环,执行下次循环。
7
Q:throw 和 throws 的区别?
1、throw:
(1)throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
(2)throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
2、throws:
(1)throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
(2)throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
(3)throws 表示出现异常的一种可能性,并不一定会发生这种异常。