You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LinkedList存储自定义Student类对象的属性与搜索相关技术问询

关于LinkedList存储自定义对象的两个疑问解答

嘿,我来帮你把这两个问题讲明白,结合你写的代码一起分析:

一、LinkedList是否仅存储指定属性?

答案是不是。LinkedList作为集合,存储的是整个Student2对象的引用,而不是只存你通过setter设置过的属性。

  • 你创建的Student2对象在堆内存中会包含所有定义的属性(lastName、firstName),不管你有没有给它们赋值——没赋值的属性会保持默认值(这里是null)。
  • LinkedList里的每个元素都是指向这个堆内存对象的引用,所以当你把对象添加到列表后,对象的所有属性(包括未设置的)都“跟着”这个引用存在,不是只存你设置过的那些。

⚠️ 这里要注意你代码里的一个小bug:你在主类里只创建了一个Student2 info对象,每次调用insert()都是把同一个对象添加到LinkedList里。这意味着列表里的所有元素其实都是同一个对象的引用,如果你多次调用insert,后面设置的姓名会覆盖前面所有“元素”的属性值,因为它们指向的是同一个内存地址。

改进方法:每次插入时新建一个Student2对象,比如把insert()改成这样:

public static void insert() {
    Student2 newStudent = new Student2(); // 每次新建对象
    newStudent.setInfo();
    list.add(newStudent);
    System.out.println("Student added!");
}

二、搜索对象是否必须依赖这些属性?

答案是取决于你怎么写搜索逻辑:

  • 你现在的搜索代码是手动遍历列表,比较每个Student2对象的lastName和firstName,这是你自定义的搜索规则,依赖这两个属性是你自己选择的。你完全可以改成只搜lastName,甚至根据其他你以后添加的属性(比如学号)来搜索。
  • 如果想用LinkedList自带的contains()方法来判断对象是否存在,那默认会使用Object类的equals()方法——这个方法默认比较的是对象的引用(也就是是否是同一个内存地址的对象),而不是属性值。如果想让contains()根据姓名属性来判断,你需要在Student2类里重写equals()和hashCode()方法,比如:
import java.util.Objects;

class Student2 {
    // 原有的属性、构造方法、setter/getter不变

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return Objects.equals(lastName, student2.lastName) && Objects.equals(firstName, student2.firstName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(lastName, firstName);
    }
}

这样之后,你就可以用list.contains(targetStudent)来判断是否存在对应姓名的学生对象了,不需要手动遍历。

内容的提问来源于stack exchange,提问作者genkisan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:03