@@ -350,29 +350,37 @@ System.out.println(str2==str3);//false
350
350
351
351
** String 类型的常量池比较特殊。它的主要使用方法有两种:**
352
352
353
- - 直接使用双引号声明出来的 String 对象会直接存储在常量池中。
354
- - 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,JDK1.7之前(不包含1.7)的处理方式是在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用,JDK1.7以及之后的处理方式是在常量池中记录此字符串的引用,并返回该引用。
353
+ 1 . 直接使用双引号声明出来的 String 对象会直接存储在常量池中。
354
+ 2 . 如果不是用双引号声明的 String 对象,可以使用 String 提供的 ` intern() ` 方法。` String.intern() ` 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,JDK1.7之前(不包含1.7)的处理方式是在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用,JDK1.7 以及之后的处理方式是在常量池中记录此字符串的引用,并返回该引用。
355
+
356
+ JDK8 :
355
357
356
358
``` java
357
- String s1 = new String ( " 计算机" ) ;
358
- String s2 = s1. intern();
359
- String s3 = " 计算机" ;
360
- System . out. println(s2);// 计算机
361
- System . out. println(s1 == s2);// false,因为一个是堆内存中的 String 对象一个是常量池中的 String 对象,
362
- System . out. println(s3 == s2 );// true,因为两个都是常量池中的 String 对象
359
+ String s1 = " 计算机" ;
360
+ String s2 = s1. intern();
361
+ String s3 = " 计算机" ;
362
+ System . out. println(s2);// 计算机
363
+ System . out. println(s1. equals( s2)) ;// true
364
+ System . out. println(s3. equals(s2) );// true,因为两个都是常量池中的 String 对象
363
365
```
366
+ ` s1.equals(s2) ` 输出为 true 的原因 :
367
+
368
+ 1 . 对s1调用intern的时候,因为常量池没有对应的字面量,所以在常量池保存了一个指向s1的引用
369
+ 2 . 接下来的s2会先去常量池里找,找到对应引用,故指向堆里的s1
370
+ 3 . 故 s1==s2 为true
371
+
364
372
** 字符串拼接:**
365
373
366
374
``` java
367
- String str1 = " str" ;
368
- String str2 = " ing" ;
369
-
370
- String str3 = " str" + " ing" ;// 常量池中的对象
371
- String str4 = str1 + str2; // 在堆上创建的新的对象
372
- String str5 = " string" ;// 常量池中的对象
373
- System . out. println(str3 == str4);// false
374
- System . out. println(str3 == str5);// true
375
- System . out. println(str4 == str5);// false
375
+ String str1 = " str" ;
376
+ String str2 = " ing" ;
377
+
378
+ String str3 = " str" + " ing" ;// 常量池中的对象
379
+ String str4 = str1 + str2; // 在堆上创建的新的对象
380
+ String str5 = " string" ;// 常量池中的对象
381
+ System . out. println(str3 == str4);// false
382
+ System . out. println(str3 == str5);// true
383
+ System . out. println(str4 == str5);// false
376
384
```
377
385
![ 字符串拼接] ( ./pictures/java内存区域/字符串拼接-常量池2.png )
378
386
0 commit comments