言成言成啊 | Kit Chen's Blog

Java面试八股文

发布于2024-01-30 00:06:41,更新于2024-02-19 16:37:48,标签:java  转载随意,文章会持续修订,请注明来源地址:https://meethigher.top/blog

一、Java基础

1 什么是Java

Java是一种面向对象的编程语言,由Sun公司开发,后被Oracle公司收购。

Java具有跨平台的特性,可以在不同的操作系统上运行。

Java语言具有良好的可读性、可移植性、可扩展性和可靠性等特点。

2 Java中的数据类型有哪些

Java中的数据类型包括基本数据类型引用数据类型

基本数据类型

  • byte:1字节
  • short:2字节
  • int:4字节
  • long:8字节
  • float:4字节
  • double:8字节
  • char:2字节
  • boolean:1字节

引用数据类型

  • 类:Object子类,包含基本数据类型的包装类
  • 接口
  • 数组
  • 枚举
  • 注解

基本数据类型是存储实际数值的简单类型,而引用数据类型是用于处理对象的引用,通过引用可以访问对象的内容。

3 自动装箱与自动拆箱

基本数据类型和包装数据类型区别

  • 包装数据类型属于引用类型,指向具体的地址或者为null
  • 基本数据类型必须有值,不初始化时一般默认值为0
基本数据类型包装数据类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

自动装箱与自动拆箱是Java5中新增的特性。

自动装箱指的是将基本数据类型自动转换为对应的包装数据类型。自动拆箱指的是将包装数据类型转换为对应的基本数据类型。

1
2
3
4
5
6
Integer a = 1;//自动装箱,相当于Integer a=new Integer(1)
int b = a;//自动拆箱
//可以通过断点查看a和b,会发现一个是引用数据类型,一个是基本数据类型
Integer c = a;//对象c指向a的地址
a = 2;//a通过自动装箱,放弃原地址指向新的地址
System.out.printf("a=%s,b=%s,c=%s%n", a, b, c);//a=2,b=1,c=1

4 什么是泛型

泛型是Java5中新增的特性。可以使代码更加灵活和安全,通过使用泛型,可以在编译时检查类型安全,避免在运行时出现类型转换错误。

泛型的使用场景有

  1. 泛型类(Generic Class):

    • 使用泛型的类可以有一个或多个类型参数,这些参数用尖括号 <T> 括起来。
    • 类中的字段、方法参数和返回类型可以使用这些类型参数,使得类可以操作任意类型的数据。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Box<T> {
    private T value;

    public T getValue() {
    return value;
    }

    public void setValue(T value) {
    this.value = value;
    }
    }
  2. 泛型方法(Generic Method):

    • 泛型方法是在调用时指定类型参数的方法。
    • 方法中的类型参数可以与类中的不同,使得方法可以独立于类使用泛型。
    1
    2
    3
    4
    public <T> T exampleMethod(T input) {
    // 方法逻辑...
    return input;
    }
  3. 泛型接口(Generic Interface):

    • 泛型接口定义了一个或多个类型参数,使得实现该接口的类可以支持不同类型的数据。
    1
    2
    3
    4
    public interface List<T> {
    void add(T element);
    T get(int index);
    }
  4. 通配符(Wildcard):

    • 使用通配符可以在不知道具体类型的情况下操作泛型对象。
    • <?> 表示未知类型,<? extends T> 表示类型的上界,<? super T> 表示类型的下界。
    1
    2
    3
    public void processList(List<?> list) {
    // 处理泛型列表的逻辑...
    }
  5. 类型擦除(Type Erasure):

    • Java的泛型是通过类型擦除实现的,即在编译时擦除类型信息,使得泛型在运行时不再存在。
    • 运行时使用原始类型(raw type)来处理泛型对象。

5 什么是反射

反射是Java中的一种机制,可以在程序运行时动态地获取类的信息,并调用类中的方法和属性。反射可以让程序在运行时根据需要动态地创建对象、调用方法、获取属性等等。

1
2
3
4
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("getName");
String name = (String) method.invoke(obj);

6 什么是异常

异常是Java中的一种错误机制,用于处理程序中出现的异常情况。

Java中的异常分为受检查异常和不受检查异常(也称运行时异常)。

受检查异常需要在方法签名中声明,调用方必须进行处理或者抛出异常。

不受检查异常不需要在方法签名中声明,可以在任何地方抛出。

7 什么是集合

集合是Java中的一种数据结构,用于存储一组对象。Java中的集合分为List、Set和Map三种类型。

List用于存储有序的元素,可以重复。

Set用于存储无序的元素,不允许重复。

Map用于存储键值对,键不允许重复。

8 什么是序列化

序列化是将对象的状态保存到文件或者网络中,以便后续恢复。

Java中的序列化使用ObjectOutputStream进行对象序列化,使用ObjectInputStream进行对象反序列化。

序列化可以用于数据持久化、远程通信等场景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.*;

class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}
}

public class SerializationExample {
public static void main(String[] args) {
// 创建一个 Person 对象
Person person = new Person("John Doe", 30);

// 序列化到文件
serializeToFile(person, "person.ser");
System.out.println("Person 对象已序列化到文件.");

// 从文件反序列化
Person deserializedPerson = deserializeFromFile("person.ser");
System.out.println("从文件反序列化得到的 Person 对象: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge());
}

private static void serializeToFile(Object object, String filename) {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
out.writeObject(object);
} catch (IOException e) {
e.printStackTrace();
}
}

private static Person deserializeFromFile(String filename) {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
return (Person) in.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}

9 什么是多线程

多线程是指在一个进程中同时运行多个线程,每个线程可以独立地执行不同的任务。

Java中的多线程使用Thread类和Runnable接口实现。

多线程可以提高程序的并发性和效率,但也会带来线程安全问题。最典型的比如数据不一致:多个线程对共享对象进行读写操作,但由于缺乏同步机制,数据会存在不一致的问题。

10 什么是 synchronized?

synchronized是Java中的一种同步机制,用于保证多个线程对共享资源访问的可见性和互斥性。

二、Java面向对象

发布:2024-01-30 00:06:41
修改:2024-02-19 16:37:48
链接:https://meethigher.top/blog/2024/java-interview-summary/
标签:java 
付款码 打赏 分享
shift+ctrl+1可控制目录显示