String s = new String("xyz");创建了几个对象?
下面说法正确吗?创建String 有两个方法
1,String a = "xyz"
2,String a = new String("xyz")为了提高效率,JVM 有个 String constant pool 的东东,先命名为scp
当用第一种方法创建 String 时,首先在这个scp里找,
看有没有现成的"xyz",如果有,就直接把 a 指向它,如果
没有,就在scp 里面创建一个,然后把 a 指向它。
当用第二种方法创建String 时,用正常的方法在 heap 中创建一个
"xyz" .然后再创建一个 "xyz" 放到 scp 里,以备使用。
(scp 与 heap 是两个不同的内存区域)
下面说法正确吗?创建String 有两个方法
1,String a = "xyz"
2,String a = new String("xyz")为了提高效率,JVM 有个 String constant pool 的东东,先命名为scp
当用第一种方法创建 String 时,首先在这个scp里找,
看有没有现成的"xyz",如果有,就直接把 a 指向它,如果
没有,就在scp 里面创建一个,然后把 a 指向它。
当用第二种方法创建String 时,用正常的方法在 heap 中创建一个
"xyz" .然后再创建一个 "xyz" 放到 scp 里,以备使用。
(scp 与 heap 是两个不同的内存区域)
解决方案 »
- Java Socket SecurityManager
- 关于JInternalFrame的问题,之前点击的JInternalFrame总是会覆盖后来点击的
- 一个最简单的java问题
- 请高手解释一下
- 请教关于paintComponent()的问题
- help!!
- 如何判断String为空?
- 问:如何将byte数据以16进制形式表示?
- "java打工最容易(好像招聘兼职的都盯着java 我是指学生)" 这句话是真是假? 来者有分分分分..........................
- 请教两个字符串处理问题?
- Java中return关键字的用法,最好有小例子,谢啦~~~~~
- 求助 Java char类型
类加载时,"xyz"就被读入并在常量池创建了,
然后调用到new String("xyz")的时候,就在堆上创建new String("xyz")所以是2个对象。。-----------------------------------------------------------------其实常量池是属于类的内容,所以在加载的时候也是创建在堆上的,
所以其实常量池的内容应该也是存在于堆上的。简单的说,堆上用来存放 所有new出来的对象。
栈则多是存放存放 基本类型的变量数据和对象的引用
String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
换句话说,新创建的字符串是该参数字符串的副本。
String str2 = new String("xyz");
String s1 = "xyz";
String s2 = "xyz";System.out.println(s1==s2); 返回true
System.out.println(str1==str2); 返回false
从内存上来说
后者 栈空间分配内存给s
栈空间分配内存给字符串"xyz"
s指向"xyz"前者是 栈空间分配内存给str
堆new了一个对象 值为空
对象赋值"xyz"
s指向string对象不知道我理解的对不?
2,String a = new String("xyz") 两个
1.寄存器 (不能直接控制)2。堆栈 (存放临时变量和对象引用,函数参数,基本数据类型)3。堆(heap区,对象) 4。静态存储区(静态变量) 5。常量存储区 6。非静态存储区(流持久化和序列化对象,存活于程序外,如磁盘等)
其次:程序加载时String s =“abc”会先在常量池中查找时否存在字符串,若有将s指向他,若无在常量池中创建 并s指向它
String s = new String("abc")在会先在常量池中查找是否存在"abc“字符串,如果存在,则直接在heap区创建其引用,否则会先在常量池中创建字符串"abc",再在heap区上创建“abc”的引用
再次:对于 String s = new String("abc") 程序会再在堆栈上创建 s,并将s指向heap区中的引用,而heap区指向常量池。
对于常量池,不同jvm分配不同的大小 以下可以测试jdk1.6
public class Test
{
public static void main(String[] args){
Integer i1=1;
Integer i2=1;
System.out.println(i1==i2);
Integer i3=128;
Integer i4=128;
System.out.println(i3==i4);
}
}