String str = "hello" ; 与 String str = new String("hello"); 有什么区别?

 我来答
ohyourdog
推荐于2018-03-01 · TA获得超过821个赞
知道小有建树答主
回答量:298
采纳率:50%
帮助的人:365万
展开全部
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.

String str = "abc ";和String str = new String( "abc ");和char[] c = { 'a ', 'b ', 'c '};String str=new String(c);都采用堆存储

String str = "abc ";在栈中如果没有存放值为 "abc "的地址,等同于:
String temp=new String( "abc ");
String str=temp;

关于String str = "abc "的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为str的对String类的对象引用变量:String str;
(2)在栈中查找有没有存放值为 "abc "的地址,如果没有,则开辟一个存放字面值为 "abc "的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为 "abc "的地址,则查找对象o,并返回o的地址。
(3)将str指向对象o的地址。

使用String str = "abc ";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String( "abc ");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

char[] c = { 'a ', 'b ', 'c '};String str=new String(c);等同于:
String str = new String( 'a '+ 'b '+ 'c ');

参考资料: csdn

flyingFish211
2011-07-18 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
String str = "hello"; 如果内存中已经为hello字符串分配了内存,那么str指向hello内存对象的地址;
String str = new String("hello"); 内存中重新分配一片内存区域存放hello, 然后str指向hello,也就是内存中实际有2个hello对象,而且存放的地址不一样。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AyumiHamasak1
2011-07-18 · 超过10用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:20万
展开全部
对于Java来说也不是100%的面向对象,很多底层原来的值类型,也并没有封装成对象.
这也是他和C#的区别.

在Java的编译器里面,你这两种写法其实是一个意思.
只是第一种写法沿用了值类型的赋值方式,(就是写着方便些,其实都一样的.)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
just_yjp
2011-07-20
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
不好意思,我也是初学者,但我觉得这个回答还是不错的:【String str = "hello"; 如果内存中已经为hello字符串分配了内存,那么str指向hello内存对象的地址;String str = new String("hello"); 内存中重新分配一片内存区域存放hello, 然后str指向hello,也就是内存中实际有2个hello对象,而且存放的地址不一样。】
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
木哈哈哈哈
2011-07-18
知道答主
回答量:28
采纳率:0%
帮助的人:19.7万
展开全部
第一个 创建了一个对象 str 内容是hello
第二个 先创建了一个匿名对象 内容是hello 然后又把这个对象给了新对象 str
第一个只创建了一个对象,第二个却创建了两个对象。
O(∩_∩)O~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式