第四期八股文巴拉巴拉说(Java篇)

ec81437872329a4dd926a021dc658639.png

点击上方“蓝字”关注我们

54abd87f0bee853a3763bf9d7c19a871.png

1

Q:自动装箱和拆箱是什么?

6dd7704cf362330c3bb0bea95ab7764b.png

0f7beb3930a468da5889b5e92e3bd753.png

自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。原始类型: boolean,char,byte,short,int,long,float,double 封装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型。

307cd2e497a08150a71be00846ff47fc.png

a53c2b088711658a988eab23af5ab95a.png

6e36a60d43bd27b9f0bdeaf7c1dcf4f9.png

2

Q:关于String?

816924ab4ffd12ff2c34f0b228d4385f.png

12ab36560f06220c31ffcff4a98cf99c.png

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。

4190dabcc6febecb6193ceb82991feae.png

a9d4221d09427574c17c1ae7b39c9a53.png

c6625495f56944b4a0a7223f4650e10d.png

3

Q:static 关键字的理解?

aaa5d155b6898a773f37997d36d93977.png

3a06026c15b1602ea7adf825c8e7291b.png

1、修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()。

2、 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。该类不管创建多少对象,静态代码块只执行一次。

3、静态内部类(static修饰类的话只能修饰内部类):静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。

4、静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。

b4ddcd28205d706737a0369b489602d4.png

9d9a2f95bbde55c63e4731d79068a1d4.png

5edaf60ef37b0bee7bdc83744e790f1b.png

4

Q:final,finalize和finally?

13c1acf45344758a0d255acfdd0523a8.png

e6cd42f673aa699534709dde09104883.png

final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变。finalize方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用finalize没有保证。finally是一个关键字,与try和catch一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。

d3f5b4d9a141bc3dbeeaf458d22542f6.png

3d23ca13cd11709b6bea2f0326ad3eaf.png

e90df4f2eba5a7b9407d931b6e2b04ac.png

5

Q:final有哪些用法?

c33ffef3bc9c9e69fbfc11d3e82a6d64.png

2f12124076ab94b7e25f94b4bc94b1bf.png

1、被final修饰的类不可以被继承。

2、被final修饰的方法不可以被重写。

3、被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。

4、被final修饰的方法,JVM会尝试将其内联,以提高运行效率。

5、被final修饰的常量,在编译阶段会存入常量池中。

3ae4081f64c5258276353435c3364b5e.png

153fb7f365f29e270da1a7363082e8ea.png

72e10b00409db07dc4fa64659bb04707.png

6

Q:break 和 continue 的区别?

4584adb568d2cef61bc8306e3f238e10.png

2fb974d37db91ce187b6818665b93838.png

1、break 和 continue 都是用来控制循环的语句。

2、break 用于完全结束一个循环,跳出循环体执行循环后面的语句。

3、continue 用于跳过本次循环,执行下次循环。

d9c72c78e06d128c95eafc15010b920f.png

54b72065a3bad45ec30de3dff251d098.png

df562ae276bf85b402b94f15ba134be8.png

7

Q:throw 和 throws 的区别?

5397cde5444f37b7cb80461c48dfa8bf.png

0bbbe4b9b6d7b91b51c07e754d9259b6.png

1、throw:

    (1)throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。

   (2)throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。

2、throws:

    (1)throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

    (2)throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

    (3)throws 表示出现异常的一种可能性,并不一定会发生这种异常。

72e81e5147393b218b5109a3d856270b.png

68448e7352330a9f57076ddcbb6500f0.png

e5fa4c1fab331e013eef142a3da2eca8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值