原因

  1. 焦虑。每次去面试更高的职位时候,内心总是担忧着那些面试题怎么解答。
  2. 很多问题在实际工作中并不会遇到,没有实际的解决问题经验,看过也记不住。
  3. 让你的Java知识功底更加强悍,后面的框架,微服务也好理解。

学习目标

  1. 收集常见经典的 Java 面试题。
  2. 做出答案,分享出去,和博友们进行讨论,不断进步。
  3. 扩大知识图谱,扎实基础,梳理知识脉络。
  4. 锻炼自己写文章以及排版的能力。
  5. 避免下次面试找工作的时候抓瞎。

文章目录

  • 1. JDK、JRE 和 JVM 的区别
  • 2. == 和 equals 的区别
  • 3. 基本类型和包装类对象使用 == 和 equals进行比较的结果?
  • 4. static存在的主要意义
  • 5. Java语言有哪些特点
  • 6. 什么是自动装箱?什么是自动拆箱?装箱和拆箱的执行过程?
  • 7. 两个对象hashCode()相同,equals() 也一定为 true吗?
  • 8. final、finally和finalize()区别
  • 9. final 与 static 的区别
  • 10. String对象中的replace和replaceAll的区别?
  • 11. Math.round(-1.5) 等于多少?
  • 12. String 属于基础的数据类型吗?
  • 13. String、StringBuffer和StringBuilder的区别?
  • 14. 普通类和抽象类有哪些区别?
  • 15. 抽象类与接口的区别?
  • 17. Java4种访问修饰符权限的区别?
  • 18. Java中的 << << >>> 是什么?
  • 19. throw 和 throws 的区别?
  • 20. 常见的异常类有哪些?
  • 21. 重载和重写有什么区别?
  • 22. 如何解决线程安全问题, 有几种方式?分别是什么?
  • 23. synchronized 与 Lock的异同?
  • 24. sleep() 和wait()的异同?
  • 25. wait()、notify()和notifyAll()的异同?
  • 26. 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?
  • 27. 比较ArrayList、LinkedList、Vector三者的异同?

Java 常见面试题

1. JDK、JRE 和 JVM 的区别

JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。

JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。

JVM:全称Java Virtual Machine,JVM就是我们常说的java虚拟机,它是整个Java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。

2. == 和 equals 的区别

==可以使用在基本数据类型和引用数据类型变量中。
如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等(不一定类型要相同)。
如果比较的是引用数据类型变量,比较两个变量的地址值是否相等。即两个引用是否指向同一个对象实体。

equals()只能适用引用数据类型。默认情况下,比较内存地址值是否相等。
Object类中equals的定义:

public boolean equals(Object obj) {return (this == obj);
}

通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。
那么我们就需要对Object类中的equals()进行重写。

//手动实现
public boolean equals(Object obj) {if (this == obj){return true;}if(obj instanceof Customer){Customer cust = (Customer)obj;//比较两个对象的每个属性是否相同
//      if(this.age == cust.age && this.name.equals(cust.name)){//          return true;
//      }else{//          return false;
//      }//或return this.age == cust.age && this.name.equals(cust.name);}else{return false;}
}
//自动生成的
右键生成

3. 基本类型和包装类对象使用 == 和 equals进行比较的结果?

1)值不同:使用 = = 和equals() 比较都返回false。

2)值相同:

使用 = = 比较:

  • 基本类型-基本类型、基本类型-包装对象返回true
  • 包装对象-包装对象返回false
  • 缓存中去的包装对象比较返回true(JVM 缓存部分基本类型常用的包装类对象,如 Integer 缓存 -128 ~ 127 )
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
//保存了从-128到+127范围的整数。如果我们使用自动装箱的方式,
//给Integer赋值的范围在-128到+127范围内时,可以直接使用数组中元素,不用再去new了。Integer m = 1;
Integer n = 1;
System.out.println(m == n);//trueInteger x = 128;
Integer y = 128;
System.out.println(x == y);//false

使用equals() 比较:

  • 包装对象-基本类型返回true
  • 包装对象-包装对象返回true
//以int和Integer为例:
@Test
public void test1(){int i1 = 10000;Integer i2 = new Integer(10000);Integer i3 = new Integer(10000);System.out.println("Integer 基本类型和包装对象使用 == 比较 : " + (i1 == i2));//Integer 基本类型和包装对象使用 == 比较 : trueSystem.out.println("Integer 基本类型和包装对象使用 equals 比较 : " + i2.equals(i1));//Integer 基本类型和包装对象使用 equals 比较 : trueSystem.out.println("Integer 包装对象和包装对象使用 == 比较 : " + (i2 == i3));//Integer 包装对象和包装对象使用 == 比较 : falseSystem.out.println("Integer 包装对象和包装对象使用 equals 比较 : " + i2.equals(i3));//Integer 包装对象和包装对象使用 equals 比较 : true
}

