java语言 百文网手机站

Java最常见面试真题(2)

时间:2021-04-16 09:51:57 java语言 我要投稿

Java最常见面试真题

  7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

  当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

  Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

  Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

  8.接口和抽象类的区别是什么?

  Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

  接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

  类可以实现很多个接口,但是只能继承一个抽象类

  类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

  抽象类可以在不提供接口方法实现的情况下实现接口。

  Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

  Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

  接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

  9.Java支持多继承么?

  不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

  10.什么是值传递和引用传递?

  对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

  对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

  Java线程

  1.进程和线程的区别是什么?

  进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

  2.创建线程有几种不同的方式?哪一种是最优的?为什么?

  有三种方式可以用来创建线程:

  继承Thread类

  实现Runnable接口

  应用程序可以使用Executor框架来创建线程池

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  3.概括的解释下线程的几种可用状态?

  线程在执行过程中,可以处于下面几种状态:

  就绪(Runnable):线程准备运行,不一定立马就能开始执行。

  运行中(Running):进程正在执行线程的代码。

  等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

  睡眠中(Sleeping):线程被强制睡眠。

  I/O阻塞(Blocked on I/O):等待I/O操作完成。

  同步阻塞(Blocked on Synchronization):等待获取锁。

  死亡(Dead):线程完成了执行。

  4.同步方法和同步代码块的区别是什么?

  在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。

  5.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

  监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

  6.什么是死锁(deadlock)?

  两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

  7.如何确保N个线程可以访问N个资源同时又不导致死锁?

  使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

  8.线程的sleep()方法和yield()方法有什么区别?

  - sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

  -线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

  - sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

  - sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

  9.举例说明同步和异步。

  如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好的例子)。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作。

  10.启动一个线程是调用run()还是start()方法?

  启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。

  Java集合类

  1.Java集合类框架的基本接口有哪些?