java 代码
2. Stirng str2 = "abc";
java 代码
2.
3. //jvm 在strings pool中找不到值为“abc”的字符串,因此
4. //在堆上创建一个String对象,并将该对象的引用加入至strings pool中
5. //此时堆上有两个String对象
6. Stirng str2 = "abc";
7.
8. if(str1 == str2){
9. System.out.println("str1 == str2");
10. }else{
11. System.out.println("str1 != str2");
12. }
13. //打印结果是 str1 != str2,因为它们是堆上两个不同的对象
14.
15. String str3 = "abc";
16. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
17. //因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用
18. if(str2 == str3){
19. System.out.println("str2 == str3");
20. }else{
21. System.out.println("str2 != str3");
22. }
23. //打印结果为 str2 == str3
java 代码
2.
3. str1 = str1.intern();
4. //程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool
5. //有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至
6. //strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会
7. //被GC收集。
8.
9. //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”
10. //因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,
11. //此时,堆上的有效对象只有一个。
12. Stirng str2 = "abc";
13.
14. if(str1 == str2){
15. System.out.println("str1 == str2");
16. }else{
17. System.out.println("str1 != str2");
18. }
19. //打印结果是 str1 == str2
20.
二、串接(Concatenation)。
不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示 65536个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。
Java代码 复制代码
2. public static void main(String[] args) {
3. String str1 = new String("abc");
4.
5. String str2 = "abc";
6.
7. if (str1 == str2) {
8. System.out.println("str1 == str2");
9. } else {
10. System.out.println("str1 != str2");
11. }
12.
13. String str3 = "abc";
14. if (str2 == str3) {
15. System.out.println("str2 == str3");
16. } else {
17. System.out.println("str2 != str3");
18. }
19.
20. str1 = str1.intern();
21.
22. if (str1 == str2) {
23. System.out.println("str1 == str2");
24. } else {
25. System.out.println("str1 != str2");
26. }
27.
28. String str4 = new String("abc");
29. str4 = str4.intern();
30.
31. if (str1 == str4) {
32. System.out.println("str1 == str4");
33. } else {
34. System.out.println("str1 != str4");
35. }
36. }
37.
38. }
运行结果:
str2 == str3
str1 == str2
str1 == str4
看看运行结果后,给出我自己的理解说明:
















