容器类自定义类型进行比较的时候务必重写equals方法务必要重写hashCode方法
package com.study;
import java.util.*;
public class OverrideEquaslCode {
public static void main(String []args) {
Collection c2= new HashSet();
c2.add("Colleciton Hello1");
c2.add("Colleciton Hello2");
c2.add("Colleciton Hello3");
c2.add(new ComputerClass("Computer1","100,200"));
c2.add(new ComputerClass("Computer2","200,300"));
System.out.println(c2);
c2.remove("Colleciton Hello3");
System.out.println(c2); // 可以删除,基础类型继承了Object基类的equals()方法
//下面的输出为false,因为没有自定义类型需要重写equals()方法和hashCode()方法且hashCode()比较键值对.
System.out.println(c2.remove(new ComputerClass("Computer1","100,200"))); //重写equals方法务必要重写hashCode方法
System.out.println(c2);
}
}
class ComputerClass {
private String brand_name;
private String properties;
public ComputerClass(String brand_name,String properties) {
this.brand_name=brand_name;
this.properties=properties;
}
public boolean equals(Object obj) {
ComputerClass cClass = (ComputerClass)obj;//强制类型转换
if(obj instanceof ComputerClass) { //instaceof 比较左边对象是否是它右边的类的实例
return brand_name.equals(cClass.brand_name) && properties.equals(cClass.properties);
}
else {
return super.equals(obj); //否则交给父类进行比较
}
}
public int hashCode() {
return brand_name.hashCode();
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getProperties() {
return properties;
}
public void setProperties(String properties) {
this.properties = properties;
}
}
分享到:
相关推荐
在使用这些容器时,对于自定义对象,为了正确实现equals()和hashCode()方法,以确保在Set或Map中正确识别对象,通常需要重写这两个方法。此外,处理多线程环境时,需注意线程安全问题,某些容器如ArrayList和HashMap...
同时,重写equals()时通常需要同时重写hashCode(),以确保对象在哈希表中的正确存储和查找。 5. **hashCode()方法**: - 返回对象的哈希码,用于哈希表(如HashMap和HashSet)的内部定位,不同对象应尽可能产生...
当涉及到`equals()`和`hashCode()`方法时,自定义类通常需要重写这两个方法,以确保对象比较和哈希表操作符合预期。如果两个对象在逻辑上相等,它们的`equals()`方法应该返回`true`,并且相等的对象应具有相同的`...
3. 当涉及集合类的比较和操作时,重写equals()和hashCode()方法是必要的。示例代码展示了如何为自定义类正确地重写这两个方法,以实现对象间的比较和存储在哈希表中的功能。 4. List接口提供的API包括添加(add())...
- 通过重写`hashCode()`和`equals()`方法来确保元素的唯一性。 - **TreeSet** - 使用红黑树实现,能够按自然顺序对元素进行排序。 - 支持自定义比较器,可以根据需要对元素进行排序。 - 适用于需要排序和快速...
- **覆写hashCode()**:为了确保键的唯一性,当使用自定义对象作为键时,需要重写equals()和hashCode()方法。 5. **Set** - Set接口不包含重复元素,且不保证元素顺序。 - **实现原理**:HashSet是最常见的Set...
对于自定义类,需要重写equals()以实现有意义的比较。 3. 两个对象的hashCode()相同,但equals()不一定为true:两个对象的hashCode相同仅表示它们在哈希表中可能位于同一位置,但它们可能不相等。 4. final在Java...
5. **equals 和 hashCode**:当自定义类作为 HashMap 的 key 时,必须重写 equals 和 hashCode 方法以确保正确的哈希映射和等价比较。不重写可能会导致预期之外的行为。 6. **volatile**: volatile 关键字确保变量...
- String类重写了`equals()`方法,使得两个内容相同的String对象通过`equals()`比较会返回true,即使它们是不同的实例。 4. **其他Object类的方法**: - `getClass()`: 返回对象的Class对象,提供了获取类名和...
- 示例代码展示如何为自定义类型重写`hashCode()`方法,以保证哈希值的唯一性。 通过上述内容,我们深入了解了Java集合框架中`Collection`接口及其常用实现类的关键特性与使用方法。这些知识点对于开发人员来说至关...
总结来说,去除ArrayList中的重复对象需要正确地比较对象,这通常意味着需要在对象类中重写`equals()`和`hashCode()`方法。如果未这样做,`retainAll()`可能会按预期工作,特别是对于基本类型的ArrayList,但对于...
1. **`hashCode()`和`equals()`**:这两个方法在Java中用于对象的比较。`hashCode()`返回对象的哈希码,常用于哈希表(如HashMap)中快速定位对象。`equals()`检查两个对象是否相等。通常,如果重写了`equals()`,也...
对于引用类型,默认情况下 `==` 比较的是地址,而 `equals` 通常比较的是值(在类重写了 `equals` 方法的情况下)。 3. **两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?** - 不对。两个对象的 ...
【基础篇.pdf】这篇文档主要涵盖了Java编程语言的基础知识,包括面向对象编程、设计原则、类和对象、数据类型、字符串、集合框架、并发、枚举、IO以及反射等内容。 面向对象是Java的核心特性,它有三个基本特征:...
Set接口表示无序且不允许重复元素的集合,如HashSet和TreeSet,HashSet通过对象的hashCode和equals保证唯一性,而TreeSet则能自动排序。 Map接口是双列集合,存储键值对,例如Hashtable、HashMap、LinkedHashMap和...
3. **equals和hashCode**:当使用HashMap、HashSet等散列表集合时,需要重写`equals`和`hashCode`方法,以确保集合的正确行为。 4. **散列冲突处理**:散列表可能会遇到散列冲突,这时需要通过比较元素来确定是否...
**Java容器类** 1. 集合框架包括Collection和Map接口,ArrayList、LinkedList、HashMap等是常用实现。 2. 线程安全的集合,如Vector、ConcurrentHashMap,使用同步机制确保并发访问的安全。 **设计模式** 设计模式...
Answer: 反射是Java提供的一种机制,允许在运行时获取类和对象的信息,并进行修改。 2. 什么是Java序列化? Answer: 序列化是将对象转换为字节流的过程,以便于对象的存储或传输。 对象拷贝 1. 为什么要使用克隆?...
对于对象,equals通常需要重写来比较对象属性。 3. **hashCode和equals的关系**:如果两个对象的hashCode相同,它们不一定是相等的(equals返回true)。但根据约定,如果两个对象equals为true,它们的hashCode必须...
3. hashcode()和equals():当两个对象equals()返回true时,hashcode()通常也应该相同,以满足哈希表(如HashMap)的等价关系。 二、容器 1. Collection和Collections的区别:Collection是所有集合类的父接口,而...