java中 “String+变量”的操作是在运行时进行

“String+变量”因为编译时无法进行优化(为什么无法进行优化),所以这一条语句的操作是在运行时进行的,且会产生新的对象,而不是直接从jvm的string池中获取。那么... “String+变量”因为编译时无法进行优化(为什么无法进行优化),所以这一条语句的操作是在运行时进行的,且会产生新的对象,而不是直接从jvm的string池中获取。 那么新的对象是保存在哪里呢?是堆中吗?
如下代码:
1. String a = "ab";

2. String bb = "b";

3. String b = "a" + bb;

System.out.println((a == b));
b 应该是运行时产生的新变量,它被保存在在哪里?
sorry 字打错了!最后一句,"b应该是运行时产生的新的对象,它被保存在哪里?"
展开
 我来答
匿名用户
2013-07-17
展开全部
变量名a和bb同样都是在栈区, 而其内容"ab" 和"b"是在常量池

b在栈区, 是新产生了一个新的String对象,其结果“ab”放在堆区中,即b指向的是堆里的“ab”

楼主给你疑惑的应该是==操作符, 用于String时, 他比较的是对象, 而不是对象内容.
a 和 b 是参数, 其类似于内存空间的地址, 这个地址存放的内容都是字符串"ab";
但他们不是同一个空间,而是两个不同的空间, 所以== 为false
举个例子:
酒店房间a和房间b的内部配置完成一样, 都包含ab;
但你不能说a就是b(即a==b 为false);

可是若是你在房间a上面再挂一个门牌c (即: String c=a), 这时你用a==c的结果就是true

另外若要进行优化, 建议采用StringBuffer 代替String
李晓健
2013-07-17 · TA获得超过183个赞
知道小有建树答主
回答量:293
采纳率:0%
帮助的人:193万
展开全部
字符串比较不能用== 可以用
a.equals(b);
更多追问追答
追问
谢谢!不过不是我要的答案,请就题论题
追答
这个一楼已经说了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hulibabaii
2013-07-17 · 超过46用户采纳过TA的回答
知道小有建树答主
回答量:123
采纳率:0%
帮助的人:62.2万
展开全部
同样是在jvm的池中。如果不被引用之后会 被垃圾回收
追问
可是输出结果是  false
追答
肯定是false,去看看Java核心思想,因为是地址比较。地址可以指向地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友afe836d
推荐于2018-04-11 · TA获得超过635个赞
知道小有建树答主
回答量:367
采纳率:50%
帮助的人:306万
展开全部
java中String的+运算符编译后其实是转换成了这样的代码:
3. String b = new StringBuilder().append("a").append(bb).toString();
看下StringBuilder的toString方法,使用new String(...);来构造一个String对象。

String有两种构造方法,一种是new String,在jvm堆中分配,一种是String a="ab"这种方式,这种特殊的方式过程是这样的:JVM会先在string pool中去查找是否存在"ab"这样的字符串,如果存在就把引用地址返回,如果不存在,则构造一个并把它放到string pool中。

很明显3的构造方法是使用了new来构造的,因此在jvm中的引用地址跟a肯定是不一样,你使用==来比较,比较的是它们的引用地址,它们肯定不相等,当然是false了。
追问
谢谢!你的意思就是代码中
String b = "a" + bb;
在运行中等效于
String b = new String("ab");
对吗?
追答
如果说是过程,则不能这么理解,“+”这个连接符在编译后是String b = new StringBuilder().append("a").append(bb).toString();不能说是等效。如果说都是在堆中分配这个意思的话,那就是等效的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Oo帥帥
2013-07-17 · 超过16用户采纳过TA的回答
知道答主
回答量:94
采纳率:0%
帮助的人:45.5万
展开全部
堆里!

俩字解决
追问
开始我也这样想,可是总找不到依据(哪本书里),请问你是自己判断还是在哪看到的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式