Java中object类型的ArrayList-错误,我可以';我似乎不明白

Java中object类型的ArrayList-错误,我可以';我似乎不明白,java,arraylist,Java,Arraylist,我是Java的初学者。下面的代码是我创建一个类型为Student的ArrayList。我很确定我做的每件事都是正确的,但是输出是不正确的 这是学生班级宣言: public static class Student implements Comparable{ public String first; public String last; public Integer ID; Student(String first, String last,

我是Java的初学者。下面的代码是我创建一个类型为Student的ArrayList。我很确定我做的每件事都是正确的,但是输出是不正确的

这是学生班级宣言:

public static class Student implements Comparable{
    public String first;    
    public String last;     
    public Integer ID;

    Student(String first, String last, Integer ID){
        this.first = first;
        this.last = last;
        this.ID = ID;
    } 

    //@Override
    public int compareTo(Object obj) {
     return this.ID.compareTo(((Student) obj).ID);
    }
}
这是在main中创建的ArrayList:

ArrayList<Student> arr2 = new ArrayList<Student>();
        arr2.add(new Student("ol", "rr", 123));
        arr2.add(new Student("iv", "tt", 321));
        arr2.add(new Student("ia", "bg", 456));
当我运行它时,没有编译错误,但是,这是输出屏幕上的内容:

排序前: 对象: genericsort.BubbleSortArraylist$Student@1db9742


我真的不知道怎么了。有人能看到我没有看到的东西吗?

您正在打印数组对象本身,所以它会打印arr2变量的哈希代码

你应使用:

arr2.forEach(System.out::println);
对于学生类,您应该重写toString:

public static class Student implements Comparable{
    public String first;    
    public String last;     
    public Integer ID;

    Student(String first, String last, Integer ID){
        this.first = first;
        this.last = last;
        this.ID = ID;
    } 

    //@Override
    public int compareTo(Object obj) {
     return this.ID.compareTo(((Student) obj).ID);
    }

    @Override
    public String toString() {
         return first + " " + last + " " + ID;
    }
}

您正在打印数组对象本身,因此它打印arr2变量的哈希代码

你应使用:

arr2.forEach(System.out::println);
对于学生类,您应该重写toString:

public static class Student implements Comparable{
    public String first;    
    public String last;     
    public Integer ID;

    Student(String first, String last, Integer ID){
        this.first = first;
        this.last = last;
        this.ID = ID;
    } 

    //@Override
    public int compareTo(Object obj) {
     return this.ID.compareTo(((Student) obj).ID);
    }

    @Override
    public String toString() {
         return first + " " + last + " " + ID;
    }
}

您正在从
Student
隐式调用
toString
——它来自
java.lang.Object
中的一个,因为每个对象都继承自该对象(这不是错误)

Student
覆盖
toString
,它会看起来更好,例如:

 public String toString(){
    return "first = " + first + " second = " + second;
 }

您正在从
Student
隐式调用
toString
——它来自
java.lang.Object
中的一个,因为每个对象都继承自该对象(这不是错误)

Student
覆盖
toString
,它会看起来更好,例如:

 public String toString(){
    return "first = " + first + " second = " + second;
 }

你希望看到什么?打印数组列表。如果您想要更有用的东西,您需要遍历数组并打印每个对象,您希望看到什么?打印数组列表。如果您想要更有用的东西,您需要遍历数组并打印每个对象,并且他需要重写toString。另一个选项是:arr2.forEach(student->System.out.print(student.first+“”+student.last));我认为
arr2.forEach(System.out::println)
的行为与
System.out.println(arr2)相同,请检查。这就是为什么IMHO这个答案是错误的,而Eugens是正确的。@MartinMeeser如果你错了,学生类会重写toString方法,所以它会打印学生的属性。我在发布之前也对它进行了测试。@Emre重写toString()是关键,否则在这两种情况下都会打印出来Student@aaaaa@MartinMeeser我已经在我的回答中解释过了,那么这里有什么问题?我们说的不是同一件事吗?他需要覆盖toString。另一个选项是:arr2.forEach(student->System.out.print(student.first+“”+student.last));我认为
arr2.forEach(System.out::println)
的行为与
System.out.println(arr2)相同,请检查。这就是为什么IMHO这个答案是错误的,而Eugens是正确的。@MartinMeeser如果你错了,学生类会重写toString方法,所以它会打印学生的属性。我在发布之前也对它进行了测试。@Emre重写toString()是关键,否则在这两种情况下都会打印出来Student@aaaaa@MartinMeeser我已经在我的回答中解释过了,那么这里有什么问题?我们不是在说同样的事情吗?@VeselinDavidov我只是想知道OP显示的输出是否“不正确”,必须有3个字符串存在<代码>阵列列表
!=
array
(您必须使用
Arrays.toString
)…@VeselinDavidov查看
toString
ArrayList
中的
toString
实现——我再次怀疑它是否会对每个元素进行迭代并调用
toString
,并在开头和结尾追加
[]
,和一个快速检查confirmed@MartinMeeser美好的我没有费心去看文档,因为我知道事情就是这样发生的。感谢you@VeselinDavidov我只是想知道OP显示的输出是否“不正确”,必须有3个字符串存在<代码>阵列列表
!=
array
(您必须使用
Arrays.toString
)…@VeselinDavidov查看
toString
ArrayList
中的
toString
实现——我再次怀疑它是否会对每个元素进行迭代并调用
toString
,并在开头和结尾追加
[]
,和一个快速检查confirmed@MartinMeeser美好的我没有费心去看文档,因为我知道事情就是这样发生的。非常感谢。