(韩顺平Java321p)
在Java中每个类都直接或者间接继承Object类
== 与 equals的对比 ==是一个比较运算符- 既可以判断基本类型,又可以判断引用类型
- 如果判断基本类型,判断的是值是否相等
- 如果怕判断引用类型,判断的是地址是否相等
这次彻底搞懂Java中equals和==的区别 - 知乎 (zhihu.com)
equals方法是Object类中的方法,只能判断引用类型(Java中所有的类都有equals方法)
默认(Object)判断的是地址是否相等(就是判断两个对象是不是同一个对象),子类(Integer,String)中往往重写该方法,用于判断内容是否相等
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;
}
实例
public class equalsText {
public static void main(String[] args) {
person person1 = new person1("0.0",18);
person person2 = new person1("0.0",18);
System.out.println(person1.equals(person2));
}
}
class person{
private String name;
private int age;
public person1(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object ob){
//如果是同一个对象,返回true
if(this == ob){
return true;
}
if (ob instanceof person){//向下转型
person p1 = (person) ob;
return this.name.equals(p1.name) && this.age == p1.age;
}
return false;
}
}
hashCode方法
- 提高具有哈希结构的容器的效率
- 两个对象引用,如果指向的是同一个对象,则哈希值肯定是一样的
- 两个对象引用,如果指向的是不同对象,则哈希值肯定是不一样的
- 哈希值主要根据内部地址转换成一个整数来实现的,不能把哈希值等价于地址
在没有重写tostring的前提下,每次执行System.out.println() 这个方法默认就会调用一个继承自Object 类型对象的toString 方法
重写toString()方法的意义所在- 默认返回:全类名(包名+类名) + @ + 哈希值的十六进制
- 子类往往重写toString方法,用于打印对象属性或拼接对象属性(快捷 alt + ins --> toString)
- 当直接输出一个对象时,toString方法会被默认的调用
a a1 = new a();
System.out.println(aa1);//等价a.toString();
class a{
}
public String toString() { //源码 object类中的toString()方法
//getClass().getName()+"@"+Integer.toHexString(hashCode())将对象的hashCode值转为十六进制字符串
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
finalize方法
当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法
- 当对象被收回时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作
- 什么时候被回收:当某个对象没有任何引用时,JVM就认为这个对象是一个垃圾对象,就回使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法
- 垃圾回收机制的调用,由系统来决定(自带GC算法),也可以通过System.gc() 主动调用垃圾回收机制
是指程序的某一行设置一个断点,调试时,程序运行到这一行就会停止,然后可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码即显示错误,并停下,进行分析从而找到这个Bug
断点调试也能帮助我们查看Java底层源代码的执行过程
断点调试过程中,是运行状态,是以对象的运行类型来执行的
断点可以在debug过程中,动态的下断点
快捷F7:跳入方法内
F8 : 逐行执行代码
F9 :resume,执行到下一个断点
shift + F8 :跳出方法



