1.对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等,比的是内存存放内容是否相等。而引用相等,比较的是它们指向内存地址是否相等。
2.在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。
3. == 与 equals(重要)
== :它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用 数据类型==比较的是内存地址)
equals : 它的作用也是判断两个对象是否相等。但它一般有两种情况:
- 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较两个对象
- 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来判断两个对象的内容相等,若相等返回true(即认为两个对象相等)
举个例子:
public class test{
public static void main(String[] args){
String a = new String("ab");//a为一个引用
String b = new String("ab");//b是另一个引用,对象内容和a一样
String aa = "ab";//放在常量池中
String bb = "ab";//从常量池中查找
if(aa == bb){
//true
System.out.println("aa == bb");
}
if(a == b){
//false
System.out.println("a ==b");
}
if(a.equals(b){
//false,非同一对象
System.out.println("aEQb");
}
if(32 == 32.0){
//true
System.out.println("true");
}
}
}
说明:
1:String中的equals方法是被重写过的,因为object的equals方法是比较对象的内存地址,而String
的equals方法是比较对象的值,a,b地址在栈内存,引用堆内存的“ab”
2:当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的类相同的
对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。
4.hashCode与equals(重要)
面试官可能问你:“你重写过hashcode和equals么,为什么重写equals时必须重写hashcode方法?”
hashCode()介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义 在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)