一:equals方法

1:==和equals的对比

  1. ==既可以判断基本类型,又可以判断引用类型
  2. ==:如果判断基本类型判断的是值是否相等。示例:int i=10; double d=10.0;
  3. ==:如果判断引用类型判断的是地址是否相等,即判定是不是同一个对象

    1. public static void main(String[] args){
    2. A a = new A();
    3. A b = a;
    4. A c = b;
    5. System.out.println(a == c);//true
    6. System.out.println(b == c);//true
    7. B bObj = a;
    8. System.out.println(bObj == c);//true
    9. int num1 = 10;
    10. double num2 = 10.0;
    11. System.out.println(num1 == num2);//基本数据类型,判断值是否相等
    12. }
  4. equals:是Object类中的方法,只能判断引用类型,

    1. public boolean equals(Object obj) {
    2. return (this == obj);
    3. }
    1. //重写了object中的equals方法
    2. public boolean equals(Object anObject) {
    3. if (this == anObject) { //如果是同一个对象
    4. return true;
    5. }
    6. if (anObject instanceof String) { //判断类型是否相等
    7. String anotherString = (String)anObject; //向下转型
    8. int n = value.length;
    9. if (n == anotherString.value.length) {//如果长度相等
    10. char v1[] = value;
    11. char v2[] = anotherString.value;
    12. int i = 0;
    13. while (n-- != 0) {//一个一个比较字符
    14. if (v1[i] != v2[i])
    15. return false;
    16. i++;
    17. }
    18. return true;
    19. }
    20. }
    21. return false;
    22. }

    ```java public boolean equals(Object obj) { if (obj instanceof Integer) {

    1. return value == ((Integer)obj).intValue();

    } return false; }

Integer integer = new Integer(1000); Integer integer1 = new Integer(1000); System.out.println(integer == integer1);//是false //但是用equals方法判断的话,是true,因为已经重写过了,有判断地址改为判断值 integer.equals(integer1); //true

String str1 = new String( “hspedu”); String str2 = new String( “hspedu “); System.out.println(str1 =str2);//F System.out.println(str1.equals(str2));//T

  1. 5. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如lnteger,String【看看string Integerequals源代码】
  2. <a name="XdohN"></a>
  3. ### 二:如何重写equals方法
  4. <a name="Ypn7Z"></a>
  5. #### 1:应用实例
  6. > **判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回 true,反之 false。**
  7. 两种写法
  8. ```java
  9. public boolean equals(Object obj) {
  10. if (this == obj){
  11. return true;
  12. }
  13. if (obj instanceof Person){
  14. Person p = (Person)obj;
  15. return this.name == p.name && this.age == p.age;
  16. }
  17. return false;
  18. }
  1. public boolean equals(Person obj) {
  2. if (this == obj){
  3. return true;
  4. }else {
  5. Person p = (Person)obj;
  6. return this.name == p.name && this.age == p.age;
  7. }
  8. }

2:应用实例2

  1. Person_ p1 = new Person_();
  2. p1.name = "hspedu";
  3. Person_ p2 = new Person_();
  4. p2.name = "hspedu";
  5. System.out.println(p1==p2); //False
  6. System.out.println(p1.name .equals( p2.name));//T
  7. System.out.println(p1.equals(p2));//False
  8. String s1 = new String("asdf");
  9. String s2 = new String("asdf");
  10. System.out.println(s1.equals(s2));//T
  11. System.out.println(s1==s2); //F

3:应用实例3

  1. int it = 65;
  2. float fl = 65.0f;
  3. System.out.println(“65 65.0f是否相等?” + (it == fl));//T
  4. System.out.println(“65 和‘A’是否相等?” + (it == ch1));//T
  5. System.out.println(“12 ch2 是否相等?” + (12 == ch2));//T
  6. String str1 = new String("hello");
  7. String str2 = new String("hello");
  8. System.out.println("str1 和 str2 是否相等?"+ (str1 == str2)); //F
  9. System.out.println(“str1 是否 equals str2?”+(str1.equals(str2)));//T
  10. System.out.println(“hello == new java.sql.Date()); //编译错误

三:hashcode方法

1:基本介绍

返回该对象的哈希值,支持此方法是为了提高哈希表的性能。

2:作用

  • 提高具有哈希结构的容器的效率!
  • 两个引用,如果指向的是同一个队形,则哈希值肯定是一样的!
  • 两个引用,如果指向的是不同对象,则哈希值是不一样的。 ```java Person sakura = new Person(“sakura1”, 18); Person sakura1 = new Person(“sakura”, 18);

Person sakura2 = sakura;

System.out.println(sakura.hashCode()); System.out.println(sakura1.hashCode()); System.out.println(sakura2.hashCode());

  1. - 哈希值主要根据地址好来的不能完全讲哈希值等价与地址
  2. <a name="kluEV"></a>
  3. ### 四:toString方法
  4. <a name="uIJmX"></a>
  5. #### 1:基本介绍
  6. **默认返回:全类名+@+哈希值的十六进制,【查看Object toString 方法】**
  7. ```java
  8. //getClass() + getname() : 全类名
  9. public String toString() {
  10. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  11. }
  12. Person sakura = new Person("sakura1", 18);
  13. System.out.println(sakura.toString());
  14. //如果没有重写,则默认会输出全类名+@+哈希值的十六进制
  15. //Date0802.Test00.Person@1b6d3586

子类往往重写toString方法,用于返回对象的属性信息

2:重写toString()方法

打印对象或拼接对象时,都会自动调用该对象的 toString 形式.

  1. @Override
  2. public String toString() {
  3. return "Person{" +
  4. "name='" + name + '\'' +
  5. ", age=" + age +
  6. '}';
  7. }
  • 当直接输出一个对象时,toString方法会默认的调用
    1. //两者等价
    2. System.out.println(sakura.toString());
    3. System.out.println(sakura);

    五:finalize方法

  1. 当对象被回收时,系统自动调用该对象的 finalize方法。子类可以重写该方法,做一些释放资源的操作 ```java Person p1 = new Person(); p1 = null //并不是置空之后局立即调用finalize,在jvm中的垃圾回收算法决定什么时候回收

@Override protected void finalize() throws Throwable { System.out.println(“我们销毁 人” + name ); System.out.println(“释放了某些资源…”); } ```

  1. 什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。

  2. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测试:Car [name]