java面试中经常被问到的问题有哪些?

Python016

java面试中经常被问到的问题有哪些?,第1张

java面试中经常被问到的问题有如下:

1、进程,线程,协程之间的区别是什么?

简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

2、你了解守护线程吗?它和非守护线程有什么区别?

程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程。守护线程最典型的例子就是GC线程。

3、什么是多线程上下文切换?

多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

4、创建两种线程的方式?他们有什么区别?

通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。相比扩展Thread,实现Runnable接口可能更优.原因有二:Java不支持多继承。因此扩展Thread类就代表这个子类不能扩展其他类。而实现Runnable接口的类还可能扩展另一个类。类可能只要求可执行即可,因此继承整个Thread类的开销过大。

5、Thread类中的start()和run()方法有什么区别?

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

1.java异常机制的原理与应用\x0d\x0a答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。\x0d\x0a实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则,交给JVM进行处理。当try语句捕获异常之后,将与catch语句的异常类型进行匹配,如果匹配成功则执行catch内的语句。简单的应用:在所以throws语句的地方加入try-catch。标准应用:try-catch-finally-throw-throws一起使用。 \x0d\x0a\x0d\x0a2. 垃圾回收机制的优点\x0d\x0a答:释放无用的对象所占用的空间。方式:自动回收,手动回收。使用System.gc(),实际上调用Runtime.getRuntime().gc()\x0d\x0a\x0d\x0a3. Error与Exception区别\x0d\x0a答:Error是jvm进行处理,是jvm出错\x0d\x0aexception是可以由程序处理的,可以用try-catch捕获的\x0d\x0a\x0d\x0a4. final,finally,finallize\x0d\x0a答:final定义的变量的值不能改变,定义的方法不能被覆盖,定义的类不能被继承\x0d\x0afinally是异常的统一出口,finallize是垃圾回收前的收尾工作,是Object类定义的\x0d\x0a\x0d\x0a5. Anonymous Inner Class是否可以extends,是否可以implements Interface\x0d\x0a答:允许继承和实现,因为匿名内部类就是在抽象类和接口的基础上发展起来的\x0d\x0a\x0d\x0a6. Static Nested Class 与Inner Class的区别\x0d\x0a答:使用Static定义的Class就是外部类,可以通过外部类. 内部类直接访问\x0d\x0a而Inner Class是不能被外部访问的,只能通过外部类的实例再找到内部类实例。\x0d\x0a\x0d\x0a7. HashMap and HashTable?\x0d\x0a答:HashMap:1) released in jdk 1.2,new Class 2)采用异步处理方式,性能较高,是非线程安全的 3)允许null\x0d\x0aHashTable:\x0d\x0a1)released in jdk 1.0 ,old Class \x0d\x0a2)采用同步处理方式,性能低,是线程安全的\x0d\x0a3)不允许null\x0d\x0a\x0d\x0a8. assert代表什么?\x0d\x0a答:asserts是jdk 1.4之后发布的新关键字,表示断言,即程序执行到某个地方肯定是预计的值,一般开发很少使用。要使用assert,必须加上 -ea参数\x0d\x0a\x0d\x0a9. gc是什么?\x0d\x0a答:gc是garbage collection,垃圾回收,使用gc可以进行垃圾空间的释放\x0d\x0a\x0d\x0a10. String s = new String("xyz")产生了几个对象?\x0d\x0a答:一个匿名对象xyz,在栈空间内。一个new实例化的对象,在堆空间内。\x0d\x0a\x0d\x0a11. sleep() and wait()?\x0d\x0a答:sleep()是Thread类定义方法,表示线程的休眠,可以自动唤醒\x0d\x0await()方法是Object类定义的方法,需要手动notify()和notifyAll()//sleep()不释放资源,wait()释放资源\x0d\x0a\x0d\x0a12. Overload与Override的区别\x0d\x0a答:Overload:重载\x0d\x0a |- 在一个类中定义的若干方法\x0d\x0a |- 所有的方法名相同,但参数类型或个数不同\x0d\x0a |- 只有参数有关,与返回类型无关\x0d\x0aOverride:覆写\x0d\x0a |- 在继承的关系中\x0d\x0a |- 子类定义了父类同名的方法,参数类型或个数最好完全一样。\x0d\x0a |- 访问权限不能更严格\x0d\x0a\x0d\x0a13. abstract class 和 interface有什么区别?\x0d\x0a答:抽象类:\x0d\x0a |-由抽象方法和常量、变量、全局常量、构造方法、普通方法组成\x0d\x0a |-使用abstract声明\x0d\x0a |-子类要通过extends继承抽象类,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法\x0d\x0a |-存在单继承的局限\x0d\x0a |-抽象类可以实现若干个接口\x0d\x0a接口:\x0d\x0a |-由抽象方法和全局常量组成\x0d\x0a |-使用interface关键字\x0d\x0a |-子类要通过implements实现接口,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法\x0d\x0a |-一个子类可以实现多个接口\x0d\x0a |-接口不能继承一个抽象类,但允许继承多个接口