Java常见面试题汇总(一)

1)什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个能够运行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机运行的字节码文件。
Java被设计成同意应用程序能够执行在随意的平台,而不须要程序猿为每个平台单独重写或者是又一次编译。

Java虚拟机让这个变为可能。由于它知道底层硬件平台的指令长度和其它特性。

2)JDK和JRE的差别是什么?

Java运行时环境(JRE)是将要运行Java程序的Java虚拟机。它同一时候也包括了运行applet须要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包括了JRE。编译器和其它的工具(比方:JavaDoc,Java调试器)。能够让开发人员开发、编译、运行Java应用程序。


3)”static”keyword是什么意思?Java中能否够覆盖(override)一个private或者是static的方法?

“static”keyword表明一个成员变量或者是成员方法能够在没有所属的类的实例变量的情况下被訪问。


Java中static方法不能被覆盖,由于方法覆盖是基于执行时动态绑定的。而static方法是编译时静态绑定的。static方法跟类的不论什么实例都不相关。所以概念上不适用。

4)能否够在static环境中訪问非static变量?

static变量在Java中是属于类的,它在全部的实例中的值是一样的。当类被Java虚拟机加载的时候。会对static变量进行初始化。

假设你的代码尝试不用实例来訪问非static的变量。编译器会报错,由于这些变量还没有被创建出来,还没有跟不论什么实例关联上。

5)Java支持的数据类型有哪些?什么是自己主动拆装箱?

Java语言支持的8中基本数据类型是:byte、short、int、long、float、double、boolean、char
自己主动装箱是Java编译器在基本数据类型和相应的对象包装类型之间做的一个转化。比方:把int转化成Integer,double转化成Double,等等。反之就是自己主动拆箱。


6)Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名同样可是參数不同的情况。与此相对,方法覆盖是说子类又一次定义了父类的方法。方法覆盖必须有同样的方法名,參数列表和返回类型。

覆盖者可能不会限制它所覆盖的方法的訪问。


7)Java中。什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每个类都有构造函数。在程序猿没有给类提供构造函数的情况下。Java编译器会为这个类创建一个默认的构造函数。
Java中构造函数重载和方法重载非常相似。能够为一个类创建多个构造函数。每个构造函数必须有它自己唯一的參数列表。
Java不支持像C++中那样的复制构造函数,这个不同点是由于假设你不自己写构造函数的情况下。Java不会创建默认的复制构造函数。


8)Java支持多继承么?

Java中类不支持多继承,仅仅支持单继承(即一个类仅仅有一个父类)。 可是java中的接口支持多继承,,即一个子接口能够有多个父接口。

(接口的作用是用来扩展对象的功能。一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了对应的功能)。

9)接口和抽象类的差别是什么?

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中全部的方法隐含的都是抽象的。而抽象类则能够同一时候包括抽象和非抽象的方法。
类能够实现非常多个接口,可是仅仅能继承一个抽象类
类能够不实现抽象类和接口声明的全部方法。当然。在这样的情况下,类也必须得声明成是抽象的。
抽象类能够在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类能够包括非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数能够是private,protected或者是public。
接口是绝对抽象的,不能够被实例化。抽象类也不能够被实例化,可是,假设它包括main方法的话是能够被调用的。

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

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


对象被引用传递,意味着传递的并非实际的对象。而是对象的引用。因此,外部对引用对象所做的改变会反映到全部的对象上。
11)进程和线程的差别是什么?

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

12)创建线程有几种不同的方式?你喜欢哪一种?为什么?

有三种方式能够用来创建线程:
继承Thread类
实现Runnable接口
应用程序能够使用Executor框架来创建线程池
实现Runnable接口这样的方式更受欢迎,由于这不须要继承Thread类。在应用设计中已经继承了别的对象的情况下。这须要多继承(而Java不支持多继承),仅仅能实现接口。

同一时候,线程池也是非常高效的,非常easy实现和使用。

13)概括的解释下线程的几种可用状态。


新建、可执行、执行、堵塞、死亡


14)同步方法和同步代码块的差别是什么?

差别:
同步方法默认用this或者当前类class对象作为锁;
同步代码块能够选择以什么来加锁,比同步方法要更细颗粒度。我们能够选择仅仅同步会发生同步问题的部分代码而不是整个方法;

15)在监视器(Monitor)内部,是怎样做线程同步的?程序应该做哪种级别的同步?

监视器和锁在Java虚拟机中是一块使用的。

监视器监视一块同步代码块。确保一次仅仅有一个线程运行同步代码块。每个监视器都和一个对象引用相关联。线程在获取锁之前不同意运行同步代码。


16)什么是死锁(deadlock)?

两个或多个进程都在等待其它部分进程运行完成才干继续往下运行的时候就发生了死锁。

结果就是全部进程都陷入了无限的等待中。

17)怎样确保N个线程能够訪问N个资源同一时候又不导致死锁?

使用多线程的时候,一种很easy的避免死锁的方式就是:指定获取锁的顺序。并强制线程依照指定的顺序获取锁。因此,假设全部的线程都是以相同的顺序加锁和释放锁,就不会出现死锁了。

18)Java集合类框架的基本接口有哪些?

集合类接口指定了一组叫做元素的对象。集合类接口的每一种详细的实现类都能够选择以它自己的方式对元素进行保存和排序。

有的集合类同意反复的键,有些不同意。
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最主要的接口有:
Collection:代表一组对象。每个对象都是它的子元素。


Set:不包括反复元素的Collection。
List:有顺序的collection。而且能够包括反复元素。
Map:能够把键(key)映射到值(value)的对象,键不能反复。

19)为什么集合类没有实现Cloneable和Serializable接口?

克隆(cloning)或者是序列化(serialization)的语义和含义是跟详细的实现相关的。因此,应该由集合类的详细实现来决定怎样被克隆或者是序列化。


20)什么是迭代器(Iterator)?

Iterator接口提供了非常多对集合元素进行迭代的方法。每个集合类都包括了能够返回迭代器实例的迭代方法。迭代器能够在迭代的过程中删除底层集合的元素,可是不能够直接调用集合的remove(Object Obj)删除,能够通过迭代器的remove()方法删除。


原文地址:https://www.cnblogs.com/clnchanpin/p/7218805.html