Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。
Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
1 equals方法
Object equals() 方法用于比较两个对象是否相等。
equals() 方法比较两个对象,是判断两个对象引用指向的是同一个对象,即它只是检查两个对象是否指向内存中的同一个地址。
**注意:**如果子类重写了equals() 方法,就需要重写hashCode();比如 String 类重写了 equals() 方法,同时也重写了 hashCode() 方法。
语法:object.equals(Object obj)
String重写equals方法:
java
public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一个对象
return true;//返回 true
} if
(anObject instanceof String) {//判断类型
String anotherString = (String)anObject;//向下转型
int n = value.length;
if (n == anotherString.value.length) {//如果长度相同
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//然后一个一个的比较字符
if (v1[i] != v2[i])
return false;
i++;
}
return true;//如果两个字符串的所有字符都相等, 则返回 true
}
}
return false;//如果比较的不是字符串, 则直接返回 false
}
2 类中重写equals方法
java
/**
* @ClassName EqualsMethodTest
* @Description
* @Date 2024/11/25 21:24
* @Version V1.0
*/
public class EqualsMethodTest {
public static void main(String[] args) {
Person p1= new Person("小明",18,true);
Person p2= new Person("小华",18,false);
Person p3= new Person("小明",19,true);
Person p33= new Person("小明",19,true);
System.out.println(p3.equals(p33));//true
p33.setAge(20);
System.out.println(p1.equals(p2));//false
System.out.println(p3.equals(p33));//false
}
}
class Person{
private String name;
private int age;
private boolean gender;
public Person(String name,int age,boolean gender){
this.name=name;
this.age=age;
this.gender=gender;
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;//同一个对象,直接返回
if(obj instanceof Person){//是Person,才比较
Person p = (Person) obj;
return this.name==p.name&&this.age==p.age&&this.gender==p.gender;
}
return false;//不是person,返回false
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
}
3 HashCode
public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:
- 在Java 应用程序执行期间,在对同一对象多次调用 hashcode 方法时,必须一致地返回相同的整数,前提是将对象进行 eqa1s 比较时所用的信息没有被修改。从某一应用程序的次执行到同一应用程序的另一次执行,该整数无需保持一致。
- 如果根据 equals(Object)方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashcode 方法都必须生成相同的整数结果。
- 如果根据 equals(java.lang. object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashcode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由Object 类定义的 hashcode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 Java不需要这种实现技巧。)
return:此对象的一个哈希码值。
- 提高具有哈希结构的容器的效率!
- 两个引用, 如果指向的是同一个对象, 则哈希值肯定是一样的!
- 两个引用, 如果指向的是不同对象, 则哈希值是不一样的
- 哈希值主要根据地址号来的,不能完全将哈希值等价于地址。
- 集合中hashcode可以重写一下
java
package day111;
/**
* @ClassName HashCodeTest
* @Description
* @Date 2024/11/25 22:00
* @Version V1.0
*/
public class HashCodeTest {
public static void main(String[] args) {
AA aa = new AA();
AA aa2 = new AA();
AA aa3 = aa;
System.out.println("aa.hashCode()=" + aa.hashCode());//aa.hashCode()=793589513
System.out.println("aa2.hashCode()=" + aa2.hashCode());//aa2.hashCode()=824909230
System.out.println("aa3.hashCode()=" + aa3.hashCode());//aa3.hashCode()=793589513
}
}
class AA{}
4 toString
public String toString()
返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
return:该对象的字符串表示形式。
java
package day111;
/**
* @ClassName toStringTest
* @Description
* @Date 2024/11/25 22:04
* @Version V1.0
*/
public class toStringTest {
public static void main(String[] args) {
/*
Object 的 toString() 源码
(1)getClass().getName() 类的全类名(包名+类名 )
(2)Integer.toHexString(hashCode()) 将对象的 hashCode 值转成 16 进制字符串
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
Monster monster = new Monster("小妖怪", "巡山的", 1000);
System.out.println(monster.toString() + " hashcode=" + monster.hashCode());
System.out.println("==当直接输出一个对象时, toString 方法会被默认的调用==");
System.out.println(monster); //等价 monster.toString()}
}
}
class Monster {
private String name;
private String job;
private double sal;
public Monster(String name, String job, double sal) {
this.name = name;
this.job = job;
this.sal = sal;
}
//重写 toString 方法, 输出对象的属性
//使用快捷键即可 alt+insert -> toString
@Override
public String toString() { //重写后, 一般是把对象的属性值输出, 当然程序员也可以自己定制
return "Monster{" +
"name='" + name + '\'' +
", job='" + job + '\'' +
", sal=" + sal +
'}';
}
}