JAVA 面试宝典01

一、基础

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关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Javastatic 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。

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

  Java 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

6.Overload 和 Override 的区别?

  方法的重写 Overriding 和重载 OverloadingJava 多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

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

  Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 privateprotected 或者是 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.概括的解释下线程的几种可用状态。

  1. 新建( new ):新创建了一个线程对象。
  2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start
    ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
  3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执
    行程序代码。
  4. 阻塞( 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 )状
    态。
  5. 死亡( 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 代码块同步关键代码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cs阿坤dn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值