Java面试八股文(自用)(二)

目录

一、面向对象的三大特征

二、接口和抽象类 

 三、深拷贝、浅拷贝和引用拷贝

四、String、StringBuilder、StringBuffer

五、字符串常量池

六、Java中的异常

七、泛型

八、值传递&引用传递

九、序列化和反序列化

十、反射机制

十一、注解

十二、JavaBean

十三、this关键字

十四、a=a+b与a+=b区别?

十五、什么是Java语法糖?

1、switch 语句支持 String 类型

2、泛型

3、自动拆箱与装箱

4、可变长参数

5、枚举

6、增强的for-each循环

7.lambda表达式 

十六、List、Set、Queue、Map

十七、ArrayList 和 Array区别

十八、断言

十九、内部类

二十、匿名内部类

一、面向对象的三大特征

封装,继承,多态,详见 

Java基础知识速成笔记“超实用”学完就去实战!(一)-CSDN博客

二、接口和抽象类 

  • 抽象类可以有构造方法,接口不能有构造方法。
  • 抽象类可以有成员变量,接口中只能包含常量。
  • 类可以继承一个抽象类,但可以实现多个接口。
  • 抽象类提供了一种代码重用的机制,而接口提供了一种规范的定义。
  • 使用抽象类来表示一种通用的概念,并在子类中实现具体的行为。
  • 使用接口来定义类的行为规范,实现类可以根据需要实现不同的接口来拥有不同的行为。

详见 Java基础知识速成笔记“超实用”学完就去实战!(一)-CSDN博客

 三、深拷贝、浅拷贝和引用拷贝

  1. 浅拷贝(Shallow Copy):

    • 浅拷贝是指将一个对象的字段复制到另一个对象中,但对于字段中的引用类型,只复制引用,而不复制引用指向的对象本身。因此,原始对象和拷贝对象共享引用类型字段指向的对象。
    • 如果对原始对象中的引用类型字段所指向的对象进行修改,这些修改也会反映在拷贝对象中。
    • 浅拷贝通常是通过复制对象的每个字段来实现,但对于引用类型字段,只复制引用而不复制引用指向的对象。
  2. 深拷贝(Deep Copy):

    • 深拷贝是指将一个对象及其所有嵌套的对象的内容都复制到一个新对象中。这包括复制原始对象的所有字段以及它们所引用的对象,以及这些对象引用的对象,依此类推。
    • 深拷贝生成的拷贝对象与原始对象完全独立,它们之间没有任何共享部分。因此,对深拷贝对象或其嵌套对象的修改不会影响原始对象或其他拷贝对象。
  3. 引用拷贝(Reference Copy):

    • 引用拷贝实际上不是一种复制,而是简单地将一个引用指向的对象赋值给另一个引用。这意味着两个引用指向的是同一个对象,它们共享相同的内存空间
    • 对其中一个引用指向的对象进行修改会直接影响另一个引用指向的对象,因为它们实际上是同一个对象的两个引用。

总的来说,深拷贝会完全复制对象及其嵌套的所有对象,而浅拷贝只复制对象的字段而不复制字段引用的对象。引用拷贝则简单地创建了指向同一对象的新引用。

Java面试八股文(自用)(二)_第1张图片

四、String、StringBuilder、StringBuffer

String长度不可变,相当于常量,StringBuilder线程不安全,StringBuffer线程安全。

在Java中,String的长度是不可变的。一旦一个String对象被创建,它的长度就固定了,不能再改变。这意味着你不能直接修改一个String对象的长度。当你对一个String进行操作时(例如连接、剪切等),实际上是创建了一个新的String对象,而原始的String对象保持不变

如果你需要处理可变长度的字符串,可以使用Java中的其他数据结构,比如StringBuilder或StringBuffer。这些类允许你在字符串上进行修改操作,而不必创建新的对象

总结:

  1. 操作少量的数据: 适用 String
  2. 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

详见Java中的常见类“StringBuilder、StringBuffer类”(四)用法详解-CSDN博客 

五、字符串常量池

在Java中,字符串常量池是一个特殊的内存区域,用于存储字符串字面量。当你创建一个字符串字面量时,Java会首先检查字符串常量池。如果已经存在相同内容的字符串,则返回该字符串的引用,而不会创建新的字符串对象。这种机制被称为字符串的“interning”(内部化)。 

// 在堆中创建字符串对象”ab“
// 将字符串对象”ab“的引用保存在字符串常量池中
String aa = "ab";
// 直接返回字符串常量池中字符串对象”ab“的引用
String bb = "ab";
System.out.println(aa==bb);// true

六、Java中的异常

异常是一种对象,它包含有关错误状态的信息,并在异常发生时通过异常处理机制传播到调用栈上层。Java中的异常类都继承自 Throwable 类,它有两个主要的子类:ExceptionError Java面试八股文(自用)(二)_第2张图片

·Exception 类及其子类通常用于表示可以通过合适的处理措施来恢复程序正常执行的异常情况 

·Error 类及其子类通常用于表示无法通过程序处理的严重异常情况,这些情况通常属于系统级别的问题,例如内存不足或虚拟机崩溃。与 Exception 不同,Error 类通常不被程序捕获和处理,而是由Java虚拟机或操作系统处理 

 Throwable 类常用方法

  1. getMessage(): 返回异常的详细描述信息字符串。通常,这个描述包含异常的原因或上下文信息。
try {
    // 可能抛出异常的代码
} catch (Exception e) {
    System.out.println(e.getMessage());
}
  1. printStackTrace(): 打印异常跟踪栈信息到标准错误流。这个方法会将异常发生的地点以及方法调用的堆栈信息打印出来,以帮助调试程序。
try {
    // 可能抛出异常的代码
} catch (Exception e) {
    e.printStackTrace();
}
  1. getCause(): 返回导致异常的原因(如果有的话)。通常在异常链中使用,如果异常是由另一个异常引起的,那么可以使用该方法获取引起异常的原因。
try {
    // 可能抛出异常的代码
} catch (Exception e) {
    Throwable cause = e.getCause();
    // 处理异常的原因
}
  1. toString(): 返回包含异常类名和异常消息的字符串。通常,这个方法返回的是异常类的全限定名以及异常的详细描述信息。
try {
    // 可能抛出异常的代码
} catch (Exception e) {
    System.out.println(e.toString());
}

详见Java基础知识速成笔记“超实用”学完就去实战!(一)-CSDN博客 

七、泛型

泛型是一种编程机制,允许在类或方法中使用参数化类型(Parameterized Type)

详见Java基础知识速成笔记“超实用”学完就去实战!(一)-CSDN博客

八、值传递&引用传递

  • 值传递:方法接收的是实参值的拷贝,会创建副本。
  • 如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。
  • 如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。
  • 引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。

Java中只有值传递!!! C++中有引用传递。

1.传递基本数据类型参数

public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;
    swap(num1, num2);
    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);
}

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    System.out.println("a = " + a);
    System.out.println("b = " + b);
}
a = 20
b = 10
num1 = 10
num2 = 20

 2.传递引用类型参数

  public static void main(String[] args) {
      int[] arr = { 1, 2, 3, 4, 5 };
      System.out.println(arr[0]);
      change(arr);
      System.out.println(arr[0]);
  }

  public static void change(int[] array) {
      // 将数组的第一个元素变为0
      array[0] = 0;
  }
1
0

你可能感兴趣的:(Java编程知识,Java面试常见问题整理,面试,职场和发展,java,开发语言,spring)