4. static存在的主要意义

static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法。

5. Java语言有哪些特点

  • 跨平台性

所谓的跨平台性,是指软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。这是软件发展的趋势和编程人员追求的目标。之所以这样说,是因为计算机硬件的种类繁多,操作系统也各不相同,不同的用户和公司有自己不同的计算机环境偏好,而软件为了能在这些不同的环境里正常运行,就需要独立于这些平台。

而在Java语言中, Java自带的虚拟机很好地实现了跨平台性。 Java源程序代码经过编译后生成二进制的字节码是与平台无关的,但是可被Java虚拟机识别的一种机器码指令。 Java虚拟机提供了一个字节码到底层硬件平台及操作系统的屏障,使得Java语言具备跨平台性。

  • 面向对象

面向对象是指以对象为基本粒度,其下包含属性和方法。对象的说明用属性表达,而通过使用方法来操作这个对象。面向对象技术使得应用程序的开发变得简单易用,节省代码。Java是一种面向对象的语言,也继承了面向对象的诸多好处,如代码扩展、代码复用等。

  • 安全性

安全性可以分为四个层面,即语言级安全性、编译时安全性、运行时安全性、可执行代码安全性。语言级安全性指Java的数据结构是完整的对象,这些封装过的数据类型具有安全性。编译时要进行Java语言和语义的检查,保证每个变量对应一个相应的值,编译后生成Java类。运行时Java类需要类加载器载入www jxzxmr net,并经由字节码校验器校验之后才可以运行。 Java类在网络上使用时,对它的权限进行了设置,保证了被访问用户的安全性。

  • 多线程

多线程在操作系统中已得到了最成功的应用。多线程是指允许一个应用程序同时存在两个或两个以上的线程,用于支持事务并发和多任务处理。 Java除了内置的多线程技术之外,还定义了一些类、方法等来建立和管理用户定义的多线程。

  • 简单易用

Java源代码的书写不拘泥于特定的环境,可以用记事本、文本编辑器等编辑软件来实现,然后将源文件进行编译,编译通过后可直接运行,通过调试则可得到想要的结果。

6. 什么是自动装箱?什么是自动拆箱?装箱和拆箱的执行过程?

JDK 5.0新特性:自动装箱与自动拆箱
自动装箱:基本数据类型 —> 包装类
自动拆箱:包装类 —> 基本数据类型

int num1=10;
Integer num2=num1;//自动装箱Integer a=10;
int b=a;//自动拆箱

装箱是通过调用包装器类的 valueOf 方法实现的
拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。
如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法。

7. 两个对象hashCode()相同,equals() 也一定为 true吗?

不一定。
类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。
hashCode()返回该对象的哈希值;equals()返回两个对象是否相等。

8. final、finally和finalize()区别

final 表示最终的、不可改变的。用于修饰类、方法和变量。
用final修饰的类不能被其他类所继承。
用final修饰的方法不能被重写。
修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化。
修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。

finally 异常处理的一部分,它只能用在try/catch语句中,finally中声明的是一定会被执行的代码。即便catch中又出现异常了,try中有return语句,catch中有return语句等情况。

finalize()是在java.lang.Object里定义的,Object的finalize方法什么都不做,对象被回收时finalized方法会被调用。
特殊情况下,可重写finalize方法,当对象被回收的时候释放一些资源。但注意,要调用super.finalize()。

9. final 与 static 的区别

都可以修饰类、方法、成员变量。

static可以修饰类的代码块,final不可以。
static不可以修饰方法内的局部变量,final可以。

static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性 / 方法名 访问
static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次
static静态变量的加载早于对象的创建。
static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次。
static修饰的变量可以重新赋值
static方法中不能用this和super关键字
static方法必须被实现,而不能是抽象的abstract
static方法只能被static方法覆盖

final修饰表示常量、一旦创建不可改变。
final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中赋值,不可以重新赋值。
final方法不能被子类重写。
final类不能被继承,没有子类,final类中的方法默认是final的。
final不能用于修饰构造方法。
private类型的方法默认是final类型的。

10. String对象中的replace和replaceAll的区别?

replace方法:支持字符和字符串的替换。
public String replace(char oldChar, char newChar)
public String replace(CharSequence target, CharSequence replacement)

replaceAll方法:基于正则表达式的字符串替换。
public String replaceAll(String regex, String replacement)

代码:

public static void main(String[] args) {String str = "Hello Java. Java is a language.";System.out.println(str.replace("Java.", "c++"));//打印 Hello c++ Java is a language.System.out.println(str.replaceAll("Java.", "c++"));//打印 Hello c++ c++is a language.
}

11. Math.round(-1.5) 等于多少?

结果是:-1。

扩展JDK中的java.lang.Math类
round:返回四舍五入,负.5小数返回较大整数,如-1.5返回-1。
ceil:返回小数所在两整数间的较大值,如-1.5返回-1。
tail:返回小数所在两整数间的较小值,如-1.5返回-2。

