java中字符串常量放在哪里

Stringstr1="Hello";Stringstr2="Hello";这里str1应该等于str2,因为Hello都放在了数据区里但是如果是这种情况Stringst... String str1 = "Hello";
String str2 = "Hello";
这里str1应该等于str2,因为Hello都放在了数据区里
但是如果是这种情况
String str1 = new String("Hello");
String str2 = new String("Hello");
这里的str1和str2指向堆区中的两个对象,所以不相等,但是堆区对象中也有一个引用,那么着两个对象里的引用指向的是同一个并且存放在数据区中的那个Hello么?还是每一个对象各自引用一个Hello,如果是这样那么这个Hello又放在哪里?
展开
 我来答
风声水影泪痕
2013-05-08 · TA获得超过1万个赞
知道大有可为答主
回答量:1970
采纳率:82%
帮助的人:685万
展开全部
str1和str2分别
创建两个对象 Hello对象和str引用对象
两个必须存放在堆中
str指向堆中的Hello对象
也就是说 两个对象和str的地址全部存放在堆中

String str="abc"; * 引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中

它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的),然后查找栈中是否有"abc",若没有则将"abc"存放进栈,并令str指向"abc",若已经存在则直接令str指向"abc".(也就是说引用变量本身只能存放在堆中 它的值是所指向的字符串abc 它的地址存放在栈中) 它创建多个"abc"字符串在内存中其实只存在一个对象而已,这样有利于节省内存空间同时在一定程度上提高程序运行速度

String str=new String("abc");* 所以通过new操作符的操作都是在堆完成的

它创建两个对象 abc对象和str引用对象 两个必须存放在堆中 str指向堆中的abc对象 也就是说 两个对象和str的地址全部存放在堆中 因为使用了new操作符 所以下面的例子里str2,str3和str4即使是值都为abc因为str2的地址在栈中 str3和str4的地址各自开辟空间 所以他们的地址肯定不一样了
但是它们的值是一样的 那就是abc

String str2 = "abc";
String str3=new String ("abc");
String str4 =new String ("abc");

equals:equals就是比较值 ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!

表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
==:表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)

当equals为true时,==不一定为true;
小童鞋_成er
2013-05-08 · 知道合伙人数码行家
小童鞋_成er
知道合伙人数码行家
采纳数:4650 获赞数:22879
主要从事J2EE工作,热爱Java,用心讨论技术,共同进步。

向TA提问 私信TA
展开全部
这个是在内存中存放的地址,你必须str1.equals(str2)才可以判断的。
你可以输出地址看看,你这样比较的是两个地址,当然是false了。
第一个直接缓存 数据共享Hello,是true。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
千锋教育
2015-12-07 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
/*
 * 看程序写结果
 * 字符串如果是变量相加,先开空间,在拼接。
 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
 */
public class StringDemo4 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true

System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true
System.out.println(s3.equals("hello" + "world"));// true

// 通过反编译看源码,我们知道这里已经做好了处理。
// System.out.println(s3 == "helloworld");
// System.out.println(s3.equals("helloworld"));
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
4everlovehj
2013-05-08 · TA获得超过319个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:192万
展开全部
第一种方式首先在栈中创建一个变量 str1,str2,然后通过引用去字符串常量池中查找是否有"hello"字符串,如果没有则将"hello "字符串存入字符串常量池,并使 str1和str2 指向此常量。如果有此字符串则直接指向。
第二种方式是用new来新建对象,存放在堆中,每次调用都会新建一个对象。不会指向同一个引用对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
站住放开姐姐
2013-05-08 · TA获得超过250个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:109万
展开全部
但是堆区对象中也有一个引用,那么着两个对象里的引用指向的是同一个并且存放在数据区中的那个Hello么?
=============
不是同一个,指向的堆栈不一样

还是每一个对象各自引用一个Hello,如果是这样那么这个Hello又放在哪里?
=============
在内存里新开了一块地方存这个Hello
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式