---
title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)
category: Java
tag:
- Javaåºç¡
head:
- - meta
- name: keywords
content: é¢å对象,æé æ¹æ³,æ¥å£,æ½è±¡ç±»,String,Object
- - meta
- name: description
content: å
¨ç½è´¨éæé«çJavaåºç¡å¸¸è§ç¥è¯ç¹åé¢è¯é¢æ»ç»ï¼å¸æå¯¹ä½ æå¸®å©ï¼
---
## é¢å对象åºç¡
### é¢å对象åé¢åè¿ç¨çåºå«
两è
ç主è¦åºå«å¨äºè§£å³é®é¢çæ¹å¼ä¸åï¼
- é¢åè¿ç¨æè§£å³é®é¢çè¿ç¨ææä¸ä¸ªä¸ªæ¹æ³ï¼éè¿ä¸ä¸ªä¸ªæ¹æ³çæ§è¡è§£å³é®é¢ã
- é¢å对象ä¼å
æ½è±¡åºå¯¹è±¡ï¼ç¶åç¨å¯¹è±¡æ§è¡æ¹æ³çæ¹å¼è§£å³é®é¢ã
å¦å¤ï¼é¢å对象å¼åçç¨åºä¸è¬æ´æç»´æ¤ãæå¤ç¨ãææ©å±ã
ç¸å
³ issue : [é¢åè¿ç¨ï¼é¢åè¿ç¨æ§è½æ¯é¢å对象é«ï¼ï¼](https://github.com/Snailclimb/JavaGuide/issues/431) ã
ä¸é¢æ¯ä¸ä¸ªæ±åçé¢ç§¯åå¨é¿ç示ä¾ï¼ç®ååå«å±ç¤ºäºé¢å对象åé¢åè¿ç¨ä¸¤ç§ä¸åçè§£å³æ¹æ¡ã
**é¢å对象**ï¼
```java
public class Circle {
// å®ä¹åçåå¾
private double radius;
// æé 彿°
public Circle(double radius) {
this.radius = radius;
}
// 计ç®åçé¢ç§¯
public double getArea() {
return Math.PI * radius * radius;
}
// 计ç®åçå¨é¿
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public static void main(String[] args) {
// å建ä¸ä¸ªåå¾ä¸º3çå
Circle circle = new Circle(3.0);
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + circle.getArea());
System.out.println("åçå¨é¿ä¸ºï¼" + circle.getPerimeter());
}
}
```
æä»¬å®ä¹äºä¸ä¸ª `Circle` ç±»æ¥è¡¨ç¤ºåï¼è¯¥ç±»å
å«äºåçåå¾å±æ§å计ç®é¢ç§¯ãå¨é¿çæ¹æ³ã
**é¢åè¿ç¨**ï¼
```java
public class Main {
public static void main(String[] args) {
// å®ä¹åçåå¾
double radius = 3.0;
// 计ç®åçé¢ç§¯åå¨é¿
double area = Math.PI * radius * radius;
double perimeter = 2 * Math.PI * radius;
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + area);
System.out.println("åçå¨é¿ä¸ºï¼" + perimeter);
}
}
```
æä»¬ç´æ¥å®ä¹äºåçåå¾ï¼å¹¶ä½¿ç¨è¯¥åå¾ç´æ¥è®¡ç®åºåçé¢ç§¯åå¨é¿ã
### å建ä¸ä¸ªå¯¹è±¡ç¨ä»ä¹è¿ç®ç¬¦?对象å®ä½ä¸å¯¹è±¡å¼ç¨æä½ä¸å?
new è¿ç®ç¬¦ï¼new å建对象å®ä¾ï¼å¯¹è±¡å®ä¾å¨å å
åä¸ï¼ï¼å¯¹è±¡å¼ç¨æå对象å®ä¾ï¼å¯¹è±¡å¼ç¨åæ¾å¨æ å
åä¸ï¼ã
- ä¸ä¸ªå¯¹è±¡å¼ç¨å¯ä»¥æå 0 个æ 1 个对象ï¼ä¸æ ¹ç»³åå¯ä»¥ä¸ç³»æ°çï¼ä¹å¯ä»¥ç³»ä¸ä¸ªæ°çï¼ï¼
- ä¸ä¸ªå¯¹è±¡å¯ä»¥æ n 个å¼ç¨æåå®ï¼å¯ä»¥ç¨ n æ¡ç»³åç³»ä½ä¸ä¸ªæ°çï¼ã
### 对象çç¸çåå¼ç¨ç¸ççåºå«
- 对象çç¸çä¸è¬æ¯è¾çæ¯å
åä¸åæ¾çå
容æ¯å¦ç¸çã
- å¼ç¨ç¸çä¸è¬æ¯è¾çæ¯ä»ä»¬æåçå
åå°åæ¯å¦ç¸çã
è¿é举ä¸ä¸ªä¾åï¼
```java
String str1 = "hello";
String str2 = new String("hello");
String str3 = "hello";
// ä½¿ç¨ == æ¯è¾å符串çå¼ç¨ç¸ç
System.out.println(str1 == str2);
System.out.println(str1 == str3);
// ä½¿ç¨ equals æ¹æ³æ¯è¾å符串çç¸ç
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
```
è¾åºç»æï¼
```plain
false
true
true
true
```
ä»ä¸é¢ç代ç è¾åºç»æå¯ä»¥çåºï¼
- `str1` å `str2` ä¸ç¸çï¼è `str1` å `str3` ç¸çãè¿æ¯å 为 `==` è¿ç®ç¬¦æ¯è¾çæ¯å符串çå¼ç¨æ¯å¦ç¸çã
- `str1`ã `str2`ã`str3` ä¸è
çå
容é½ç¸çãè¿æ¯å 为`equals` æ¹æ³æ¯è¾çæ¯å符串çå
容ï¼å³ä½¿è¿äºå符串ç对象å¼ç¨ä¸åï¼åªè¦å®ä»¬çå
容ç¸çï¼å°±è®¤ä¸ºå®ä»¬æ¯ç¸ççã
### 妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼è¯¥ç¨åºè½æ£ç¡®æ§è¡å?
æé æ¹æ³æ¯ä¸ç§ç¹æ®çæ¹æ³ï¼ä¸»è¦ä½ç¨æ¯å®æå¯¹è±¡çåå§åå·¥ä½ã
妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼ä¹å¯ä»¥æ§è¡ï¼å 为ä¸ä¸ªç±»å³ä½¿æ²¡æå£°ææé æ¹æ³ä¹ä¼æé»è®¤çä¸å¸¦åæ°çæé æ¹æ³ã妿æä»¬èªå·±æ·»å äºç±»çæé æ¹æ³ï¼æ 论æ¯å¦æåï¼ï¼Java å°±ä¸ä¼æ·»å é»è®¤çæ åæ°çæé æ¹æ³äºã
æä»¬ä¸ç´å¨ä¸ç¥ä¸è§å°ä½¿ç¨æé æ¹æ³ï¼è¿ä¹æ¯ä¸ºä»ä¹æä»¬å¨åå»ºå¯¹è±¡çæ¶ååé¢è¦å ä¸ä¸ªæ¬å·ï¼å 为è¦è°ç¨æ åçæé æ¹æ³ï¼ã妿æä»¬éè½½äºæåçæé æ¹æ³ï¼è®°å¾é½è¦ææ åçæé æ¹æ³ä¹ååºæ¥ï¼æ 论æ¯å¦ç¨å°ï¼ï¼å 为è¿å¯ä»¥å¸®å©æä»¬å¨åå»ºå¯¹è±¡çæ¶åå°è¸©åã
### æé æ¹æ³æåªäºç¹ç¹ï¼æ¯å¦å¯è¢« override?
æé æ¹æ³ç¹ç¹å¦ä¸ï¼
- ååä¸ç±»åç¸åã
- 没æè¿åå¼ï¼ä½ä¸è½ç¨ void 声ææé 彿°ã
- çæç±»ç对象æ¶èªå¨æ§è¡ï¼æ éè°ç¨ã
æé æ¹æ³ä¸è½è¢« overrideï¼éåï¼,使¯å¯ä»¥ overloadï¼éè½½ï¼,æä»¥ä½ å¯ä»¥çå°ä¸ä¸ªç±»ä¸æå¤ä¸ªæé 彿°çæ
åµã
### é¢å对象ä¸å¤§ç¹å¾
#### å°è£
å°è£
æ¯ææä¸ä¸ªå¯¹è±¡çç¶æä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼éèå¨å¯¹è±¡å
é¨ï¼ä¸å
许å¤é¨å¯¹è±¡ç´æ¥è®¿é®å¯¹è±¡çå
é¨ä¿¡æ¯ã使¯å¯ä»¥æä¾ä¸äºå¯ä»¥è¢«å¤ç访é®çæ¹æ³æ¥æä½å±æ§ã就好åæä»¬çä¸å°æå¨å¢ä¸ç空è°çå
é¨çé¶ä»¶ä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼ï¼ä½æ¯å¯ä»¥éè¿é¥æ§å¨ï¼æ¹æ³ï¼æ¥æ§å¶ç©ºè°ã妿屿§ä¸æ³è¢«å¤ç访é®ï¼æä»¬å¤§å¯ä¸å¿
æä¾æ¹æ³ç»å¤ç访é®ã使¯å¦æä¸ä¸ªç±»æ²¡ææä¾ç»å¤ç访é®çæ¹æ³ï¼é£ä¹è¿ä¸ªç±»ä¹æ²¡æä»ä¹æä¹äºã就好åå¦ææ²¡æç©ºè°é¥æ§å¨ï¼é£ä¹æä»¬å°±æ æ³ææ§ç©ºåå¶å·ï¼ç©ºè°æ¬èº«å°±æ²¡ææä¹äºï¼å½ç¶ç°å¨è¿æå¾å¤å
¶ä»æ¹æ³ ï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾åï¼ã
```java
public class Student {
private int id;//id屿§ç§æå
private String name;//name屿§ç§æå
//è·åidçæ¹æ³
public int getId() {
return id;
}
//设置idçæ¹æ³
public void setId(int id) {
this.id = id;
}
//è·ånameçæ¹æ³
public String getName() {
return name;
}
//设置nameçæ¹æ³
public void setName(String name) {
this.name = name;
}
}
```
#### ç»§æ¿
ä¸åç±»åç对象ï¼ç¸äºä¹é´ç»å¸¸æä¸å®æ°éçå
±åç¹ãä¾å¦ï¼å°æåå¦ãå°çº¢åå¦ãå°æåå¦ï¼é½å
±äº«å¦ççç¹æ§ï¼ç级ãå¦å·çï¼ãåæ¶ï¼æ¯ä¸ä¸ªå¯¹è±¡è¿å®ä¹äºé¢å¤çç¹æ§ä½¿å¾ä»ä»¬ä¸ä¼ä¸åãä¾å¦å°æçæ°å¦æ¯è¾å¥½ï¼å°çº¢çæ§æ ¼æ¹äººåç±ï¼å°æçåæ°æ¯è¾å¤§ãç»§æ¿æ¯ä½¿ç¨å·²åå¨çç±»çå®ä¹ä½ä¸ºåºç¡å»ºç«æ°ç±»çææ¯ï¼æ°ç±»çå®ä¹å¯ä»¥å¢å æ°çæ°æ®ææ°çåè½ï¼ä¹å¯ä»¥ç¨ç¶ç±»çåè½ï¼ä½ä¸è½éæ©æ§å°ç»§æ¿ç¶ç±»ãéè¿ä½¿ç¨ç»§æ¿ï¼å¯ä»¥å¿«éå°å建æ°çç±»ï¼å¯ä»¥æé«ä»£ç çéç¨ï¼ç¨åºçå¯ç»´æ¤æ§ï¼èç大éå建æ°ç±»çæ¶é´ ï¼æé«æä»¬çå¼åæçã
**å
³äºç»§æ¿å¦ä¸ 3 ç¹è¯·è®°ä½ï¼**
1. åç±»æ¥æç¶ç±»å¯¹è±¡ææç屿§åæ¹æ³ï¼å
æ¬ç§æå±æ§åç§ææ¹æ³ï¼ï¼ä½æ¯ç¶ç±»ä¸çç§æå±æ§åæ¹æ³åç±»æ¯æ æ³è®¿é®ï¼**åªæ¯æ¥æ**ã
2. åç±»å¯ä»¥æ¥æèªå·±å±æ§åæ¹æ³ï¼å³åç±»å¯ä»¥å¯¹ç¶ç±»è¿è¡æ©å±ã
3. åç±»å¯ä»¥ç¨èªå·±çæ¹å¼å®ç°ç¶ç±»çæ¹æ³ãï¼ä»¥åä»ç»ï¼ã
#### 夿
夿ï¼é¡¾åæä¹ï¼è¡¨ç¤ºä¸ä¸ªå¯¹è±¡å
·æå¤ç§çç¶æï¼å
·ä½è¡¨ç°ä¸ºç¶ç±»çå¼ç¨æååç±»çå®ä¾ã
**夿çç¹ç¹:**
- 对象类ååå¼ç¨ç±»åä¹é´å
·æç»§æ¿ï¼ç±»ï¼/å®ç°ï¼æ¥å£ï¼çå
³ç³»ï¼
- å¼ç¨ç±»ååéååºçæ¹æ³è°ç¨çå°åºæ¯åªä¸ªç±»ä¸çæ¹æ³ï¼å¿
é¡»å¨ç¨åºè¿è¡æé´æè½ç¡®å®ï¼
- 夿ä¸è½è°ç¨âåªå¨åç±»åå¨ä½å¨ç¶ç±»ä¸åå¨âçæ¹æ³ï¼
- 妿åç±»éåäºç¶ç±»çæ¹æ³ï¼çæ£æ§è¡çæ¯åç±»éåçæ¹æ³ï¼å¦æå类没æéåç¶ç±»çæ¹æ³ï¼æ§è¡çæ¯ç¶ç±»çæ¹æ³ã
### æ¥å£åæ½è±¡ç±»æä»ä¹å
±åç¹ååºå«ï¼
**å
±åç¹**ï¼
- é½ä¸è½è¢«å®ä¾åã
- é½å¯ä»¥å
嫿½è±¡æ¹æ³ã
- é½å¯ä»¥æé»è®¤å®ç°çæ¹æ³ï¼Java 8 å¯ä»¥ç¨ `default` å
³é®å卿¥å£ä¸å®ä¹é»è®¤æ¹æ³ï¼ã
**åºå«**ï¼
- æ¥å£ä¸»è¦ç¨äºå¯¹ç±»çè¡ä¸ºè¿è¡çº¦æï¼ä½ å®ç°äºæä¸ªæ¥å£å°±å
·æäºå¯¹åºçè¡ä¸ºãæ½è±¡ç±»ä¸»è¦ç¨äºä»£ç å¤ç¨ï¼å¼ºè°çæ¯æå±å
³ç³»ã
- ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªç±»ï¼ä½æ¯å¯ä»¥å®ç°å¤ä¸ªæ¥å£ã
- æ¥å£ä¸çæååéåªè½æ¯ `public static final` ç±»åçï¼ä¸è½è¢«ä¿®æ¹ä¸å¿
é¡»æåå§å¼ï¼èæ½è±¡ç±»çæååéé»è®¤ defaultï¼å¯å¨åç±»ä¸è¢«éæ°å®ä¹ï¼ä¹å¯è¢«éæ°èµå¼ã
### æ·±æ·è´åæµ
æ·è´åºå«äºè§£åï¼ä»ä¹æ¯å¼ç¨æ·è´ï¼
å
³äºæ·±æ·è´åæµ
æ·è´åºå«ï¼æè¿éå
ç»ç»è®ºï¼
- **æµ
æ·è´**ï¼æµ
æ·è´ä¼å¨å ä¸å建ä¸ä¸ªæ°ç对象ï¼åºå«äºå¼ç¨æ·è´çä¸ç¹ï¼ï¼ä¸è¿ï¼å¦æå对象å
é¨ç屿§æ¯å¼ç¨ç±»åçè¯ï¼æµ
æ·è´ä¼ç´æ¥å¤å¶å
é¨å¯¹è±¡çå¼ç¨å°åï¼ä¹å°±æ¯è¯´æ·è´å¯¹è±¡åå对象å
±ç¨åä¸ä¸ªå
é¨å¯¹è±¡ã
- **æ·±æ·è´**ï¼æ·±æ·è´ä¼å®å
¨å¤å¶æ´ä¸ªå¯¹è±¡ï¼å
æ¬è¿ä¸ªå¯¹è±¡æå
å«çå
é¨å¯¹è±¡ã
ä¸é¢çç»è®ºæ²¡æå®å
¨çè§£çè¯ä¹æ²¡å
³ç³»ï¼æä»¬æ¥çä¸ä¸ªå
·ä½çæ¡ä¾ï¼
#### æµ
æ·è´
æµ
æ·è´ç示ä¾ä»£ç å¦ä¸ï¼æä»¬è¿éå®ç°äº `Cloneable` æ¥å£ï¼å¹¶éåäº `clone()` æ¹æ³ã
`clone()` æ¹æ³çå®ç°å¾ç®åï¼ç´æ¥è°ç¨çæ¯ç¶ç±» `Object` ç `clone()` æ¹æ³ã
```java
public class Address implements Cloneable{
private String name;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
public class Person implements Cloneable {
private Address address;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼ `person1` çå
é对象å `person1` 使ç¨çä»ç¶æ¯åä¸ä¸ª `Address` 对象ã
#### æ·±æ·è´
è¿éæä»¬ç®å对 `Person` ç±»ç `clone()` æ¹æ³è¿è¡ä¿®æ¹ï¼è¿å¸¦çè¦æ `Person` 对象å
é¨ç `Address` 对象ä¸èµ·å¤å¶ã
```java
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// false
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼æ¾ç¶ `person1` çå
é对象å `person1` å
å«ç `Address` å¯¹è±¡å·²ç»æ¯ä¸åçäºã
**é£ä»ä¹æ¯å¼ç¨æ·è´å¢ï¼** ç®åæ¥è¯´ï¼å¼ç¨æ·è´å°±æ¯ä¸¤ä¸ªä¸åçå¼ç¨æååä¸ä¸ªå¯¹è±¡ã
æä¸é¨ç»äºä¸å¼ 徿¥æè¿°æµ
æ·è´ãæ·±æ·è´ãå¼ç¨æ·è´ï¼

## Object
### Object ç±»çå¸¸è§æ¹æ³æåªäºï¼
Object ç±»æ¯ä¸ä¸ªç¹æ®çç±»ï¼æ¯ææç±»çç¶ç±»ãå®ä¸»è¦æä¾äºä»¥ä¸ 11 ä¸ªæ¹æ³ï¼
```java
/**
* native æ¹æ³ï¼ç¨äºè¿åå½åè¿è¡æ¶å¯¹è±¡ç Class 对象ï¼ä½¿ç¨äº final å
³é®åä¿®é¥°ï¼æ
ä¸å
许åç±»éåã
*/
public final native Class> getClass()
/**
* native æ¹æ³ï¼ç¨äºè¿å对象çåå¸ç ï¼ä¸»è¦ä½¿ç¨å¨åå¸è¡¨ä¸ï¼æ¯å¦ JDK ä¸çHashMapã
*/
public native int hashCode()
/**
* ç¨äºæ¯è¾ 2 个对象çå
åå°åæ¯å¦ç¸çï¼String ç±»å¯¹è¯¥æ¹æ³è¿è¡äºéå以ç¨äºæ¯è¾å符串ç弿¯å¦ç¸çã
*/
public boolean equals(Object obj)
/**
* native æ¹æ³ï¼ç¨äºå建并è¿åå½å对象çä¸ä»½æ·è´ã
*/
protected native Object clone() throws CloneNotSupportedException
/**
* è¿åç±»çååå®ä¾çåå¸ç ç 16 è¿å¶çå符串ã建议 Object ææçåç±»é½éåè¿ä¸ªæ¹æ³ã
*/
public String toString()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãå¤éä¸ä¸ªå¨æ¤å¯¹è±¡çè§å¨ä¸çå¾
ç线ç¨(çè§å¨ç¸å½äºå°±æ¯éçæ¦å¿µ)ã妿æå¤ä¸ªçº¿ç¨å¨çå¾
åªä¼ä»»æå¤éä¸ä¸ªã
*/
public final native void notify()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãè· notify 䏿 ·ï¼å¯ä¸çåºå«å°±æ¯ä¼å¤é卿¤å¯¹è±¡çè§å¨ä¸çå¾
çææçº¿ç¨ï¼è䏿¯ä¸ä¸ªçº¿ç¨ã
*/
public final native void notifyAll()
/**
* nativeæ¹æ³ï¼å¹¶ä¸ä¸è½éåãæå线ç¨çæ§è¡ã注æï¼sleep æ¹æ³æ²¡æéæ¾éï¼è wait æ¹æ³éæ¾äºé ï¼timeout æ¯çå¾
æ¶é´ã
*/
public final native void wait(long timeout) throws InterruptedException
/**
* å¤äº nanos åæ°ï¼è¿ä¸ªåæ°è¡¨ç¤ºé¢å¤æ¶é´ï¼ä»¥çº³ç§ä¸ºåä½ï¼èå´æ¯ 0-999999ï¼ã æä»¥è¶
æ¶çæ¶é´è¿éè¦å ä¸ nanos 纳ç§ãã
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* è·ä¹åç2个waitæ¹æ³ä¸æ ·ï¼åªä¸è¿è¯¥æ¹æ³ä¸ç´çå¾
ï¼æ²¡æè¶
æ¶æ¶é´è¿ä¸ªæ¦å¿µ
*/
public final void wait() throws InterruptedException
/**
* å®ä¾è¢«åå¾åæ¶å¨åæ¶çæ¶å触åçæä½
*/
protected void finalize() throws Throwable { }
```
### == å equals() çåºå«
**`==`** 对äºåºæ¬ç±»ååå¼ç¨ç±»åçä½ç¨æææ¯ä¸åçï¼
- 对äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã
- 对äºå¼ç¨æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åã
> å 为 Java åªæå¼ä¼ éï¼æä»¥ï¼å¯¹äº == æ¥è¯´ï¼ä¸ç®¡æ¯æ¯è¾åºæ¬æ°æ®ç±»åï¼è¿æ¯å¼ç¨æ°æ®ç±»åçåéï¼å
¶æ¬è´¨æ¯è¾ç齿¯å¼ï¼åªæ¯å¼ç¨ç±»ååéåç弿¯å¯¹è±¡çå°åã
**`equals()`** ä¸è½ç¨äºå¤æåºæ¬æ°æ®ç±»åçåéï¼åªè½ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã`equals()`æ¹æ³åå¨äº`Object`ç±»ä¸ï¼è`Object`ç±»æ¯ææç±»çç´æ¥æé´æ¥ç¶ç±»ï¼å æ¤ææçç±»é½æ`equals()`æ¹æ³ã
`Object` ç±» `equals()` æ¹æ³ï¼
```java
public boolean equals(Object obj) {
return (this == obj);
}
```
`equals()` æ¹æ³åå¨ä¸¤ç§ä½¿ç¨æ
åµï¼
- **类没æéå `equals()`æ¹æ³**ï¼éè¿`equals()`æ¯è¾è¯¥ç±»ç两个对象æ¶ï¼çä»·äºéè¿â==âæ¯è¾è¿ä¸¤ä¸ªå¯¹è±¡ï¼ä½¿ç¨çé»è®¤æ¯ `Object`ç±»`equals()`æ¹æ³ã
- **ç±»éåäº `equals()`æ¹æ³**ï¼ä¸è¬æä»¬é½éå `equals()`æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªå¯¹è±¡ä¸ç屿§æ¯å¦ç¸çï¼è¥å®ä»¬ç屿§ç¸çï¼åè¿å true(å³ï¼è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸ç)ã
举个ä¾åï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾ãå®é
ä¸ï¼ä½ æç
§ä¸é¢è¿ç§åæ³çè¯ï¼å IDEA è¿ç§æ¯è¾æºè½ç IDE é½ä¼æç¤ºä½ å° `==` æ¢æ `equals()` ï¼ï¼
```java
String a = new String("ab"); // a 为ä¸ä¸ªå¼ç¨
String b = new String("ab"); // b为å¦ä¸ä¸ªå¼ç¨,对象çå
容䏿 ·
String aa = "ab"; // æ¾å¨å¸¸éæ± ä¸
String bb = "ab"; // ä»å¸¸éæ± ä¸æ¥æ¾
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true
```
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼å 为 `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å¯¹è±¡çå¼ã
å½å建 `String` ç±»åç对象æ¶ï¼èææºä¼å¨å¸¸éæ± ä¸æ¥æ¾ææ²¡æå·²ç»åå¨çå¼åè¦å建çå¼ç¸åç对象ï¼å¦ææå°±æå®èµç»å½åå¼ç¨ãå¦ææ²¡æå°±å¨å¸¸éæ± ä¸éæ°å建ä¸ä¸ª `String` 对象ã
`String`ç±»`equals()`æ¹æ³ï¼
```java
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;
}
```
### hashCode() æä»ä¹ç¨ï¼
`hashCode()` çä½ç¨æ¯è·ååå¸ç ï¼`int` æ´æ°ï¼ï¼ä¹ç§°ä¸ºæ£åç ãè¿ä¸ªåå¸ç çä½ç¨æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ã

`hashCode()` å®ä¹å¨ JDK ç `Object` ç±»ä¸ï¼è¿å°±æå³ç Java ä¸çä»»ä½ç±»é½å
嫿 `hashCode()` 彿°ãå¦å¤éè¦æ³¨æçæ¯ï¼`Object` ç `hashCode()` æ¹æ³æ¯æ¬å°æ¹æ³ï¼ä¹å°±æ¯ç¨ C è¯è¨æ C++ å®ç°çã
> â ï¸ æ³¨æï¼è¯¥æ¹æ³å¨ **Oracle OpenJDK8** ä¸é»è®¤æ¯ "使ç¨çº¿ç¨å±é¨ç¶ææ¥å®ç° Marsaglia's xor-shift éæºæ°çæ", 并䏿¯ "å°å" æè
"å°å转æ¢èæ¥", ä¸å JDK/VM å¯è½ä¸åå¨ **Oracle OpenJDK8** 䏿å
ç§çææ¹å¼ (å
¶ä¸ç¬¬äºç§æ¯è¿åå°å), éè¿æ·»å VM åæ°: -XX:hashCode=4 å¯ç¨ç¬¬äºç§ãåèæºç :
>
> -