如何保证添加自定义对象元素的唯一性

以图书管理系统为例

1、首先自定义一个图书类Book,自定义变量id,name,auther,price并重写getset(),toString()方法,此处具体代码省略。

2、再自定义一个管理图书类Manage,在管理类中先定义一个ArrayList集合用来储存图书,再定义add()添加图书方法,具体如下:

    
    private ArrayList<Book> books;

    public  Manage(){
       books = new ArrayList<>();
    }

    //添加图书方法
    public void add(Book book){
        for(Book b:books)
            if(b.equals(book)){
                return;
            }
        books.add(book);
    }
   
   //输出方法
   public void showAll(){
        for (int i = 0; i <books.size() ; i++) {
        System.out.println(books.get(i));
    }

添加方法完成后,虽然使用了equals()方法,但并不能保证添加元素的唯一性,因为如果没有覆盖重写equals方法,那么Object类中默认进行==运算符的对象地址比较,比较的是地址值,即只要不是同一个对象,结果必然为false。 所以,我们需要重写Book类中的equals()和hashcode()方法,用来比较对象中的内容,具体如下:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return id == book.id &&
                Double.compare(book.price, price) == 0 &&
                Objects.equals(name, book.name) &&
                Objects.equals(author, book.author);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, price, name, author);
    }

重写完成后,即可保证添加自定义对象元素的唯一性,测试如下:

public class ManageTest {
    public static void main(String[] args) {
        Manage m = new Manage();
        m.add(new Book(1001,"红楼梦","张三",200));
        m.add(new Book(2002,"西游记","李四",140.50));
        m.add(new Book(3003,"三国演义","王五",130));
        m.add(new Book(4004,"水浒传","赵六",83));
        m.add(new Book(5005,"三个和尚","李四",50));
        m.add(new Book(5005,"三个和尚","李四",50));

        m.showAll();
    }
}

结果如下:

Book{id=1001    name=红楼梦    author=张三    price=200.0    }
Book{id=2002    name=西游记    author=李四    price=140.5    }
Book{id=3003    name=三国演义    author=王五    price=130.0    }
Book{id=4004    name=水浒传    author=赵六    price=83.0    }
Book{id=5005    name=三个和尚    author=李四    price=50.0    }

由此可知,此方法可行。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值