Java高频面试之SE-20

hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝

Java的泛型是什么?

Java 泛型(Generics) 是 Java 5 引入的一项重要特性,用于增强代码的类型安全性和重用性。泛型允许在定义类、接口和方法时使用类型参数,从而使代码更加通用且减少类型转换的需求。


1. 泛型的基本概念

泛型的核心思想是 参数化类型,即在定义类、接口或方法时,使用一个或多个类型参数(通常用 TEKV 等表示),在实际使用时再指定具体的类型。

示例:泛型类
// 定义一个泛型类
class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

// 使用泛型类
Box<Integer> integerBox = new Box<>();
integerBox.setValue(123);
System.out.println(integerBox.getValue()); // 输出: 123

Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
System.out.println(stringBox.getValue()); // 输出: Hello
  • Box 是一个泛型类,T 是类型参数。
  • 在使用时,Box 表示 T 被替换为 IntegerBox 表示 T 被替换为 String

2. 泛型的好处

  • 类型安全:编译时检查类型,避免运行时类型转换错误。
  • 代码重用:通过泛型可以编写通用的代码,适用于多种类型。
  • 减少类型转换:无需手动进行类型转换,代码更简洁。

3. 泛型的类型参数

  • 单个类型参数:如 T
  • 多个类型参数:如 KV(常用于键值对)。
  • 命名约定
    • T:类型(Type)
    • E:元素(Element)
    • K:键(Key)
    • V:值(Value)
    • N:数字(Number)
示例:多个类型参数
class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

Pair<String, Integer> pair = new Pair<>("Age", 25);
System.out.println(pair.getKey() + ": " + pair.getValue()); // 输出: Age: 25

4. 泛型方法

泛型方法是在方法级别使用类型参数,可以在普通类、泛型类或静态方法中定义。

示例:泛型方法
class Util {
    // 定义一个泛型方法
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

// 使用泛型方法
Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};

Util.printArray(intArray); // 输出: 1 2 3
Util.printArray(strArray); // 输出: A B C
  • 是方法的类型参数。
  • 调用时,编译器会根据传入的参数类型自动推断 T 的具体类型。

5. 泛型通配符

泛型通配符 ? 用于表示未知类型,通常用于方法参数中,以增强灵活性。

(1)无界通配符

表示任意类型。

public void printList(List<?> list) {
    for (Object element : list) {
        System.out.print(element + " ");
    }
    System.out.println();
}
(2)上界通配符

表示类型必须是 T 或其子类。

public double sumOfList(List<? extends Number> list) {
    double sum = 0.0;
    for (Number number : list) {
        sum += number.doubleValue();
    }
    return sum;
}
(3)下界通配符

表示类型必须是 T 或其父类。

public void addNumbers(List<? super Integer> list) {
    for (int i = 1; i <= 5; i++) {
        list.add(i);
    }
}

6. 泛型的类型擦除

Java 的泛型是通过 类型擦除(Type Erasure) 实现的,即在编译时擦除类型参数,将其替换为 Object 或上界类型。

示例:类型擦除
class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

// 编译后,Box 会被擦除为:
class Box {
    private Object value;

    public void setValue(Object value) {
        this.value = value;
    }

    public Object getValue() {
        return value;
    }
}
  • 优点:兼容旧版本的 Java 代码。
  • 缺点:无法在运行时获取泛型的实际类型。

7. 泛型的限制

  • 基本类型不能作为类型参数:如 Box 是非法的,必须使用包装类 Box
  • 无法创建泛型类型的实例:如 new T() 是非法的。
  • 无法创建泛型数组:如 new T[10] 是非法的。

8. 泛型的实际应用

  • 集合框架:如 ListMap
  • 工具类:如 Collections.sort(List)
  • 自定义数据结构:如栈、队列、链表等。

IDEA ji huo
https://pan.quark.cn/s/4216736c0427
最新大全(唐探)
https://kdocs.cn/l/cqhxNU9I2lLD
deepSeek最全资料包
https://pan.quark.cn/s/2308ac09ed43

你可能感兴趣的:(java,面试,开发语言)