1. hashCode方法 324 1.1 图解 1.2 小结 1) 提高具有哈希结构的容器的效率! 2) 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的! 3) 两个引用,如果指向的是不同对象,则哈希值
1. hashCode方法 324
1.1 图解
1.2 小结
1) 提高具有哈希结构的容器的效率!
2) 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
3) 两个引用,如果指向的是不同对象,则哈希值是不一样的
4) 哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。
5) 后面在集合,中 hashCode 如果需要的话,也会重写, 在讲解集合时,在说如何重写hashCode()
代码在com.stulzl.hashcode_.包中
HashCode
package com.stulzl.hashcode_;
//关于hashCode的练习
public class HashCode {
public static void main(String[] args) {
AA aa = new AA();
AA aa1 = new AA();
AA aa3 = aa;
//2) 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
System.out.println("aa3.hashCode()="+aa3.hashCode());
//3) 两个引用,如果指向的是不同对象,则哈希值是不一样的
System.out.println("aa.hashCode()="+aa.hashCode());
System.out.println("aa1.hashCode()="+aa1.hashCode());
}
}
class AA{}
2. toString方法
2.1 基本介绍
默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】
子类往往重写 toString 方法,用于返回对象的属性信息
2) 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.
3) 当直接输出一个对象时,toString 方法会被默认的调用, 比如System.out.println(monster)就会默认调用 monster.toString()
2.2 演示toString的使用
代码在com.stulzl.tostring_.包中
ToString
package com.stulzl.tostring_;
import com.sun.xml.internal.ws.developer.EPRRecipe;
//ToString方法 325
public class ToString {
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);
// 全类名 +@+哈希值的十六进制
//输出com.stulzl.tostring_.Monster@1540e19d hashCode356573597
//System.out.println(monster.toString()+" hashCode"+monster.hashCode());
//重写toString方法之后输出 属性的值
//Monster{name='小妖怪', job='巡山的', sal=1000.0} hashCode356573597
System.out.println(monster.toString()+" hashCode"+monster.hashCode());
//当直接输出一个对象时,toString 方法会被默认的调用
System.out.println(monster);//等价 System.out.println(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 +
'}';
}
}
3. finalize方法
3.1 基本介绍
1) 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作
2) 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法。
3) 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测 试:Car [name]
提示: 我们在实际开发中,几乎不会运用 finalize , 所以更多就是为了应付面试.
3.2 演示finalize的使用 326
代码在com.stulzl.finalize_.包中
FinaLize
package com.stulzl.finalize_;
//演示finalize的使用 326
public class Finalize {
public static void main(String[] args) {
Car bmw = new Car("宝马");
bmw=null;//置空 这时 car 对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,
// 会调用该对象的 finalize 方法 程序员就可以在 finalize 中,
// 写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件..)
//,如果程序员不重写 finalize,那么就会调用 Object 类的 finalize, 即默认处理
//,如果程序员重写了 finalize, 就可以实现自己的逻辑
System.gc();//主动调用垃圾回收器
System.out.println("程序退出了……");
}
}
class Car{
private String name;
public Car(String name) {
this.name = name;
}
//重写finalize方法
@Override
protected void finalize() throws Throwable {
System.out.println("销毁汽车");
System.out.println("释放了资源");
}
}