MST

星途 面试题库

面试题:Java泛型在集合框架中的实际应用

请举例说明在Java集合框架中,如何利用泛型确保类型安全,比如在ArrayList中使用泛型存储自定义对象,并解释为什么使用泛型比不使用泛型更具优势。
11.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 在ArrayList中使用泛型存储自定义对象示例
    • 首先定义一个自定义类Person
class Person {
    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;
    }
}
  • 然后在ArrayList中使用泛型存储Person对象:
import java.util.ArrayList;
import java.util.List;

public class GenericArrayListExample {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Bob", 30);

        personList.add(person1);
        personList.add(person2);

        for (Person person : personList) {
            System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
        }
    }
}
  1. 使用泛型比不使用泛型的优势
    • 类型安全
      • 不使用泛型时,ArrayList可以存储任何类型的对象,这可能导致运行时错误。例如:
import java.util.ArrayList;
import java.util.List;

public class NonGenericArrayListExample {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Person("Charlie", 35));
        list.add("This is a string, not a Person object");

        for (Object obj : list) {
            Person person = (Person) obj; // 这里会抛出ClassCastException,因为第二个元素不是Person类型
            System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
        }
    }
}
 - 使用泛型后,编译器会在编译时检查类型,不允许添加不匹配的类型,从根本上避免了这种运行时的类型转换错误。
  • 代码可读性增强
    • 使用泛型明确了集合中存储的对象类型,代码阅读者能更清晰地知道集合的用途。例如List<Person>,一看就知道这个列表是用来存储Person对象的,而不使用泛型时List则需要查看代码逻辑才能明白其存储对象类型。
  • 避免不必要的类型转换
    • 不使用泛型从集合中取出对象时,需要进行强制类型转换。使用泛型后,从集合中取出的对象已经是指定类型,无需强制类型转换,使代码更简洁,也减少了出错的可能性。例如在上述使用泛型的代码中,遍历personList时直接得到Person类型对象,而不使用泛型则需要(Person) obj这样的强制类型转换。