Skip to content

Commit 2375ed6

Browse files
committed
docs(interview): add interview question of equals and ==
1 parent 569e9eb commit 2375ed6

2 files changed

Lines changed: 96 additions & 7 deletions

File tree

java/basic/java-basic.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,8 +844,30 @@ x.equals(null); // false;
844844

845845
**2. 等价与相等**
846846

847-
- 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() 方法。
848-
- 对于引用类型,== 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价。
847+
1. 基础数据类型没有equals方法,只能使用==来判断,判断的时候是判断值是否相等
848+
2. 引用类型可以使用==和equalls。如果对象不重写Object中的equals方法,那么==和equals没有区别,因为Object中的equals也是使用==来判断;如果重写了equals方法,那就使用对象重写的equals方法来判断。==比较的是两个对象在堆中存放数据的内存地址是否相等。
849+
3. String需要拿来特殊说明,String是Java中不需要new就可以产生对象的特例。使用String来申明一个变量的时候,JVM会在常量池中查找是否已经存在这个值,如果存在就把内存地址返回给变量;如果不存在,会新开辟一个空间来存储这个值,然后把内存地址返回。那么我们再来看String中==和equals的区别,String中使用==比较的是内存地址是否相等,String重写了Object中的equals方法,使用equals时先比较对象是否相等,如果相等就返回true;否则比较值是否相等。
850+
public boolean equals(Object anObject) {
851+
if (this == anObject) {
852+
return true;
853+
}
854+
if (anObject instanceof String) {
855+
String anotherString = (String)anObject;
856+
int n = value.length;
857+
if (n == anotherString.value.length) {
858+
char v1[] = value;
859+
char v2[] = anotherString.value;
860+
int i = 0;
861+
while (n-- != 0) {
862+
if (v1[i] != v2[i])
863+
return false;
864+
i++;
865+
}
866+
return true;
867+
}
868+
}
869+
return false;
870+
}
849871

850872
```java
851873
Integer x = new Integer(1);

tool/interview.md

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,80 @@
33
* [面试技巧](#面试技巧)
44

55
### 面试题
6-
* [什么是面向对象](https://github. com/zhonghuasheng/Tutorial/issues/188)
76
* [SpringMVC 说说过滤器、监听器、拦截器有啥区别]()
87
* [SpringBoot系列](https://github. com/zhonghuasheng/Tutorial/issues?q=label%3ASpringBoot+)
98
* [SpringBoot 的启动原理](https://github. com/zhonghuasheng/Tutorial/issues/185)
10-
一、Java 基础
11-
1. JDK 和 JRE 有什么区别?
12-
2. == 和 equals 的区别是什么?
9+
#### Java 基础
10+
> 什么是面向对象?
11+
12+
先讲一下面向过程与面向对象编程
13+
1. 对比说明面向对象的优点
14+
2. 说说面向对象的三个特征:封装、继承、多态
15+
先讲一下面向过程:
16+
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
17+
18+
可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
19+
20+
如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
21+
22+
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
23+
24+
我们再来说一说面向对象都有哪些优点:
25+
1. 代码开发模块化,更容易维护和修改
26+
2. 代码复用性强
27+
3. 增加了代码的可读性
28+
4. 相对来说代码的可靠性和灵活性也得到了增强
29+
30+
面向对象的三个特征
31+
封装
32+
封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。首先Java中提供了4中修饰符来修饰方法default, public, protected, private,对对象赋予了不同的访问权限;另外,对于对象内部的属性,通常写成私有的,然后通过setter方法来赋值,getter方法来取值,避免了直接与对象内部属性的操作。
33+
继承
34+
继承给对象提供了从基类获取字段和方法的能力,继承提供了代码的重用性,也可以在不修改类的情况下给现存类添加新特性。
35+
多态
36+
多态提供了同一个行为具有多个不同表现形式或形态的能力(say())。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
37+
多态的优点:
38+
消除类型之间的耦合关系
39+
可替换性
40+
可扩充性
41+
接口性
42+
灵活性
43+
简化性
44+
45+
> JDK 和 JRE 有什么区别?
46+
47+
JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,具体的下文会详细说明。
48+
JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
49+
JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
50+
显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。
51+
52+
> == 和 equals 的区别是什么?
53+
54+
1. 基础数据类型没有equals方法,只能使用==来判断,判断的时候是判断值是否相等
55+
2. 引用类型可以使用==和equalls。如果对象不重写Object中的equals方法,那么==和equals没有区别,因为Object中的equals也是使用==来判断;如果重写了equals方法,那就使用对象重写的equals方法来判断。==比较的是两个对象在堆中存放数据的内存地址是否相等。
56+
3. String需要拿来特殊说明,String是Java中不需要new就可以产生对象的特例。使用String来申明一个变量的时候,JVM会在常量池中查找是否已经存在这个值,如果存在就把内存地址返回给变量;如果不存在,会新开辟一个空间来存储这个值,然后把内存地址返回。那么我们再来看String中==和equals的区别,String中使用==比较的是内存地址是否相等,String重写了Object中的equals方法,使用equals时先比较对象是否相等,如果相等就返回true;否则比较值是否相等。
57+
```
58+
public boolean equals(Object anObject) {
59+
if (this == anObject) {
60+
return true;
61+
}
62+
if (anObject instanceof String) {
63+
String anotherString = (String)anObject;
64+
int n = value.length;
65+
if (n == anotherString.value.length) {
66+
char v1[] = value;
67+
char v2[] = anotherString.value;
68+
int i = 0;
69+
while (n-- != 0) {
70+
if (v1[i] != v2[i])
71+
return false;
72+
i++;
73+
}
74+
return true;
75+
}
76+
}
77+
return false;
78+
}
79+
```
1380
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
1481
4. final 在 Java 中有什么作用?
1582
5. Java 中的 Math. round(-1. 5) 等于多少?
@@ -25,7 +92,7 @@
2592
15. Java 中 IO 流分为几种?
2693
16. BIO、NIO、AIO 有什么区别?
2794
17. Files的常用方法都有哪些?
28-
二、多线程
95+
#### 多线程
2996
18. 并行和并发有什么区别?
3097
19. 线程和进程的区别?
3198
20. 守护线程是什么?

0 commit comments

Comments
 (0)