以图书管理系统为例
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 }
由此可知,此方法可行。