一:equals方法
1:==和equals的对比
- ==:既可以判断基本类型,又可以判断引用类型
- ==:如果判断基本类型,判断的是值是否相等。示例:int i=10; double d=10.0;
==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
public static void main(String[] args){A a = new A();A b = a;A c = b;System.out.println(a == c);//trueSystem.out.println(b == c);//trueB bObj = a;System.out.println(bObj == c);//trueint num1 = 10;double num2 = 10.0;System.out.println(num1 == num2);//基本数据类型,判断值是否相等}
equals:是Object类中的方法,只能判断引用类型,
public boolean equals(Object obj) {return (this == obj);}
//重写了object中的equals方法public boolean equals(Object anObject) {if (this == anObject) { //如果是同一个对象return 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;}}return false;}
```java public boolean equals(Object obj) { if (obj instanceof Integer) {
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
5. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如lnteger,String【看看string 和 Integer的equals源代码】<a name="XdohN"></a>### 二:如何重写equals方法<a name="Ypn7Z"></a>#### 1:应用实例> **判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回 true,反之 false。**两种写法```javapublic boolean equals(Object obj) {if (this == obj){return true;}if (obj instanceof Person){Person p = (Person)obj;return this.name == p.name && this.age == p.age;}return false;}
public boolean equals(Person obj) {if (this == obj){return true;}else {Person p = (Person)obj;return this.name == p.name && this.age == p.age;}}
2:应用实例2
Person_ p1 = new Person_();p1.name = "hspedu";Person_ p2 = new Person_();p2.name = "hspedu";System.out.println(p1==p2); //FalseSystem.out.println(p1.name .equals( p2.name));//TSystem.out.println(p1.equals(p2));//FalseString s1 = new String("asdf");String s2 = new String("asdf");System.out.println(s1.equals(s2));//TSystem.out.println(s1==s2); //F
3:应用实例3
int it = 65;float fl = 65.0f;System.out.println(“65 和 65.0f是否相等?” + (it == fl));//TSystem.out.println(“65 和‘A’是否相等?” + (it == ch1));//TSystem.out.println(“12 和 ch2 是否相等?” + (12 == ch2));//TString str1 = new String("hello");String str2 = new String("hello");System.out.println("str1 和 str2 是否相等?"+ (str1 == str2)); //FSystem.out.println(“str1 是否 equals str2?”+(str1.equals(str2)));//TSystem.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());
- 哈希值主要根据地址好来的不能完全讲哈希值等价与地址<a name="kluEV"></a>### 四:toString方法<a name="uIJmX"></a>#### 1:基本介绍**默认返回:全类名+@+哈希值的十六进制,【查看Object 的 toString 方法】**```java//getClass() + getname() : 全类名public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}Person sakura = new Person("sakura1", 18);System.out.println(sakura.toString());//如果没有重写,则默认会输出全类名+@+哈希值的十六进制//Date0802.Test00.Person@1b6d3586
2:重写toString()方法
打印对象或拼接对象时,都会自动调用该对象的 toString 形式.
@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
- 当直接输出一个对象时,toString方法会默认的调用
//两者等价System.out.println(sakura.toString());System.out.println(sakura);
五:finalize方法
- 当对象被回收时,系统自动调用该对象的 finalize方法。子类可以重写该方法,做一些释放资源的操作 ```java Person p1 = new Person(); p1 = null //并不是置空之后局立即调用finalize,在jvm中的垃圾回收算法决定什么时候回收
@Override protected void finalize() throws Throwable { System.out.println(“我们销毁 人” + name ); System.out.println(“释放了某些资源…”); } ```
什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测试:Car [name]
