Java中 String字符串内存分配问题
Strings1="abc";Strings="abc"+s1+"def";请问在内存中一共有几个对象,为什么?Strings=newString("abc")+s1+n...
String s1 = "abc";
String s ="abc"+s1+"def";
请问在内存中一共有几个对象,为什么?
String s = new String("abc")+s1+new String("def");
除了s1变量中的String对象外,又创建了两个String对象并放入池中。
"abc"已经在String pool里面了,在执行 String s = "abc"+s1+def;的时候"abc"应该在String pool里直接去拿,而不应该是再次创建吧。
谁能解释一下String s = "abc"; 与String s = new String("abc");之间内存的分配情况,当然前者创建一个对象,后者是创建两个对象。 展开
String s ="abc"+s1+"def";
请问在内存中一共有几个对象,为什么?
String s = new String("abc")+s1+new String("def");
除了s1变量中的String对象外,又创建了两个String对象并放入池中。
"abc"已经在String pool里面了,在执行 String s = "abc"+s1+def;的时候"abc"应该在String pool里直接去拿,而不应该是再次创建吧。
谁能解释一下String s = "abc"; 与String s = new String("abc");之间内存的分配情况,当然前者创建一个对象,后者是创建两个对象。 展开
5个回答
展开全部
jvm中有个String pool,一般在池中有的对象就不会再去生成一个新的。
String s1 = "abc";
生成了一个字符串对象"abc"并放入pool中,定义了一个String变量s1并指向"abc"。
String s = "abc" + s1 + "def";
等式右边有三个String 对象 "abc" 、s1 、"def"
这里("abc"==s1)是true,就是说是引用的同一个内存地址。
"abc"已经在池中了,直接从池中取出来,这句又创建了一个"def"的String对象并放入池中。
当前二个String对象做连接的时候,又会创建一个新的String对象"abcabc",并放入池中;然后再做字符串相加"abcabc"+def又生成一个字串对象,最后变量s指向这个新的String对象。
所以用+来连接字串会产生很多临时的字串对象,效率低。一般使用StringBuffer或StringBuilder来做字串连接。
可以使用new String()来生成一个新的String对象并单独分配内存空间。
------------------------------------------------------
查了下资料,已经改了回答内容。
String s = "abc";
这句是定义一个String变量s,jvm会先去字符串池中找有没有"abc",有的话就把s指向"abc",没有就会先在池中创建一个,再让s指向"abc"。
String s = new String("abc");
这句是先定义一个String变量s,然后在内存中分配新的空间"abc"再让s指向这个内存地址。
String s1 = "abc";
生成了一个字符串对象"abc"并放入pool中,定义了一个String变量s1并指向"abc"。
String s = "abc" + s1 + "def";
等式右边有三个String 对象 "abc" 、s1 、"def"
这里("abc"==s1)是true,就是说是引用的同一个内存地址。
"abc"已经在池中了,直接从池中取出来,这句又创建了一个"def"的String对象并放入池中。
当前二个String对象做连接的时候,又会创建一个新的String对象"abcabc",并放入池中;然后再做字符串相加"abcabc"+def又生成一个字串对象,最后变量s指向这个新的String对象。
所以用+来连接字串会产生很多临时的字串对象,效率低。一般使用StringBuffer或StringBuilder来做字串连接。
可以使用new String()来生成一个新的String对象并单独分配内存空间。
------------------------------------------------------
查了下资料,已经改了回答内容。
String s = "abc";
这句是定义一个String变量s,jvm会先去字符串池中找有没有"abc",有的话就把s指向"abc",没有就会先在池中创建一个,再让s指向"abc"。
String s = new String("abc");
这句是先定义一个String变量s,然后在内存中分配新的空间"abc"再让s指向这个内存地址。
展开全部
3个对象。"abc" "def" "abcabcdef"
new String("abc");实际上是先在String pool里面申明一个abc的String,然后new String()就是说强行申请一个内存空间,就像是普通的类型的实例一样,而不是指向String pool 的内存地址。
而String s = "abc";是申请一个对象,是在String 的pool里面。s也指向的是这个内存地址。
new String("abc");实际上是先在String pool里面申明一个abc的String,然后new String()就是说强行申请一个内存空间,就像是普通的类型的实例一样,而不是指向String pool 的内存地址。
而String s = "abc";是申请一个对象,是在String 的pool里面。s也指向的是这个内存地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
3个
abc
def
abcabcdef
你没有使用new , 所有相同的字符串内容就是同一个对象
当使用一个new,就是一个新对象
abc
def
abcabcdef
你没有使用new , 所有相同的字符串内容就是同一个对象
当使用一个new,就是一个新对象
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-08-30
展开全部
因为答案修改次数限制,只好用匿名说明下了。
String s = new String("abc");
"abc"本身就是String对象,对于这个对象,jvm会按字符串池的规律来处理。
使用new关键字的,jvm会单独分配内存空间。
by pensiero.
String s = new String("abc");
"abc"本身就是String对象,对于这个对象,jvm会按字符串池的规律来处理。
使用new关键字的,jvm会单独分配内存空间。
by pensiero.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符串"abc"只会创建一次。
而String,每次都会创建一次。
所以二次出现"abc",实际上是同一个对象。
后来又出现"def"是另一个对象。
s1是一个对象,s2也是一个对象。
谁能解释一下String s = "abc"; 与String s = new String("abc");之间内存的分配情况,当然前者创建一个对象,后者是创建两个对象。
这种说法本来就是错误的。如果"abc"在之前没有被定义过,那么这两种方式都将产生两个对象。如果"abc"在之前被定义过,那么两种都只产生一个对象。
而String,每次都会创建一次。
所以二次出现"abc",实际上是同一个对象。
后来又出现"def"是另一个对象。
s1是一个对象,s2也是一个对象。
谁能解释一下String s = "abc"; 与String s = new String("abc");之间内存的分配情况,当然前者创建一个对象,后者是创建两个对象。
这种说法本来就是错误的。如果"abc"在之前没有被定义过,那么这两种方式都将产生两个对象。如果"abc"在之前被定义过,那么两种都只产生一个对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询