@@ -193,11 +193,11 @@ value 数组被声明为 final,这意味着 value 数组初始化之后就不
193
193
194
194
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
195
195
196
- <div align =" center " > <img src =" https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/9112288f-23f5-4e53-b222-a46fdbca1603 .png " width = " 300px " > </div ><br >
196
+ <div align =" center " > <img src =" https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/image-20191210004132894 .png " / > </div ><br >
197
197
198
198
** 3. 安全性**
199
199
200
- String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机 ,而实际情况却不一定是。
200
+ String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 的那一方以为现在连接的是其它主机 ,而实际情况却不一定是。
201
201
202
202
** 4. 线程安全**
203
203
@@ -222,11 +222,11 @@ String 不可变性天生具备线程安全,可以在多个线程中安全地
222
222
223
223
## String Pool
224
224
225
- 字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程中将字符串添加到 String Pool 中。
225
+ 字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程将字符串添加到 String Pool 中。
226
226
227
227
当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。
228
228
229
- 下面示例中,s1 和 s2 采用 new String() 的方式新建了两个不同字符串,而 s3 和 s4 是通过 s1.intern() 方法取得一个字符串引用 。intern() 首先把 s1 引用的字符串放到 String Pool 中,然后返回这个字符串引用。因此 s3 和 s4 引用的是同一个字符串。
229
+ 下面示例中,s1 和 s2 采用 new String() 的方式新建了两个不同字符串,而 s3 和 s4 是通过 s1.intern() 方法取得同一个字符串引用 。intern() 首先把 s1 引用的字符串放到 String Pool 中,然后返回这个字符串引用。因此 s3 和 s4 引用的是同一个字符串。
230
230
231
231
``` java
232
232
String s1 = new String (" aaa" );
@@ -310,7 +310,7 @@ public String(String original) {
310
310
311
311
Java 的参数是以值传递的形式传入方法中,而不是引用传递。
312
312
313
- 以下代码中 Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。因此在方法中使指针引用其它对象,那么这两个指针此时指向的是完全不同的对象,在一方改变其所指向对象的内容时对另一方没有影响。
313
+ 以下代码中 Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。
314
314
315
315
``` java
316
316
public class Dog {
@@ -335,37 +335,39 @@ public class Dog {
335
335
}
336
336
```
337
337
338
+ 在方法中改变对象的字段值会改变原对象该字段值,因为引用的是同一个对象。
339
+
338
340
``` java
339
- public class PassByValueExample {
341
+ class PassByValueExample {
340
342
public static void main (String [] args ) {
341
343
Dog dog = new Dog (" A" );
342
- System . out. println(dog. getObjectAddress()); // Dog@4554617c
343
344
func(dog);
344
- System . out. println(dog. getObjectAddress()); // Dog@4554617c
345
- System . out. println(dog. getName()); // A
345
+ System . out. println(dog. getName()); // B
346
346
}
347
347
348
348
private static void func (Dog dog ) {
349
- System . out. println(dog. getObjectAddress()); // Dog@4554617c
350
- dog = new Dog (" B" );
351
- System . out. println(dog. getObjectAddress()); // Dog@74a14482
352
- System . out. println(dog. getName()); // B
349
+ dog. setName(" B" );
353
350
}
354
351
}
355
352
```
356
353
357
- 如果在方法中改变对象的字段值会改变原对象该字段值,因为改变的是同一个地址指向的内容 。
354
+ 但是在方法中将指针引用了其它对象,那么此时方法里和方法外的两个指针指向了不同的对象,在一个指针改变其所指向对象的内容对另一个指针所指向的对象没有影响 。
358
355
359
356
``` java
360
- class PassByValueExample {
357
+ public class PassByValueExample {
361
358
public static void main (String [] args ) {
362
359
Dog dog = new Dog (" A" );
360
+ System . out. println(dog. getObjectAddress()); // Dog@4554617c
363
361
func(dog);
364
- System . out. println(dog. getName()); // B
362
+ System . out. println(dog. getObjectAddress()); // Dog@4554617c
363
+ System . out. println(dog. getName()); // A
365
364
}
366
365
367
366
private static void func (Dog dog ) {
368
- dog. setName(" B" );
367
+ System . out. println(dog. getObjectAddress()); // Dog@4554617c
368
+ dog = new Dog (" B" );
369
+ System . out. println(dog. getObjectAddress()); // Dog@74a14482
370
+ System . out. println(dog. getName()); // B
369
371
}
370
372
}
371
373
```
@@ -390,18 +392,18 @@ float f = 1.1f;
390
392
391
393
## 隐式类型转换
392
394
393
- 因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型下转型为 short 类型。
395
+ 因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型向下转型为 short 类型。
394
396
395
397
``` java
396
398
short s1 = 1 ;
397
399
// s1 = s1 + 1;
398
400
```
399
401
400
- 但是使用 += 或者 ++ 运算符可以执行隐式类型转换 。
402
+ 但是使用 += 或者 ++ 运算符会执行隐式类型转换 。
401
403
402
404
``` java
403
405
s1 += 1 ;
404
- // s1++;
406
+ s1++ ;
405
407
```
406
408
407
409
上面的语句相当于将 s1 + 1 的计算结果进行了向下转型:
@@ -428,7 +430,7 @@ switch (s) {
428
430
}
429
431
```
430
432
431
- switch 不支持 long,是因为 switch 的设计初衷是对那些只有少数的几个值进行等值判断 ,如果值过于复杂,那么还是用 if 比较合适。
433
+ switch 不支持 long,是因为 switch 的设计初衷是对那些只有少数几个值的类型进行等值判断 ,如果值过于复杂,那么还是用 if 比较合适。
432
434
433
435
``` java
434
436
// long x = 111;
0 commit comments