@@ -240,7 +240,7 @@ Java 中的注释有三种:
240240
241241在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了标识符,简单来说,标识符就是一个名字。但是有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是关键字。因此,关键字是被赋予特殊含义的标识符。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
242242
243- ### Java 中有 `53 ` 个关键字:
243+ ### Java 中的 `53 ` 个关键字
244244
245245| 分类 | 关键字 | | | | | | |
246246| : ------------------ - | -------- | ---------- | -------- | ------------ | ---------- | -------- - | ------ |
@@ -260,7 +260,8 @@ Java 中的注释有三种:
260260>
261261> `default` 这个关键字很特殊,既属于程序控制,也属于类,方法和变量修饰符,还属于访问控制。
262262>
263- > - 在程序控制中,当在 `switch` 中匹配不到任何情况时,可以使用 `default` 来编写默认匹配的情况。在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 `default` 关键字来定义一个方法的默认实现。
263+ > - 在程序控制中,当在 `switch` 中匹配不到任何情况时,可以使用 `default` 来编写默认匹配的情况。
264+ > - 在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 `default` 关键字来定义一个方法的默认实现。
264265> - 在访问控制中,如果一个方法前没有任何修饰符,则默认会有一个修饰符 `default`,但是这个修饰符加上了就会报错。
265266
266267### 自增自减运算符
@@ -501,7 +502,7 @@ public class SuperSuperMan extends SuperMan {
501502
502503> 因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
503504
504- ** `equals()`** 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。`equals()`方法存在于`Object `类中,而`Object `类是所有类的直接或间接父类。
505+ ** `equals()`** 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。`equals()`方法存在于`Object `类中,而`Object `类是所有类的直接或间接父类,因此所有的类都有`equals()`方法 。
505506
506507`Object ` 类 `equals()` 方法:
507508
@@ -513,8 +514,8 @@ public boolean equals(Object obj) {
513514
514515`equals()` 方法存在两种使用情况:
515516
516- - ** 类没有覆盖 `equals()`方法** :通过`equals()`比较该类的两个对象时,等价于通过“== ”比较这两个对象,使用的默认是 `Object `类`equals()`方法。
517- - ** 类覆盖了 `equals()`方法** :一般我们都覆盖 `equals()`方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true (即,认为这两个对象相等)。
517+ - ** 类没有重写 `equals()`方法** :通过`equals()`比较该类的两个对象时,等价于通过“== ”比较这两个对象,使用的默认是 `Object `类`equals()`方法。
518+ - ** 类重写了 `equals()`方法** :一般我们都重写 `equals()`方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true (即,认为这两个对象相等)。
518519
519520举个例子(这里只是为了举例。实际上,你按照下面这种写法的话,像 IDEA 这种比较智能的 IDE 都会提示你将 `== ` 换成 `equals()` ):
520521
@@ -583,7 +584,7 @@ public native int hashCode();
583584
584585下面这段内容摘自我的 Java 启蒙书《Head First Java 》:
585586
586- > 当你把对象加入 `HashSet ` 时,`HashSet ` 会先计算对象的 `hashCode` 值来判断对象加入的位置,同时也会与其他已经加入的对象的 `hashCode` 值作比较,如果没有相符的 `hashCode`,`HashSet ` 会假设对象没有重复出现。但是如果发现有相同 `hashCode` 值的对象,这时会调用 `equals()` 方法来检查 `hashCode` 相等的对象是否真的相同。如果两者相同,`HashSet ` 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。。 这样我们就大大减少了 `equals` 的次数,相应就大大提高了执行速度。
587+ > 当你把对象加入 `HashSet ` 时,`HashSet ` 会先计算对象的 `hashCode` 值来判断对象加入的位置,同时也会与其他已经加入的对象的 `hashCode` 值作比较,如果没有相符的 `hashCode`,`HashSet ` 会假设对象没有重复出现。但是如果发现有相同 `hashCode` 值的对象,这时会调用 `equals()` 方法来检查 `hashCode` 相等的对象是否真的相同。如果两者相同,`HashSet ` 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 `equals` 的次数,相应就大大提高了执行速度。
587588
588589其实, `hashCode()` 和 `equals()`都是用于比较两个对象是否相等。
589590
@@ -604,7 +605,7 @@ public native int hashCode();
604605总结下来就是 :
605606
606607- 如果两个对象的`hashCode` 值相等,那这两个对象不一定相等(哈希碰撞)。
607- - 如果两个对象的`hashCode` 值相等并且`equals()`方法返回 `true `,我们才认为这两个对象相等。
608+ - 如果两个对象的`hashCode` 值相等并且`equals()`方法也返回 `true `,我们才认为这两个对象相等。
608609- 如果两个对象的`hashCode` 值不相等,我们就可以直接认为这两个对象不相等。
609610
610611相信大家看了我前面对 `hashCode()` 和 `equals()` 的介绍之后,下面这个问题已经难不倒你们了。
0 commit comments