Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是什么?
答案:7 悬赏:0 手机版
解决时间 2021-04-16 15:07
- 提问者网友:杀生予夺
- 2021-04-16 05:50
Java中String str_1="abc"; 和 String str_2=new String("def"); 的区别是什么?
最佳答案
- 五星知识达人网友:蓝房子
- 2021-04-16 07:22
1、栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方,与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
3、栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态分配内存,存取速度较慢。
2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
3、栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态分配内存,存取速度较慢。
全部回答
- 1楼网友:十鸦
- 2021-04-16 12:09
希望没错,大家指点下!
- 2楼网友:洎扰庸人
- 2021-04-16 11:46
第一个 (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()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
- 3楼网友:煞尾
- 2021-04-16 11:35
"abc"本身就是一个字符串,str_1是指向该字符串的引用;
同样的,"def"也是一个字符串,而str_2却不是指向它的引用,实质上
new String("def")却是再new了一个字符串"def",也就是说这实质上存在内容一样的两个字符串,str_2是指向第二个新建出来的那个。这些区别你完全可以看api或直接原码就能明白。
同样的,"def"也是一个字符串,而str_2却不是指向它的引用,实质上
new String("def")却是再new了一个字符串"def",也就是说这实质上存在内容一样的两个字符串,str_2是指向第二个新建出来的那个。这些区别你完全可以看api或直接原码就能明白。
- 4楼网友:摆渡翁
- 2021-04-16 10:27
String str_1="abc"; 的意思是:定义一个str 把字符串 abc赋于它 ,这个很好理解..
new String("def"); 好理解 新建 -赋值,然后 str2是新建的类的别名,别名知道撒?
new String("def"); 好理解 新建 -赋值,然后 str2是新建的类的别名,别名知道撒?
- 5楼网友:低血压的长颈鹿
- 2021-04-16 09:03
没什么区别,用起来是一样的~只是声明方式不同就想数组可以这样声明:
var a=[];
也可以这样声明:
var a=array();
对象也是:可以直接var a={};也可以var a=Object;
使用起来都是一样的,但是在内错分配上不同,前者更节省内存(但是如果少量的声明,你根本不会感觉出来内存有省很多~所以这点可以忽略~)
var a=[];
也可以这样声明:
var a=array();
对象也是:可以直接var a={};也可以var a=Object;
使用起来都是一样的,但是在内错分配上不同,前者更节省内存(但是如果少量的声明,你根本不会感觉出来内存有省很多~所以这点可以忽略~)
- 6楼网友:一叶十三刺
- 2021-04-16 08:12
你给出的两个字符串对象体现不这两种定义的区别,当然也是有区别的。
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
---------------------------------------------
先说几个概念吧
1.常量池
指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。
2.==: 比较是否是同一个对象
3.equals(): 比较的是对象里的内容
---------------------------------------------
下面我开始说区别
第1种:
String a="abc";
String b="abc";
System.out.print(a==b);
结果:true
原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。
---------------------
第2种:
String a=new String("abc");
String b=new String("abc");
System.out.print(a==b);
结果:false
原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
------------------------------
第3种
String a="abc";
String b=new String("abc");
System.out.print(a==b);
结果:false
原因:同上
---------------------------
第4种
String a="abcdef";
System.out.print(a=="abcdef");
结果:true
原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。
-------------------------------------------
第5种
String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef");
结果:false
原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。
---------------------------------------------------------------------
其它太明显的区别不在赘述。
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
---------------------------------------------
先说几个概念吧
1.常量池
指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。
2.==: 比较是否是同一个对象
3.equals(): 比较的是对象里的内容
---------------------------------------------
下面我开始说区别
第1种:
String a="abc";
String b="abc";
System.out.print(a==b);
结果:true
原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。
---------------------
第2种:
String a=new String("abc");
String b=new String("abc");
System.out.print(a==b);
结果:false
原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
------------------------------
第3种
String a="abc";
String b=new String("abc");
System.out.print(a==b);
结果:false
原因:同上
---------------------------
第4种
String a="abcdef";
System.out.print(a=="abcdef");
结果:true
原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。
-------------------------------------------
第5种
String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef");
结果:false
原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。
---------------------------------------------------------------------
其它太明显的区别不在赘述。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