String类有一个构造方法: String(String original) 它初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。 所以说String s = new String("a"),s是一个字符串对象,而“a”也是一个字符串对象。 而String s = "a";就只创建了一个字符串对象。
明白了. 就是String类特别.以前都没注意过这问题. 以前以为Object obj = new Object() 都是在栈空间里分配一变量obj,然后obj保存的是堆空间里new出来的Object类的实例的一个引用..
jvm的stack里有指向a引用对象
String s;
s = new String("a");以上两步第一步创建了一个对象S(第一个Object),第二步给对象S赋值为“a”(第二个Object)。
正常情况是 String s = "a"; 它是有一个String对象的
现在又new了一个String 所以是2个
这是声明了一个对像,你可以对他赋值s="a";
这样只有一个对像,
那你使用了new string("a")那么对像S得到了实实例化,它引用了括号中的a,相当于给它赋值.但是这个a是S的引用,所以它也是一个对像.
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
string str2 = new String("abc")
创建了2个对象,编译期Constant Pool中创建1个,运行期heap中创建一个pool中只要有相同值的只创建一次。heap中有相同值的,在heap中都开辟内存空间,后面开辟的是指向第一个开辟的引用(即指针)另外,基本数据类型是存在stack中,对象类型是存在heap中
可以这么理解.
一个是"a",在字符串池里.
另外那个就是你new出来的s.所以是2个
堆上面有个对象
//使用简单语法创建字符串对象s1
String s1 = "JavaSE6.0";
//使用构造器创建字符串对象s2
String s2 = new String("JavaSE6.0");上面的代码中,使用new创建字符串对象的步骤如下.
(1)首先在堆(不是在常量池)中创建一个包含指定内容的字符串对象,并将字符串引用指向该对象.例如上述代码中,使用New创建字符串s2,其会直接在堆中创建一个内容为""JavaSE6.0"的字符串对象,并将引用s2指向该对象.
(2)去字符串常量池中查看,是否有包含该内容的对象.
(3)若有,则将new出来的字符串对象与字符串常量池中内容相同的对象联系起来.例如,本例中s2所指向的对象与s1所指向的联系起来.
(4)若没有,则在字符串常量池再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来.楼主理解上面就知道是怎么回事了.
String s=new String("a");
你至少知道现在使用new创建了一个对象。为什么还有一个呢,其实这是java中对String对象存储的特殊性,因为每个String对象都是不可变的,
你使用"a"来做参数,在后台jvm就会对它进行创建
对于String类型,JVM维护两个内存区域,一个是串池,一个是堆
1.对于String s=“a”,这个“a”就会在串池中开辟一个内存空间用于存放“a”(也就是创建了一个对象)
2.对于String s1=new String("a"),这种样式的都直接在对中创建对象
对于第二中情况要注意一点就是,JVM先查看“a”在串池中有没有定义过,如果定义过,串池中就不开辟空间了,就只在内存中创建对象, 反之,如果没有定义过,就先在串池中开辟空间。
总结:JVM对八大基本类型的包装类型都维护了一个串池,对于String s="a";Integer i=1;Double d=1.0d; ......为什么维护个串池呢?原因很显然,即如果多次遇到串池中有同样的值,就不用开辟新的空间了。这个串池概念还用在哪呢?目前据我所知,在连接数据库的时候,tomcat也维护了一个串池,这样就可以用有限的Connection来负责数据库连接了,就不用浪费资源了。切记一点对于new都一定会在堆中开辟空间。
String(String original)
它初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
所以说String s = new String("a"),s是一个字符串对象,而“a”也是一个字符串对象。
而String s = "a";就只创建了一个字符串对象。
就是String类特别.以前都没注意过这问题.
以前以为Object obj = new Object()
都是在栈空间里分配一变量obj,然后obj保存的是堆空间里new出来的Object类的实例的一个引用..
说的不对。
这个其实说1个或者2个感觉都不对。
我的理解是如果pool里面目前没有a这个串, 则先创建"a"的字符串, 然后把这个值赋给那个new string.
至于s其实只是一个引用, 不是真正对象。这时是创建了2个对象。
如果pool里面有a, 则直接把a的值给new string.
这时是创建1个对象。