forked from JavaDevTeam/notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjava-lang-String.java
More file actions
48 lines (37 loc) · 1.67 KB
/
java-lang-String.java
File metadata and controls
48 lines (37 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
------------------------
String |
------------------------
# 字符串
------------------------
静态方法 |
------------------------
String format(String format, Object... args)
# 格式化指定的字符串
------------------------
实例方法 |
------------------------
native String intern();
* 返回常量池中的某字符串,如果常量池中已经存在该字符串,则返回常量池中该对象的引用
* 否则
* JDK6及其以前是, 先复制到字符串池, 然后返回字符串池中的字符串引用
* JDK7及其以后是, 只在字符串池中记录该字符串对象第一次出现的引用, 然后返回(jdk1.7之后, 常量池不仅仅可以存储对象, 还可以存储对象的引用, 会直接将字符串的地址存储在常量池)
// 1.1在堆中创建"1"字符串对象
// 1.2字符串常量池引用"1"字符串对象
// 1.3s引用指向堆中"1"字符串对象
String s = new String("1");
// 2. 发现字符串常量池中已经存在"1"字符串对象,直接返回字符串常量池中对堆的引用(但没有接收)-->s引用还是指向着堆中的对象
s.intern();
// 3. 发现字符串常量池已经保存了该对象的引用了,直接返回字符串常量池对堆中字符串的引用
String s2 = "1";
// 4. s指向的是堆中对象的引用,s2指向的是在字符串常量池对堆中对象的引用
System.out.println(s == s2);// false
---------------------------------------------
// 1. 在堆中首先创建了两个“1”对象
// 1.1 +号运算符解析成stringBuilder,最后toString(),最终在堆中创建出"11"对象
// 1.2 注意:此时"11"对象并没有在字符串常量池中保存引用
String s3 = new String("1") + new String("1");
// 2. 发现"11"对象并没有在字符串常量池中存在,于是将"11"对象在字符串常量池中保存当前字符串的引用,并返回当前字符串的引用
s3.intern();
// 3. 发现字符串常量池已经存在引用了,直接返回(拿到的也是与s3相同指向的引用)
String s4 = "11";
System.out.println(s3 == s4); // true