厚颜无耻的复制下
方式一:String a = “aaa” ;
方式二:String b = new String(“aaa”);
两种方式都能创建字符串对象,但方式一要比方式二更优。
因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。
常量池中已经有字符串常量”aaa”
通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a。
通过方式二创建对象,无论常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间存放新对象。
常量池中没有字符串常量”aaa”
通过方式一创建对象,程序运行时会将”aaa”字符串放进常量池,再将其地址赋给a。
通过方式二创建对象,程序会在堆内存中开辟一片新空间存放新对象,同时会将”aaa”字符串放入常量池,相当于创建了两个对象。
不是吧,不用new应该存储在常量池中吧!
追答String s = "1";
s是对对象的引用,所以存放在栈中
"1" 字符串变量存放在变量池中
String s = new String("1")
s ==> 栈
new String("1") ==> new出来的对象存放在堆中
存放在堆中的同时在常量池中也会存在吧?
追答常量池(constant pool) 指的是在编译期间被确定、并被保存在已编译的.class文件中的一些数据,它包括了关于类,方法,接口中的常量,也包括字符串常量
用 new String() 创建的字符串不是常量,不能再编译期间就确定,所以new String() 创建的字符串不会放入常量池中,它们有自己的地址空间
那我看李刚那本书里是这样说的╭(╯ε╰)╮
追答好巧 我也看的他的书 你看的第几版
可能上面说的不对
网上很多人说的都不一样,可能并不正确,不过我觉得这种有道理:
http://blog.csdn.net/sureyonder/article/details/5569366
可以参考下
public class TestString{我测试结果应该是 new 对象的常量字符串保存在常量池中了 ...
追问第二版
我想问一下Java通过new String创建字符串会被保存都常量池中吗???
因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。常量池中已经有字符串常量”aaa”通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a。通过方式二创建对象,无论常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间...
java中String类型存储位置
一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。二、通过字面量赋值创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;...
java new一个string为什么也会在常量池中新建对象
第二条语句,创建str2句柄,因为是new的对象,所以需要在堆中创建String对象,而"hello"是字面量,存在于常量池,所以直接传常量池中"hello"对象的地址给string构造器来创建新的string。建议你去网上搜索一下java8新特性中的String常量池看看,里面有各种情况下的String存储方式。
java中String new和直接赋值的区别
String str1="ABC" 可能创建一个对象或者不创建对象,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").如果已经存在,str1直接reference to 这个String池里的对象。String str2 = new String("ABC") 至少创建一个对象,也可能两个。因为用到new 关键...
Java 中 String 字符串可以有多长?65535?
Java中String字符串的长度受到存储位置和数据类型限制。当存储在字符串常量池中时,由于使用u2数据类型,其最大长度为65535个字符。然而,当通过new关键字创建String对象,即在堆内存中存储时,其长度受限于char数组,理论上最大值为Integer.MAX_VALUE(0x7fffffff),但实际上,由于虚拟机内存限制和预留,...
String s = new String("abc");在内存中有几个对象?
String("abc"),就只新加了一个对象,如果之前没有abc字符串,那就要先存在常量池区,然后才生成s对象 所以要创建两个对象 按你的问题, 内存中肯定会有两个对象, 三块内存分配: 分别是 s 这个变量在栈中的内存空间 abc 常量池区内存 new String("abc") 这个 s变量指向的对象内存 ...
String类及字符串常量池的学习
String 是Java编程中基础类之一,用于表示字符串类型。它与字符串常量池(String Pool)关系密切,这是JVM规范中方法区上存储字符串的一种特殊区域,用于优化字符串存储。在JDK7及以后版本,字符串常量池被移到了堆空间。String的创建有直接字面量赋值和通过new关键字两种方式。字面量赋值方式下,编译后...
java中成员变量都储存在栈内存中吗
常量池存在于堆中。代码段:用来存放从硬盘上读取的源程序代码。数据段:用来存放static定义的静态成员。对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String s = new String("william");会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。再如 String s1 = new ...
String 和 new String的区别
1、创建的字符串变量在内存中的区别。两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str...
java字符串问题
String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。看例2:String s0=”kvill”;String s1=new String(”kvill”);String s2=”kv” + new String(“ill”);System.out.println(s0==s1 );System.out.println(s0==...