为什么HashSet的结果输出顺序跟我存放的顺序不一样?

为什么HashSet的结果输出顺序跟我存放的顺序不一样?

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class StudentTest {
    public static void main(String[] args) {
        // 定义三个Student类的对象及一个HashSet类的对象
        Student stu1 = new Student(1, "Tom", 87f);
        Student stu2 = new Student(2, "Lucy", 95f);
        Student stu3 = new Student(3, "William", 65f);
        
        // 将Student类的对象添加到集合中
        HashSet set = new HashSet();
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        // 使用迭代器显示Student类的对象中的内容
        Iterator it = set.iterator();
        while(it.hasNext()==true) {
            System.out.println(it.next());
        }
    }
}

public class Student {
    // 根据需求完成Student类的定义
    private int stuId;
    private String name;
    private float score;

    public Student() {

    }

    public Student(int stuId, String name, float score) {
        this.setStuId(stuId);
        this.setName(name);
        this.setScore(score);
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "[学号:" + stuId + "姓名:" + name + ",成绩:" + score + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + Float.floatToIntBits(score);
        result = prime * result + stuId;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj.getClass() == Student.class) {
            Student stu = (Student) obj;
            return stu.getStuId() == stuId && stu.getName().equals(name);
        }
        return false;
    }
}

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好!因为HashSet是无序列表,所以输出的顺序与存放的顺序是不一样的。如果解决了你的疑惑,请采纳,祝学习愉快~


  • Kidand 提问者 #1
    为什么录入的顺序无论怎么变,输出的顺序却还是固定的呢?
    2019-04-09 15:57:21
  • 好帮手慕柯南 回复 提问者 Kidand #2
    同学你好!HashSet存储数据时是根据存入数据的hashcode来决定其所存储的位置,所以同样的一个序列在内存中存储的位置是固定的(不考虑哈希冲突),迭代器在遍历数据时是根据数据的存储位置来遍历的,由于每次迭代的规则和数据都没有发生变化,因此同样的序列每次输出的顺序是固定的。如果解决了你的疑惑,请采纳,祝学习愉快~
    2019-04-09 17:43:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师