一、基础
1.简述 JDK 跟 JRE 的区别
Jdk
是 java 开发人员在开发过程使用的软件开发包,他提供了 java 的开发环境和运行环境,JRE
是 Java Runtime Enviroment 是指 Java 的运行环境,如果你只想跑 java 程序,只要安装 jre 就够了,如果要从事开发就得安装 jdk。
2.简述 path 跟 classpath 的区别
Path
是系统变量,跟 java 无关,里面存放的是各种可执行的应用程序的路径。Classpath
是给 java 使用的,从字面上来理解,就是类的路径,主要是模仿 path,将类文件的路径配置到 classpath 中实现在系统的任何位置可以对类文件进行编译和执行。
3.Java 的关键字中有没有 goto
Goto
是 java
中的保留字不是关键字的一员。
4.”static”关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是 static 的方法?
static
关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java
中 static
方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static
方法是编译时静态绑定的。static
方法跟类的任何实例都不相关,所以概念上不适用。
5.Java 中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java
中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
6.Overload 和 Override 的区别?
方法的重写 Overriding
和重载 Overloading
是 Java
多态性的不同表现。重写 Overriding
是父类与子类之间多态性的一种表现,重载 Overloading
是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
7.接口和抽象类的区别是什么?
Java
提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java
接口中声明的变量默认都是 final
的。抽象类可以包含非 final
的变量。Java
接口中的成员函数默认是 public
的。抽象类的成员函数可以是 private
,protected
或者是 public
。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main
方法的话是可以被调用的。也可以参考 JDK8
中抽象类和接口的区别。
8.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
9.Java 的基本数据类型跟引用数据类型分别有哪些?
Java
的基本数据类型有 8 个分别是 整数型 byte shrot int long char
浮点型 float double
字符型 char
布尔型 bollean
。
10.char 型变量中能不能存贮一个中文汉字? 为什么?
char
型变量是用来存储 Unicode
编码的字符的,unicode
编码字符集中包含了汉字,所以,char
型变量中当然可以存储汉字啦。
11.简述&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true
时,整个运算结果才为 true
,否则,只要有一方为 false
,则结果为 false
。&&还具有短路的功能,即如果第一个表达式为 false
,则不再计算第二个表达式&还可以用作位运算符。
12.Java 中垃圾回收有什么目的?什么时候进行垃圾回收?
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
13.如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。
二、多线程
1.进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
2.创建线程有几种不同的方式?
有三种方式可以用来创建线程:
继承 Thread
类实现 Runnable
接口应用程序可以使用 Executor
框架来创建线程池实现 Runnable
接口这种方式更受欢迎,因为这不需要继承 Thread
类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而 Java
不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
3.概括的解释下线程的几种可用状态。
- 新建( new ):新创建了一个线程对象。
- 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start
()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。 - 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执
行程序代码。 - 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu
timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu
timeslice 转到运行( running )状态。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队
列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占
用,则 JVM 会把该线程放入锁池( lock pool )中。
(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者
发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。 当 sleep ()状态超时、
join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状
态。 - 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该
线程结束生命周期。死亡的线程不可再次复生。
举例:早上打车去上班
新建(准备叫一辆嘀嘀打车)
可运行(找到一辆可以带你去上班的车)
运行(司机接到你,带你去上班)
阻塞(路上堵车了)
死亡(到公司了,付钱下车)
4.同步方法和同步代码块的区别是什么?
同步方法默认用 this 或者当前类 class 对象作为锁;同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
5.什么是死锁(deadlock)?
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。
6.如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
7.sleep() 和 wait() 的区别
sleep
指线程被调用时,占着 CPU
不工作,形象地说明为“占着 CPU 睡觉”,此时,系统的CPU 部分资源被占用,其他线程无法进入,会增加时间限制。wait
指线程处于进入等待状态,形象地说明为“等待使用 CPU”,此时线程不占用任何资源,不增加时间限制。
8.实现同步的方式
同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized
关键字。
1.同步方法
即有 synchronized
关键字修饰的方法。由于 java
的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。代码如:public synchronized void save(){}
注: synchronized
关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
2.同步代码块
即有 synchronized
关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步代码如:
synchronized(object){
}
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用 synchronized
代码块同步关键代码即可。