Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
e0d66394
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
e0d66394
编写于
4月 15, 2019
作者:
S
SnailClimb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 可能是把Java内存区域讲的最清楚的一篇文章.md
修改 :String 类和常量池
上级
ad946709
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
12 deletion
+15
-12
docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
+15
-12
未找到文件。
docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
浏览文件 @
e0d66394
...
...
@@ -254,16 +254,23 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
**1 String 对象的两种创建方式:**
```
java
String
str1
=
"abcd"
;
String
str2
=
new
String
(
"abcd"
);
System
.
out
.
println
(
str1
==
str2
);
//false
String
str1
=
"abcd"
;
//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后str1指向字符串常量池中的对象,如果有,则直接将str1指向"abcd"";
String
str2
=
new
String
(
"abcd"
);
//堆中创建一个新的对象
String
str3
=
new
String
(
"abcd"
);
//堆中创建一个新的对象
System
.
out
.
println
(
str1
==
str2
);
//false
System
.
out
.
println
(
str2
==
str3
);
//false
```
这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。
![](
https://user-gold-cdn.xitu.io/2018/8/22/16561e59a59c0873?w=698&h=355&f=png&s=10449
)
记住:只要使用new方法,便需要创建新的对象。
这两种不同的创建方法是有差别的。
-
第一种方式是在常量池中拿对象;
-
第二种方式是直接在堆内存空间创建一个新的对象。
记住一点:
**只要使用new方法,便需要创建新的对象。**
再给大家一个图应该更容易理解,图片来源:
<https://www.journaldev.com/797/what-is-java-string-pool>
:
![
String-Pool-Java
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3String-Pool-Java1-450x249.png
)
**2 String 类型的常量池比较特殊。它的主要使用方法有两种:**
...
...
@@ -293,9 +300,9 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
![](
https://user-gold-cdn.xitu.io/2018/8/22/16561e59a4d13f92?w=593&h=603&f=png&s=22265
)
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
### String s1 = new String("abc");这句话创建了几个对象?
### String s1 = new String("abc");这句话创建了几个
字符串
对象?
**
创建了两个
对象。**
**
将创建1或2个字符串。如果池中已存在字符串文字“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串
对象。**
**验证:**
...
...
@@ -313,10 +320,6 @@ false
true
```
**解释:**
先有字符串"abc"放入常量池,然后 new 了一份字符串"abc"放入Java堆(字符串常量"abc"在编译期就已经确定放入常量池,而 Java 堆上的"abc"是在运行期初始化阶段才确定),然后 Java 栈的 str1 指向Java堆上的"abc"。
### 8种基本类型的包装类和常量池
-
**Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录