大家好,我是200,最近比较忙,所以更新会比较慢哦~
引言
金九银十,马上秋招了,给大家出一篇面试题吧,简单粗暴,上题~
面试题
1.StringBulider和StringBuffer和String区别?
StringBulider可变字符串 线程不安全 效率高
StringBuffer可变字符串 线程安全 效率低
String 不可变字符串 根据实际情况使用,在循环中不要使用,因为会产生很多没用字符串
⚠️ 这部分建议看一下源码可能理解的就能更透彻,有时间会出源码分析哦~
2.String为什么不可变?
String被final修饰过所以不可变.
3.final关键字的作用是什么?
final修饰的变量,方法,类,在final修饰的变量必须要初始化,赋值后不能更改, 被final修饰的方法不能重写,被final修饰的类不能被继承 final修饰的变量必须显示初始化,这个变量被初始化不可改变。
4.为什么说不可改变?
不可改变是指对基本类型来说值不可变,对于对象变量来说其引用不可变,就是不能在指向其他的对象 如果final修饰的变量是对象类型,那么不可更改的指的是改变不可以再指向别的对象,但是对象的值可以改变
* final Operate operate = new Operate();
* operate.i=11;
* operate.i=12;
* System.out.println(operate.i);//输出12
* 上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。
5.在java中有哪些使用final修饰
例如:Math类中的double E double PI * 在接口中变量都是public static final修饰的
6.区别final与finally、finalize()
finally
* finnally是异常处理的一部分,只能用在try/catch里并附带一个语句块,表示这个语句最终一定
* 会被执行(不管有没有抛出异常)
* finnally不会执行的情况如下:
* public static int test(){
* int i = 1;
* // if (i==1)
* // {
* // return 0;
* // }
* System.out.println("111111111111");
* i = i/0;
* try {
* System.out.println("try");
* return i;
* }finally {
* System.out.println("finaly");
* }
* }
* public static void main(String[] args) {
* System.out.println("test"+test());
* }
* Exception in thread "main" java.lang.ArithmeticException: / by zero111111111111
at Main.test(Main.java:53)
at Main.main(Main.java:62)
*
当我们去掉注释的三行语句,执行结果为:test0
为什么在以上两种情况下都没有执行finally语句呢,说明什么问题? 只有与finnal对应的语句块执行的情况下,finnlly语句快才会执行,以上两种情况在执行tru语句块之前 已经返回或抛出异常,所以try对应的finally语句并没有执行 但是在某种情况下,即使try语句执行了,finnally语句也不一定执行
例如:
public static int test(){
int i = 1;
// if (i==1)
// {
// return 0;
// }
// System.out.println("111111111111");
// i = i/0;
try {
System.out.println("try");
System.exit(0);
return i;
}finally {
System.out.println("finaly");
}
}
public static void main(String[] args) {
System.out.println("test"+test());//输出结果:try
}
finnally语句块还是没有执行?
因为在try语句块中执行了exit(0)语句终止Java虚拟机的运行,在一般情况下不会调用exit(0)方法,但是当一个线程在执行try语句块或者catch语句块时被打断或着被终止,与其相对应的finally可能不会执行。
finalize()
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这个方法,这个方法在gc启动,该方法被回收的时候调用。 其实gc可以回收大部分的对象,凡是new出来的对象,gc都可以处理,一般情况下不会使用finalize() 特殊情况下,需要手动finalize,当对象被回收的时候释放一些资源,
比如
:socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize(); 使用finalize需要注意一个事,调用super.finalize(); 一个对象的finalize()方法只能被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。所以不推荐使用finalize().
完结
本文内容就这么多了,下期有时间会对本期内容进行补充哦~拜拜👋