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[i] != v2[i])
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |