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
相关产品推荐
相关产品推荐

