当前位置:   article > 正文

Java 基础常见面试题大全_java基础面试

java基础面试

原因

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

学习目标

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


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);
}
  • 1
  • 2
  • 3

通常情况下,我们自定义的类如果使用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;
	}
}
//自动生成的
右键生成
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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);//true

Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

使用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 基本类型和包装对象使用 == 比较 : true
    System.out.println("Integer 基本类型和包装对象使用 equals 比较 : " + i2.equals(i1));//Integer 基本类型和包装对象使用 equals 比较 : true
    System.out.println("Integer 包装对象和包装对象使用 == 比较 : " + (i2 == i3));//Integer 包装对象和包装对象使用 == 比较 : false
    System.out.println("Integer 包装对象和包装对象使用 equals 比较 : " + i2.equals(i3));//Integer 包装对象和包装对象使用 equals 比较 : true
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;//自动拆箱
  • 1
  • 2
  • 3
  • 4
  • 5

装箱是通过调用包装器类的 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.
}
  • 1
  • 2
  • 3
  • 4
  • 5

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)=1
	Math.round(-1.4)=-1
	Math.round(1.5)=2
	Math.round(-1.5)=-1
	Math.round(1.6)=2
	Math.round(-1.6)=-2
	
	Math.ceil(1.4)=2.0
	Math.ceil(-1.4)=-1.0
	Math.ceil(1.5)=2.0
	Math.ceil(-1.5)=-1.0
	Math.ceil(1.6)=2.0
	Math.ceil(-1.6)=-1.0
	
	Math.floor(1.4)=1.0
	Math.floor(-1.4)=-2.0
	Math.floor(1.5)=1.0
	Math.floor(-1.5)=-2.0
	Math.floor(1.6)=1.0
	Math.floor(-1.6)=-2.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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”) 本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签