Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是什么?
一直都未搞得清这两种定义的区别..希望能有详细说明,深入解析..在内存中是怎样存放的?堆栈中存放方式两者区别是什么?在内存中的分配是怎样的?两者有什么不同?...
一直都未搞得清这两种定义的区别..希望能有详细说明,深入解析..
在内存中是怎样存放的?堆栈中存放方式两者区别是什么?
在内存中的分配是怎样的?两者有什么不同? 展开
在内存中是怎样存放的?堆栈中存放方式两者区别是什么?
在内存中的分配是怎样的?两者有什么不同? 展开
9个回答
展开全部
String str_2=new String("def");
每次都会在字符串池中创建一个新的字符串对象。
String str_1="abc";
会重用字符串池中已有的对象
例如
假设我们用这两种方式,创建两次字符串abc
String aa="abc";
String bb=new String("abc");
String cc="abc";
String dd=new String("abc");
aa==cc //true 两个引用会指向同一个字符串
bb==dd //false 两个引用会指向各自的字符串
---------------------------------
观察下下面的程序的输出:
public class Test{
public static void main(String[] args)
{
String aa="abc";
String bb=new String("abc");
String cc="abc";
String dd=new String("abc");
if(aa==cc){
System.out.println("true");
}else{
System.out.println("false");
}
if(bb==dd){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
每次都会在字符串池中创建一个新的字符串对象。
String str_1="abc";
会重用字符串池中已有的对象
例如
假设我们用这两种方式,创建两次字符串abc
String aa="abc";
String bb=new String("abc");
String cc="abc";
String dd=new String("abc");
aa==cc //true 两个引用会指向同一个字符串
bb==dd //false 两个引用会指向各自的字符串
---------------------------------
观察下下面的程序的输出:
public class Test{
public static void main(String[] args)
{
String aa="abc";
String bb=new String("abc");
String cc="abc";
String dd=new String("abc");
if(aa==cc){
System.out.println("true");
}else{
System.out.println("false");
}
if(bb==dd){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个 (1)先定义一个名为str的对String类的对象引用变量:String str_1;
(2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
(3)将str_1指向对象o的地址。
值得注意的是,一般String类中字符串值都是直接存值的。但像String str = "abc"这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!
第二个 则不管栈中有没有存放值为"def"的地址(与new创建的不共享),都新建一个“def”对象o在堆内 其首地址存储在栈 也即str_2指向对象o的地址。
只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
(2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
(3)将str_1指向对象o的地址。
值得注意的是,一般String类中字符串值都是直接存值的。但像String str = "abc"这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!
第二个 则不管栈中有没有存放值为"def"的地址(与new创建的不共享),都新建一个“def”对象o在堆内 其首地址存储在栈 也即str_2指向对象o的地址。
只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方,与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
3、栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态分配内存,存取速度较慢。
2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
3、栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态分配内存,存取速度较慢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询