关于String的创建,在池(pool)还是在堆中。
来源:互联网 发布:睡女神什么体验 知乎 编辑:程序博客网 时间:2024/06/05 02:53
字符串对象可以存放在两个地方,字符串池(pool)和堆
编译期确定如何给一个引用变量赋值
1)String s="abc";这种形式决定将从pool中寻找内容相同的字符串并返回地址给s,pool中没有就会在pool中新建并返回地址给s
2)String s = new String("abc");这种形式决定运行期将在堆上新建字符串对象并返回给s,但这个对象不会加入到pool中
3)String s=s1+s2;s1和s2都是变量,这种形式决定将在堆上创建s1和s2(即便s1和s2指向的对象在池中已经存在,也会将值拷贝到对象创建新对象),然后创建s1+s2并赋给s
4)String s = "ab"+"cd";同1),都是来自于池
5)String s = "ab"+s1;类似3)
6)String s = S1+S2;S1和S2是常量,常量只能赋值一次,S1,S2如果在声明的地方就赋值,那么这个值在编译期就是确定的,后面无法更改,S1+S2在执行前可确定S1/S2已经在池中存在,当然在池中进行,所以s指向pool;但是若S1,S2如果是实例常量在构造器中赋值,或是类常量在静态块中赋值,S1+S2无法确定二者皆来自于池,于是在堆上进行
所以会有以下的结果
public class Test
{
public static final String A="ab";
public static final String B="cd";
public static final String C;
public static final String D;
static{
C = "ab";
D = "cd";
}
public static void main(String[] args) {
String t = "abcd";//指向池
String s1 = "ab";//指向池
String s2 = "cd";//指向池
String s = s1+s2;//指向堆
System.out.println(s==t);//false
String ss = "ab"+s2;//指向堆
System.out.println(ss==t);//false
String sss = "ab"+"cd";//指向池
System.out.println(sss==t);//true
String ssss = A+B;//指向池
System.out.println(ssss==t);//true
System.out.println((C+D)==t);//false
}
编译期确定如何给一个引用变量赋值
1)String s="abc";这种形式决定将从pool中寻找内容相同的字符串并返回地址给s,pool中没有就会在pool中新建并返回地址给s
2)String s = new String("abc");这种形式决定运行期将在堆上新建字符串对象并返回给s,但这个对象不会加入到pool中
3)String s=s1+s2;s1和s2都是变量,这种形式决定将在堆上创建s1和s2(即便s1和s2指向的对象在池中已经存在,也会将值拷贝到对象创建新对象),然后创建s1+s2并赋给s
4)String s = "ab"+"cd";同1),都是来自于池
5)String s = "ab"+s1;类似3)
6)String s = S1+S2;S1和S2是常量,常量只能赋值一次,S1,S2如果在声明的地方就赋值,那么这个值在编译期就是确定的,后面无法更改,S1+S2在执行前可确定S1/S2已经在池中存在,当然在池中进行,所以s指向pool;但是若S1,S2如果是实例常量在构造器中赋值,或是类常量在静态块中赋值,S1+S2无法确定二者皆来自于池,于是在堆上进行
所以会有以下的结果
public class Test
{
public static final String A="ab";
public static final String B="cd";
public static final String C;
public static final String D;
static{
C = "ab";
D = "cd";
}
public static void main(String[] args) {
String t = "abcd";//指向池
String s1 = "ab";//指向池
String s2 = "cd";//指向池
String s = s1+s2;//指向堆
System.out.println(s==t);//false
String ss = "ab"+s2;//指向堆
System.out.println(ss==t);//false
String sss = "ab"+"cd";//指向池
System.out.println(sss==t);//true
String ssss = A+B;//指向池
System.out.println(ssss==t);//true
System.out.println((C+D)==t);//false
}
0 0
- 关于String的创建,在池(pool)还是在堆中。
- String存放在堆中还是栈中
- String存放在堆中还是栈中
- 函数内部的string literals:分配在堆栈还是堆中?
- 在java中String,对象,Integer(包装类型的)关于引用传递还是值传递
- Go的变量到底在堆还是栈中分配
- 关于String字符串对象的创建与管理(String pool测试)
- C++:在堆上创建对象,还是在栈上?
- 在堆中创建对象
- String在堆中不可变的真相
- c++ 局部对象指针及到底是在堆上创建的对象还是在栈上创建的?
- 请教大家:这段程序定义的三个引用,在堆中是不是其实只创建了两个String对象??
- new创建对象,对象保存在堆还是栈?
- new创建对象,对象保存在堆还是栈?
- 在Java堆中创建对象的全过程
- 关于LWIP在应用中遇到的一个问题memp_malloc: out of memory in pool TCP_PCB
- c++变量在堆中还是栈中
- 数组存储在栈中还是堆中
- List列表的运用
- 关于eclipse中同步代码报错checkout conflict with files的解决方法
- Tomcat学习之Wrapper
- svn外网更新下载代码步骤
- 解决repo init 错误 fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
- 关于String的创建,在池(pool)还是在堆中。
- 集合问题(poj)
- 回归帖
- Tomcat学习之ClassLoader
- POJ 2987 Firing (最大权闭合图)
- pat 1021. Deepest Root (25)
- 【Creator】教学视频笔记
- 传送门的一对多点传送程序
- Django新手学习总结整理记录