A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qq496099229 中级黑马   /  2015-5-23 18:24  /  1466 人查看  /  29 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

private static void test1(){
   String a="a"+"b"+1;
   String b="ab1";
   System.out.println(a==b);
}
说对了吗?说对了还有一个
private static void test1(){
   String a="a";
   String b=a+"f";
   String c="af"
   System.out.println(c==b);
}

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

29 个回复

倒序浏览
本帖最后由 qq496099229 于 2015-5-23 22:56 编辑

好吧,我都忘记问问题了,只给了代码给大家,。话题的两个代码,
外加这个
final String a="a";
String b=a+"f";
String c="af";
System.out.println(b==c);

总共三个代码,希望懂的人给大家解释一下这三个结果的由来。。。。。结果是true,false,true
回复 使用道具 举报
这就要解释==和equals的区别了,==判断的内存地址
回复 使用道具 举报 0 1
首先说String和任何数据相加都会是String类型的
其次,第一个是
String a="a"+"b"+1;
String b="ab1";
这个都是在栈中开辟空间的时候,内存空间里都是ab1,
第二个是
String a="a";
String b=a+"f";
String c="af";
在栈中开辟了a,然后在栈中开辟了b,b的空间里存的是a的地址和"f",打印b肯定是af,但是c的栈中空间里存储的是"af",值虽然相等,但不是相同的东西,这么说能明白吧。。。
你这标点都不对,应该不是自己写的,要是自己写的,要勤加练习了。。。。。
回复 使用道具 举报
齐浩 发表于 2015-5-23 18:58
首先说String和任何数据相加都会是String类型的
其次,第一个是
String a="a"+"b"+1;

那这个呢!:dizzy:
final String a="a";
String b=a+"f";
String c="af";
System.out.println(b==c);
回复 使用道具 举报
Heroe 发表于 2015-5-23 18:39
这就要解释==和equals的区别了,==判断的内存地址

我都还没用equals呢
回复 使用道具 举报
齐浩 中级黑马 2015-5-23 19:19:06
7#
qq496099229 发表于 2015-5-23 19:10
那这个呢!
final String a="a";
String b=a+"f";

我不是解释这个了吗???a的地址+f。。打印时调取引用会打印出af,但是他自己的内存里是:a的地址值+"f"
回复 使用道具 举报
齐浩 发表于 2015-5-23 19:19
我不是解释这个了吗???a的地址+f。。打印时调取引用会打印出af,但是他自己的内存里是:a的地址值+"f" ...

这题的结果和刚刚你解释的结果不一样的呀!
回复 使用道具 举报
没看懂你想问啥
回复 使用道具 举报

final String a="a";
String b=a+"f";
String c="af";
System.out.println(b==c);

这个和前面两个比较,你自己判断的结果和程序运行结果一致的话,你能解释一下嘛?
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:30
这题的结果和刚刚你解释的结果不一样的呀!

怎么不一样?运行结果第一个true,第二个false,我解释的也是第二个false啊,,内存里存的东西不一样啊,肯定是false。。。。内存这块你是不是不懂啊。。。java内存分多少块??字节码的加过程是什么???
一个题会牵扯出许多问题。。。
回复 使用道具 举报
齐浩 发表于 2015-5-23 19:46
怎么不一样?运行结果第一个true,第二个false,我解释的也是第二个false啊,,内存里存的东西不一样啊, ...

不是还有第三个嘛?第三个可是true呀
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:49
不是还有第三个嘛?第三个可是true呀

没发现第三个。。。。哪有第三个。。。
回复 使用道具 举报
齐浩 发表于 2015-5-23 19:52
没发现第三个。。。。哪有第三个。。。

在某一次回复你的时候,我弄出来了!
回复 使用道具 举报
好吧,对这一块的内容我也一直弄不清楚,坐等大神详细解析
回复 使用道具 举报
自动类型转换
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:54
在某一次回复你的时候,我弄出来了!

刚找到你说的第三个了,第三个是final,final修饰变量就是常量,存储在常量池中,所以依然是true
回复 使用道具 举报
楼上讲的很详细,"=="比较的是地址值,因此遇到这种题目就得看看是储存在内存中哪个空间,然后比较储存的值.变量只是一个指针而已.这是我个人的理解.
回复 使用道具 举报
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
String b="ab1"; //常量池中已经有,就不需要再创建, 两个引用指向同一个对象.  所以为true
-------------------------------------------
第二个是
String a="a";   //常量池中生成
String b=a+"f";  //变量与常量的"+",是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。是             在堆内存中创建成的.
String c="af";//常量池中生成.  两个引用指向的地址不同,所以b==c 为false
----------------------------------------------------
final String a="a";  //final修饰为常量
String b=a+"f";  //常量相加,常量的优化机制,在编译的时候自动生成"af",常量池中就有字符串af
String c="af"; //常量池中已有,就不需要再创建,两个引用指向同一个地址  所以为true
System.out.println(b==c);

点评

非常棒  发表于 2015-5-29 19:44
不太明白变量与常量的“+”,是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。是 在堆内存中创建成的,可以详细说明下吗?  发表于 2015-5-25 18:38
回复 使用道具 举报 3 0
楼上说的很详细 了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马