Object类详解
equals方法
==与equals对比
==是一个比较运算符,并不是一个方法。
- ==:既可以判断基本类型,也可以判断引用类型
- ==:如果判断基本类型,判断的是值是否相等。例:int i =10;double d = 10.0
- ==:如果判断引用类型,判断的是地址是否相等,即判断是否为同一个对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.learn.object_;
public class Equals01 { public static void main(String[] args) { B b = new B(); B c = b; B d = c; System.out.println(b == c); System.out.println(d == c); A aObj = b; System.out.println(aObj == d); } }
class A{} class B extends A{}A a = new A();
|
- equals:是Object类中的方法,只能判断引用类型 。查看源码
- 默认判断的是地址是否相等,子类中往往重写该方法,用于判断是否值相等。比如Integer、String【查看两个类中的equals方法源码】
子类重写equals方法
默认判断的是地址是否相等,子类中往往重写该方法,用于判断是否值相等。比如Integer、String。
下面例子jdk版本:18.01
Object类中的equals方法:
1 2 3
| public boolean equals(Object obj) { return (this == obj); }
|
String里面equals源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public boolean equals(Object anObject) { if (this == anObject) { return true; } return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value); }
|
Integer里面equals源码:
1 2 3 4 5 6
| public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
|
equals和==比较例子
1 2 3 4 5 6 7 8 9 10
| Integer integer = new Integer(1000); Integer integer1 = new Integer(1000); System.out.println(integer == integer1); System.out.println(integer.equals(integer1)); System.out.println(integer.intValue() == integer1.intValue());
String str1 = new String("test"); String str2 = new String("test"); System.out.println(str1 == str2); System.out.println(str1.equals(str2));
|
自己重写equals方法
应用实例:判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回true,反之false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package com.learn.object_;
public class EqualsExercise01 { public static void main(String[] args) { Person person = new Person("jack", 10, '男'); Person person1 = new Person("jack", 10, '男');
System.out.println(person.equals(person1)); System.out.println(person.equals(person1)); } }
class Person{ private String name; private int age; private char gender;
public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; }
public boolean equals(Object obj){ if(this == obj){ return true; } if(obj instanceof Person){ Person obj1 =(Person)obj; return (this.age == obj1.age)&&(this.name == obj1.name)&&(this.gender == obj1.gender); } return false; } }
|
hashcode方法
hashcode():返回该对象的哈希码值。支持此方法是为了提高哈希表(例如java.util.Hashtable提供的哈希表)的功能。
实际上,有Object类定义的hashcode方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是Java编程语言不需要这种实现技巧。因为Java本身是跑在虚拟机上的,是无法拿到对象的真正地址的,像更底层的语言C、C++是可以的。)
五个小结
- (1)提高具有哈希结构的容器的效率
- (2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
- (3)两个引用,如果指向的是不同对象,则哈希值是不一样的!(不是绝对的,因为可能会产生哈希碰撞)
- (4)哈希值主要根据地址号来的!不能完全将哈希值等价于地址。
- (5)后面在集合中,hashcode如果需要的话,也会重写,如何重写可以看后面笔记。
toString方法
基本介绍
- 返回对象的字符串表示。默认返回:全类名(包名+类名)+@+哈希值的十六进制(通过hashcode得到的一个整数转换成16进制)。
1 2 3 4 5 6
| public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
|
重写toString方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package com.learn.object_;
public class toString_ { public static void main(String[] args) { Monster monster = new Monster("jk", "巡山", 1000); System.out.println(monster.toString()); System.out.println(monster); } }
class Monster{ private String name; private String job; private double sal;
@Override public String toString() { return "Monster{" + "name='" + name + '\'' + ", job='" + job + '\'' + ", sal=" + sal + '}'; }
public Monster(String name, String job, double sal) { this.name = name; this.job = job; this.sal = sal; } }
|
finalize方法
基本介绍
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作。
什么时候被回收:当某个对象没有任何引用时,则jvm就认为该对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动出发垃圾回收机制。
实际开发中,几乎不会运用finalize,所以更多是为了面试= =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.learn.object_;
public class Finalize_ { public static void main(String[] args) { car audi = new car("audi"); audi = null; System.gc(); System.out.println("程序结束"); } }
class car{ private String name;
@Override protected void finalize() throws Throwable { super.finalize(); System.out.println("销毁汽车"+name); }
public car(String name) { this.name = name; } }
|