一.
注意hashCode与equals方法在HashSet中的应用(HashSetTest3)
public class HashSetTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Set set =new HashSet();//Set是一个不包含重复元素的 collection
set.add("zhangsan");
set.add("lisi");
set.add("wangwu");
System.out.println(set.add("zhangsan"));//添加重复元素...失败!
System.out.println(set.size());//Set集合中元素个数
}
}
//没写hashCode与equals方法之前
public class HashSetTest2 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Set set = new HashSet();
People p1 = new People("zhangsan");
People p2 = new People("lisi");
People p3 = new People("wangwu");
People p4 = new People("zhangsan");
People p5 = new People("zhangsan");
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
System.out.println(set.size());
}
}
class People {
String name;
public People(String name) {
this.name = name;
}
}
//没写hashCode与equals方法之后
public class HashSetTest3 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Set set =new HashSet();
Student p1=new Student("zhangsan");
Student p2=new Student("lisi");
Student p3=new Student("wangwu");
Student p4=new Student("zhangsan");
Student p5=new Student("zhangsan");
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
System.out.println(set.size());
}
}
class Student{
String name;
public Student(String name){
this.name=name;
}
//用系统生成的方法
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
/*//自己写的方法
@Override
public int hashCode() {
System.out.println("hashCode executed!");
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
System.out.println("equals executed!");
if (this == obj) {
return true;
}
if (obj instanceof Student) {
Student s = (Student) obj;
return name.equals(s.name);
}
return false;
}*/
}
分享到:
相关推荐
- `equals` 方法的理解与实现。 - `Comparable` 接口的使用。 - `hashCode` 方法的作用及其与`equals`方法的关系。 - **工具类**: - 静态类与非静态类的区别。 - 泛型的使用,包括泛型类和泛型方法。 - **集合...
#### 第九题:字符串"xyz"创建的对象数量 `String s = new String("xyz");`实际上创建了两个字符串对象:一个在常量池中,另一个通过`new`关键字创建。 #### 第十题:Math.round(11.5)和Math.round(-11.5)的结果 ...
#### 第九章:多线程 - **认识多线程** - 多线程的优势:提高程序并发执行能力。 - 线程的创建方式:继承Thread类或实现Runnable接口。 - **线程常用操作方法** - 启动线程:start()方法。 - 线程睡眠:sleep...
#### 题目一:`List`中元素的查找与`equals()`、`hashCode()`方法的关系 在第一题中,我们探讨了`List`集合中元素的查找机制,尤其是当`List`使用`LinkedList`实现时。`List`的`contains()`方法用于判断集合中是否...
自动实现hashcode和equals的方法 - 使用`@Data`注解或Lombok库自动生成这些方法。 - 优点:简化代码,减少出错概率。 - 缺点:依赖第三方库,可能影响性能。 #### 20. 访问修饰符的应用设计作用 - **public**:...
"=="与equals方法的区别?** - **"=="** 比较两个对象的引用是否相同。 - **equals** 方法比较的是两个对象的内容是否相等(默认情况下比较的是引用)。 **12. 静态成员与实例成员的区别?** - **静态成员:** 属于...
- **`HashSet`的使用和原理**:基于`HashMap`实现,不允许重复元素,通过`hashCode()`和`equals()`方法判断元素是否相等。 - **`TreeSet`的原理和使用**:基于红黑树实现,可以自然排序或自定义排序。 - **集合和数...
- **正确的做法是在equals方法中验证对象相等性后才返回相同的hashCode。** #### 二十五、Java创建对象的方式 - **使用new关键字创建对象。** - **使用反射API创建对象。** - **使用克隆方法创建对象。** - **使用...
哈希码用于快速查找对象,通常与equals方法一起使用,以提高哈希表的性能。 **10. String、StringBuffer 和 StringBuilder 的区别** - **String**:不可变字符串,适合少量修改场景。 - **StringBuffer**:线程...
- **hashCode**与**equals**方法之间的关系非常重要。根据Java文档,如果两个对象相等(通过`equals`方法),那么它们的`hashCode`也应该是相同的。但是,如果两个对象有不同的`hashCode`,并不意味着它们不相等。 -...
- **多态**:同名方法在不同类中有不同的实现,或同一方法在不同上下文有不同的行为。 12. **访问控制**: - **private**:仅在本类中可见。 - **default(包级私有)**:在同包内可见。 - **protected**:在同...
1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...
4. **对象的`equals`方法与`hashCode`**:两个对象的`equals`方法返回`true`时,它们的`hashCode`也应该相等。这是为了保证哈希表等数据结构的正确性。 5. **继承String**:`String`类是final的,因此不能被继承。 ...
- 如果类实现了 `hashCode()` 方法,则建议同时重写 `equals()` 方法,以保持一致性。 #### 3. forward 和 redirect 的区别 **forward:** - 使用服务器端转发,客户端浏览器的URL不会发生变化。 - 效率较高,因为...
1. **抽象类**:可以包含抽象方法和具体实现方法,可以有构造器、字段和静态方法。 2. **接口**:只包含抽象方法,从Java 8开始支持默认方法和静态方法。接口主要用于定义行为标准。 #### 十、静态变量与实例变量 1...
- 当两个对象根据`equals`方法比较是相等的,那么这两个对象的`hashCode`值必须相同。这是为了确保在哈希表中能够正确地定位和检索数据。 3. **什么是拆箱和装箱?** - **装箱**:将基本类型转换为对应的包装类...