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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qq496099229 中级黑马   /  2015-5-23 18:24  /  1457 人查看  /  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,仅仅是比较内容。为什么能连接到1,设计到类型装还的问题。int可以默认转换为string。不知道这样解释对不对!
回复 使用道具 举报
前面学的都忘了。。
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:42
final String a="a";
String b=a+"f";
String c="af";

字符连接?
回复 使用道具 举报
小志的漫游 发表于 2015-5-25 16:19
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
Strin ...

又学到了点,谢谢
回复 使用道具 举报
反编译一下看看编译器是怎么优化你的代码的,,你就懂了
回复 使用道具 举报
这就是常量池的问题
回复 使用道具 举报
小志的漫游 发表于 2015-5-25 16:19
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
Strin ...

变量与常量的“+”,底层就是new StringBuffer()或是new StringBuilder()对象通过其中的append方法先将"a"追加进堆内存中,再次通过append方法把"f"也追加到"a"上来了,此时得到的是StringBufffer类型或是StringBuilder类型的"af", 再通过StringBufffer对象或StringBuilder对象中的toString方法转换String对象.这些过程都是在堆内存中进行的.
回复 使用道具 举报
小志的漫游 发表于 2015-5-25 16:19
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
Strin ...

讲得好详细,学到了
回复 使用道具 举报
楼上说的很详细 了
回复 使用道具 举报
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
楼上讲的很详细,"=="比较的是地址值,因此遇到这种题目就得看看是储存在内存中哪个空间,然后比较储存的值.变量只是一个指针而已.这是我个人的理解.
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:54
在某一次回复你的时候,我弄出来了!

刚找到你说的第三个了,第三个是final,final修饰变量就是常量,存储在常量池中,所以依然是true
回复 使用道具 举报
自动类型转换
回复 使用道具 举报
好吧,对这一块的内容我也一直弄不清楚,坐等大神详细解析
回复 使用道具 举报
齐浩 发表于 2015-5-23 19:52
没发现第三个。。。。哪有第三个。。。

在某一次回复你的时候,我弄出来了!
回复 使用道具 举报
qq496099229 发表于 2015-5-23 19:49
不是还有第三个嘛?第三个可是true呀

没发现第三个。。。。哪有第三个。。。
回复 使用道具 举报
齐浩 发表于 2015-5-23 19:46
怎么不一样?运行结果第一个true,第二个false,我解释的也是第二个false啊,,内存里存的东西不一样啊, ...

不是还有第三个嘛?第三个可是true呀
回复 使用道具 举报
齐浩 中级黑马 2015-5-23 19:46:50
9#
qq496099229 发表于 2015-5-23 19:30
这题的结果和刚刚你解释的结果不一样的呀!

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

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

这个和前面两个比较,你自己判断的结果和程序运行结果一致的话,你能解释一下嘛?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马