愛在花開的季節 发表于 2024-11-26 05:40:59

Java常用类-Object(8个未完待续...)

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方法:
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 != v2)
                  return false;
                i++;
            }
            return true;//如果两个字符串的所有字符都相等, 则返回 true
      }
    }
    return false;//如果比较的不是字符串, 则直接返回 false
} 2 类中重写equals方法

/**
* @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可以重写一下
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 <strong>toString</strong>()
返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
<strong>return:</strong>该对象的字符串表示形式。 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 +
                '}';
    }
}




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java常用类-Object(8个未完待续...)