黑马程序员技术交流社区

标题: 你知道这是为什么吗? [打印本页]

作者: qq496099229    时间: 2015-5-23 18:24
标题: 你知道这是为什么吗?
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);
}
作者: Heroe    时间: 2015-5-23 18:39
这就要解释==和equals的区别了,==判断的内存地址
作者: 齐浩    时间: 2015-5-23 18:58
首先说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",值虽然相等,但不是相同的东西,这么说能明白吧。。。
你这标点都不对,应该不是自己写的,要是自己写的,要勤加练习了。。。。。

作者: qq496099229    时间: 2015-5-23 19:10
齐浩 发表于 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);
作者: qq496099229    时间: 2015-5-23 19:11
Heroe 发表于 2015-5-23 18:39
这就要解释==和equals的区别了,==判断的内存地址

我都还没用equals呢
作者: 齐浩    时间: 2015-5-23 19:19
qq496099229 发表于 2015-5-23 19:10
那这个呢!
final String a="a";
String b=a+"f";

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

这题的结果和刚刚你解释的结果不一样的呀!
作者: 笑面人    时间: 2015-5-23 19:38
没看懂你想问啥
作者: qq496099229    时间: 2015-5-23 19:42
笑面人 发表于 2015-5-23 19:38
没看懂你想问啥

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

这个和前面两个比较,你自己判断的结果和程序运行结果一致的话,你能解释一下嘛?
作者: 齐浩    时间: 2015-5-23 19:46
qq496099229 发表于 2015-5-23 19:30
这题的结果和刚刚你解释的结果不一样的呀!

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

不是还有第三个嘛?第三个可是true呀

作者: 齐浩    时间: 2015-5-23 19:52
qq496099229 发表于 2015-5-23 19:49
不是还有第三个嘛?第三个可是true呀

没发现第三个。。。。哪有第三个。。。
作者: qq496099229    时间: 2015-5-23 19:54
齐浩 发表于 2015-5-23 19:52
没发现第三个。。。。哪有第三个。。。

在某一次回复你的时候,我弄出来了!
作者: 黄冬    时间: 2015-5-23 21:25
好吧,对这一块的内容我也一直弄不清楚,坐等大神详细解析
作者: 914360849    时间: 2015-5-23 22:46
自动类型转换
作者: qq496099229    时间: 2015-5-23 22:52
本帖最后由 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

作者: 齐浩    时间: 2015-5-25 15:43
qq496099229 发表于 2015-5-23 19:54
在某一次回复你的时候,我弄出来了!

刚找到你说的第三个了,第三个是final,final修饰变量就是常量,存储在常量池中,所以依然是true
作者: 人在旅途~东营    时间: 2015-5-25 16:16
楼上讲的很详细,"=="比较的是地址值,因此遇到这种题目就得看看是储存在内存中哪个空间,然后比较储存的值.变量只是一个指针而已.这是我个人的理解.
作者: 小志的漫游    时间: 2015-5-25 16:19
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);
作者: mmakun    时间: 2015-5-25 16:25
楼上说的很详细 了
作者: Jeremy_Yao    时间: 2015-5-25 17:23
小志的漫游 发表于 2015-5-25 16:19
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
Strin ...

讲得好详细,学到了
作者: 小志的漫游    时间: 2015-5-25 19:15
小志的漫游 发表于 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对象.这些过程都是在堆内存中进行的.
作者: pisces    时间: 2015-5-25 19:18
这就是常量池的问题
作者: as604049322    时间: 2015-5-25 19:25
反编译一下看看编译器是怎么优化你的代码的,,你就懂了
作者: l598790586    时间: 2015-5-25 20:09
小志的漫游 发表于 2015-5-25 16:19
String a="a"+"b"+1;  //java的常量优化机制,在编译的时候自动生成ab1字符串,常量池中就有ab1字符串
Strin ...

又学到了点,谢谢
作者: 笑面人    时间: 2015-5-29 15:50
qq496099229 发表于 2015-5-23 19:42
final String a="a";
String b=a+"f";
String c="af";

字符连接?
作者: 绝版坏银    时间: 2015-5-29 15:57
前面学的都忘了。。
作者: 小车车    时间: 2015-5-29 18:33
“==”,不仅仅是内容的比较,还有内存地址的比较。equals,仅仅是比较内容。为什么能连接到1,设计到类型装还的问题。int可以默认转换为string。不知道这样解释对不对!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2