代码:

 Math.round(1.4)=1Math.round(-1.4)=-1Math.round(1.5)=2Math.round(-1.5)=-1Math.round(1.6)=2Math.round(-1.6)=-2Math.ceil(1.4)=2.0Math.ceil(-1.4)=-1.0Math.ceil(1.5)=2.0Math.ceil(-1.5)=-1.0Math.ceil(1.6)=2.0Math.ceil(-1.6)=-1.0Math.floor(1.4)=1.0Math.floor(-1.4)=-2.0Math.floor(1.5)=1.0Math.floor(-1.5)=-2.0Math.floor(1.6)=1.0Math.floor(-1.6)=-2.0

12. String 属于基础的数据类型吗?

不属于。
Java8种基础的数据类型:byte、short、char、int、long、float、double、boolean。

13. String、StringBuffer和StringBuilder的区别?

String :不可变的字符序列;底层使用char[]存储。
StringBuffer : 可变的字符序列;线程安全的,效率低;底层使用char[]存储。
StringBuilder : 可变的字符序列; jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储。
注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。

源码分析:
String str = new String();//char[] value = new char[0];
String str1 = new String(“abc”);//char[] value = new char[]{‘a’,‘b’,‘c’};

StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];//底层创建了一个长度是16的数组
System.out.println(sb1.length());//0
sb1.append(‘a’);//value[0] = ‘a’;
sb1.append(‘b’);//value[1] = ‘b’;

StringBuffer sb2 = new StringBuffer(“abc”)

Java 基础常见面试题大全相关推荐

  1. Java基础常见面试题(一)

    Java基础常见面试题(一) 1. 为什么说 Java 语言"编译与解释并存"? 我们可以将高级编程语言按照程序的执行方式分为两种: 编译型 :编译型语言会通过编译器将源代码一次性 ...

  2. Java 基础常见面试题(持续更新)

    目录 1.Java 程序设计概述 1.1.Java 跨平台运行的原理是什么? 1.2.Java 的安全性体现在哪些方面? 1.3.面向对象和面向过程的区别是什么? 1.4.面向对象的有哪些特征? 1. ...

  3. java基础常见面试题

    125条常见的j ava面试笔试题大汇总 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前 目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用 ...

  4. Java基础常见面试题总结

    基础概念与常识 Java 语言有哪些特点? 简单易学: 面向对象(封装,继承,多态): 平台无关性( Java 虚拟机实现平台无关性): 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操 ...

  5. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  6. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  7. Java工程师常见面试题集锦

    Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...

  8. java陷阱常见面试题_Java常见陷阱

    java陷阱常见面试题 总览 Java是一种极简主义的语言,具有比其他语言故意更少的功能,尽管如此,Java仍然具有产生奇怪效果的边缘情况,甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举. 如果 ...

  9. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  10. Java虚拟机常见面试题

    2019独角兽企业重金招聘Python工程师标准>>> 1.java引用的四种状态 强引用.软引用.弱引用.虚引用. 强引用 new一个Object存放在堆内存,然后用一个引用指向它 ...

最新文章

  1. CentOS环境下tomcat启动超级慢的解决方案
  2. Android热修复升级探索——SO库修复方案
  3. php将文件夹打包zip文件,php将文件夹打包成zip文件
  4. 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2
  5. Qt中的QFileDialog类的几个示范代码
  6. 泛型集合 无序泛型 c#
  7. “那不勒斯”服务器芯片,32核/64超线程:AMD 公开 Naples “那不勒斯” 部分规格和性能...
  8. 『线性同余方程和中国剩余定理』
  9. python pip download_Python Pip 参考手册 - pip download 命令
  10. windows + Linux 自定义模板配置 怎么使用自定义规范管理器
  11. BigDecimal参数8种舍入方式
  12. 38. 数字在排序数组中出现的次数(C++版本)
  13. java 字符串string、int和arraylist互转
  14. 从头开始聊P问题、NP问题与NPC问题
  15. oracle卸载步骤图解,Oracle安装卸载图文教程详解
  16. C++编程第一步:判断一个数字是不是整数
  17. webpack如何将css文件单独抽离
  18. 关于显示屏分辨率的问题
  19. Tailwind 初识
  20. Java银行卡校验API

热门文章

  1. 破解intelliJ idea 2017
  2. STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植
  3. IP 地址聚合 经典算法 已经过验证
  4. idea使用maven命令
  5. 二元函数洛必达求极限_利用洛必达法则求二元函数的极限
  6. js判断设备是PC端还是移动端
  7. 行政区划代码2020(SQL)--(上)
  8. PADS9.5 导入立创元器件库卡顿
  9. Max Script|加密写法
  10. 2018-11-3-如何使用-Telegram