javaSe有一个小问题不明白



import java.util.ArrayList;
import java.util.Scanner;

//定义一个ArrayList集合,存储一批书籍,书籍具有书名、作者、价格三个属性,
//键盘录入一个书名时,显示该书籍的详细信息。(10分)

class Book{
    String name;
    String author;
    double price;
    public Book(String name){
        this.name = name;
    }
    public Book(String name,String author,double price){
        this.name = name ;
        this.author = author;
        this.price = price;
    }
    public boolean equals(Book b){
        return this.name==b.name;
    }
    public String toString(){
        return this.name+this.author+this.price;
    }

}
class Demo6{

    public static void main(String[] args){
        String str = null;
        ArrayList<Book> list = new ArrayList<Book>();
        list.add(new Book("三国演义","罗贯中",53.5));
        list.add(new Book("水浒传","施耐庵",54.5));
        list.add(new Book("西游记","吴承恩",60));
        list.add(new Book("红楼梦","曹雪芹、高鹗",85));
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            str=sc.next();
            break;
        }

        System.out.println(str);

        System.out.println(new Book("三国演义","罗贯中",53.5).equals(new Book(str)));
    }

}

toString方法重写了没有?

输入:三国演义

输出结果为什么是:

三国演义
false

为什么是false 把最后的str如果改成"三国演义" 就是true了

因为"三国演义"使用不同的字符串形式而造成"三国演义"字符串的内存地址不同,所以不等,你可以加上这个判断,就很明显了

                String str1=new String("三国演义");
        String str2=new String("三国演义");
        System.out.println(new Book(str1,"罗贯中",53.5).equals(new Book(str2)));

public boolean equals(Book b){ return this.name==b.name; }
这个方法里面你比较的是两个字符串的地址 你应该用equals比较 b.name.equals(this.name)

同一个类的两个对象的equals比较,比较的是两个对象的内存引用地址,所以不同,你需要override一下equals方法,比较三个属性值内容是否相等,
相等则返回true,不相等则返回false。