- 1. JVM、JRE及JDK的关系
- 2. JAVA语言特点
- 3. JAVA和C++的区别
- 4. Java的基本数据类型
- 5. 隐式(自动)类型转换和显示(强制)类型转换
- 6. Java的自动装箱与拆箱
- 7. Java中String的不可变性
- 8. Java中字符常量和字符串常量的区别
- 9. 什么是字符串常量池?
- 10.Java中String 类的常用方法都有那些
- 11. Java中String和StringBuffer、StringBuilder的区别是什么?
- 12. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
- 13. Java语言采用何种编码方案?有何特点?
- 14.Java的访问修饰符有哪些?
- 15.Java运算符
- 16. Java中的static关键字
- 17.Java中的final 关键字
- 18.Java中final finally finalize区别
- 19. java的this关键字
- 20. java的super关键字
- 21. Java中this与super的区别
- 22. break ,continue ,return 的区别及作用
- 23. 面向对象和面向过程的区别
- 24. 面向对象三大特性(封装、继承、多态)
- 25. 面向对象五大基本原则是什么
- 26. Java中抽象类和接口的对比
- 27.在Java中定义一个不做事且没有参数的构造方法的作用
- 28. Java在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是什么
- 29. 一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能正确执行吗?为什么?
- 30.Java的构造方法有哪些特性?
- 31. Java中的变量
- 32. Java的内部类
- 33. Java中重载和重写的区别
- 34. 构造器(constructor)是否可被重写(override)
- 35. 重载的方法能否根据返回类型进行区分?为什么?
- 36. == 和 equals 的区别
- 37. hashCode 与 equals(为什么重写equals方法后,hashCode方法也必须重写
- 38. Java 中是值传递还是引用传递,还是两者共存
- 39. Java的IO流
- 40. BIO,NIO,AIO 有什么区别?
- 41. Java反射机制
- 42. JAVA异常
- 43. JAVA注解
- 44. JAVA泛型
- 45. JAVA序列化
- 46. 深拷贝与浅拷贝
- 47. 常见的Object方法
47. 常见的Object方法
- equals
先看下String
类中重写的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;
}
从源码中可以看到:
equals
方法首先比较的是内存地址,如果内存地址相同,直接返回true
;如果内存地址不同,再比较对象的类型,类型不同直接返回false
;类型相同,再比较值是否相同;值相同返回true
,值不同返回false
。总结一下,equals
会比较内存地址、对象类型、以及值,内存地址相同,equals
一定返回true
;对象类型和值相同,equals
方法一定返回true
。- 如果没有重写
equals
方法,那么equals
和==
的作用相同,比较的是对象的地址值。
hashCode
hashCode
方法返回对象的散列码,返回值是int
类型的散列码。散列码的作用是确定该对象在哈希表中的索引位置。
关于hashCode
有一些约定:
- 两个对象相等,则
hashCode
一定相同。 - 两个对象有相同的
hashCode
值,它们不一定相等。 hashCode()
方法默认是对堆上的对象产生独特值,如果没有重写hashCode()
方法,则该类的两个对象的hashCode
值肯定不同
- 为什么重写
equals
方法后,hashCode
方法也必须重写
- 根据规定,两个对象相等,
hashCode
值也许相同,所以重写equals
方法后,hashCode
方法也必须重写(面试官肯定不是想听这个答案) hashCode
在具有哈希机制的集合中起着非常关键的作用,比如HashMap
、HashSet
等。以HashSet
为例,HashSet
的特点是存储元素时无序且唯一,在向HashSet
中添加对象时,首相会计算对象的HashCode
值来确定对象的存储位置,如果该位置没有其他对象,直接将该对象添加到该位置;如果该存储位置有存储其他对象(新添加的对象和该存储位置的对象的HashCode
值相同),调用equals
方法判断两个对象是否相同,如果相同,则添加对象失败,如果不相同,则会将该对象重新散列到其他位置。所以重写equals
方法后,hashCode
方法不重写的话,会导致所有对象的HashCode
值都不相同,都能添加成功,那么HashSet
中会出现很多重复元素,HashMap
也是同理(因为HashSet
的底层就是通过HashMap
实现的),会出现大量相同的Key
(HashMap
中的key
是唯一的,但不同的key
可以对应相同的value
)。所以重写equals
方法后,hashCode
方法也必须重写。同时因为两个对象的hashCode
值不同,则它们一定不相等,所以先计算对象的hashCode
值可以在一定程度上判断两个对象是否相等,提高了集合的效率。总结一下,一共两点:第一,在HashSet
等集合中,不重写hashCode
方法会导致其功能出现问题;第二,可以提高集合效率。
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版