String, 多线程,异常的小面试题

 

1:   StringBuffer, StringBuilder和String的区别?

a:String是内容不可变的,而StringBuffer和StringBuilder内容是可变的。
b:StringBuffer是同步的,数据安全,效率低;而StringBuilder是不同步的,数据不安全,效率高。


2:StringBuffer和数组的区别?


二者都可以看出是一个容器,装其他的数据
但是,StringBuffer的数据最终是一个字符串数据
而数组可以放置多种数据,但必须是同一种数据类型的。

 

3: Integer直接赋值的面试题:


Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据。

 

4: 多线程有几种实现方案,分别是哪几种?


    两种。
    继承Thread类
    实现Runnable接口
    扩展一种:实现Callable接口。这个得和线程池结合。

5:同步有几种方式,分别是什么?


    两种。
    同步代码块
    同步方法

6:启动一个线程是run()还是start()?它们的区别?


    start();
    run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用
    start():启动线程,并由JVM自动调用run()方法

 

7:sleep()和wait()方法的区别


    sleep():必须指时间;不释放锁。
    wait():可以不指定时间,也可以指定时间;释放锁。

 

8:为什么wait(),notify(),notifyAll()等方法都定义在Object类中


    因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。
    而Object代码任意的对象,所以,定义在这里面。

 

9:线程的生命周期图


    新建 -- 就绪 -- 运行 -- 死亡
    新建 -- 就绪 -- 运行 -- 阻塞 -- 就绪 -- 运行 -- 死亡
    建议:画图解释。
String, 多线程,异常的小面试题_第1张图片

 

10:编译期异常和运行期异常的区别?


    编译期异常 必须要处理的,否则编译不通过
    运行期异常 可以不处理,也可以处理


11:throw和throws是的区别


    throw:
        在方法体中,后面跟的是异常对象名,并且只能是一个
        throw抛出的是一个异常对象,说明这里肯定有一个异常产生了
    throws:
        在方法声明上,后面跟的是异常的类名,可以是多个
        throws是声明方法有异常,是一种可能性,这个异常并不一定会产生


12:finally关键字及其面试题


    A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
    B:面试题


        a:final,finally,finalize的区别?

             final可以用来修饰类,方法和变量(成员变量或局部变量)
             当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:
            final类中所有的成员方法都会隐式的定义为final方法。
            final方法意味着“最后的、最终的”含义,即此方法不能被重写。
            final成员变量表示常量,只能被赋值一次,赋值后其值不再改变


         finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。特殊情况:在执行到finally之前jvm退出了。

        finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 
  使用finalize还需要注意一个事,调用super.finalize();
  一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

        b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后


            会,前
            实际上在中间。

你可能感兴趣的:(Java基础知识)