mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-25 02:27:10 +08:00
commit
d8a1cbd137
@ -240,7 +240,7 @@ Java 中的注释有三种:
|
||||
|
||||
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了标识符,简单来说,标识符就是一个名字。但是有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是关键字。因此,关键字是被赋予特殊含义的标识符。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
|
||||
|
||||
### Java 中有 `53` 个关键字:
|
||||
### Java 中的 `53` 个关键字
|
||||
|
||||
| 分类 | 关键字 | | | | | | |
|
||||
| :------------------- | -------- | ---------- | -------- | ------------ | ---------- | --------- | ------ |
|
||||
@ -260,7 +260,8 @@ Java 中的注释有三种:
|
||||
>
|
||||
> `default` 这个关键字很特殊,既属于程序控制,也属于类,方法和变量修饰符,还属于访问控制。
|
||||
>
|
||||
> - 在程序控制中,当在 `switch` 中匹配不到任何情况时,可以使用 `default` 来编写默认匹配的情况。在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 `default` 关键字来定义一个方法的默认实现。
|
||||
> - 在程序控制中,当在 `switch` 中匹配不到任何情况时,可以使用 `default` 来编写默认匹配的情况。
|
||||
> - 在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 `default` 关键字来定义一个方法的默认实现。
|
||||
> - 在访问控制中,如果一个方法前没有任何修饰符,则默认会有一个修饰符 `default`,但是这个修饰符加上了就会报错。
|
||||
|
||||
### 自增自减运算符
|
||||
@ -501,7 +502,7 @@ public class SuperSuperMan extends SuperMan {
|
||||
|
||||
> 因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
|
||||
|
||||
**`equals()`** 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。`equals()`方法存在于`Object`类中,而`Object`类是所有类的直接或间接父类。
|
||||
**`equals()`** 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。`equals()`方法存在于`Object`类中,而`Object`类是所有类的直接或间接父类,因此所有的类都有`equals()`方法。
|
||||
|
||||
`Object` 类 `equals()` 方法:
|
||||
|
||||
@ -513,8 +514,8 @@ public boolean equals(Object obj) {
|
||||
|
||||
`equals()` 方法存在两种使用情况:
|
||||
|
||||
- **类没有覆盖 `equals()`方法** :通过`equals()`比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 `Object`类`equals()`方法。
|
||||
- **类覆盖了 `equals()`方法** :一般我们都覆盖 `equals()`方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。
|
||||
- **类没有重写 `equals()`方法** :通过`equals()`比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 `Object`类`equals()`方法。
|
||||
- **类重写了 `equals()`方法** :一般我们都重写 `equals()`方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。
|
||||
|
||||
举个例子(这里只是为了举例。实际上,你按照下面这种写法的话,像 IDEA 这种比较智能的 IDE 都会提示你将 `==` 换成 `equals()` ):
|
||||
|
||||
@ -583,7 +584,7 @@ public native int hashCode();
|
||||
|
||||
下面这段内容摘自我的 Java 启蒙书《Head First Java》:
|
||||
|
||||
> 当你把对象加入 `HashSet` 时,`HashSet` 会先计算对象的 `hashCode` 值来判断对象加入的位置,同时也会与其他已经加入的对象的 `hashCode` 值作比较,如果没有相符的 `hashCode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashCode` 值的对象,这时会调用 `equals()` 方法来检查 `hashCode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。。这样我们就大大减少了 `equals` 的次数,相应就大大提高了执行速度。
|
||||
> 当你把对象加入 `HashSet` 时,`HashSet` 会先计算对象的 `hashCode` 值来判断对象加入的位置,同时也会与其他已经加入的对象的 `hashCode` 值作比较,如果没有相符的 `hashCode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashCode` 值的对象,这时会调用 `equals()` 方法来检查 `hashCode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 `equals` 的次数,相应就大大提高了执行速度。
|
||||
|
||||
其实, `hashCode()` 和 `equals()`都是用于比较两个对象是否相等。
|
||||
|
||||
@ -604,7 +605,7 @@ public native int hashCode();
|
||||
总结下来就是 :
|
||||
|
||||
- 如果两个对象的`hashCode` 值相等,那这两个对象不一定相等(哈希碰撞)。
|
||||
- 如果两个对象的`hashCode` 值相等并且`equals()`方法返回 `true`,我们才认为这两个对象相等。
|
||||
- 如果两个对象的`hashCode` 值相等并且`equals()`方法也返回 `true`,我们才认为这两个对象相等。
|
||||
- 如果两个对象的`hashCode` 值不相等,我们就可以直接认为这两个对象不相等。
|
||||
|
||||
相信大家看了我前面对 `hashCode()` 和 `equals()` 的介绍之后,下面这个问题已经难不倒你们了。
|
||||
|
@ -271,7 +271,7 @@ Finally
|
||||
|
||||
```java
|
||||
public static void main(String[] args) {
|
||||
System.out.println(f(2));;
|
||||
System.out.println(f(2));
|
||||
}
|
||||
|
||||
public static int f(int value) {
|
||||
|
@ -26,7 +26,7 @@ String hello = "Hello!";
|
||||
sayHello(hello);
|
||||
// str 为形参
|
||||
void sayHello(String str) {
|
||||
System.out.println(str);
|
||||
System.out.println(str);
|
||||
}
|
||||
```
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user