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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hacker◊紫猫 中级黑马   /  2014-10-8 22:52  /  1432 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

System.out.println(“abc”==”ab”+”c”);   打印为 true
*********************************************
String s3 = “你好吗”;
   String s4 =”你”;
   String s5 =”好吗”;
   System.out.println(s3==(s4+s5))  打印为 false
为什么啊?这俩不一样的吗?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

9 个回复

倒序浏览
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
回复 使用道具 举报 1 0
wtjohn 发表于 2014-10-8 23:08
==比较的是2个对象的地址,而equals比较的是2个对象的内容。

我感觉,应该就是这个问题
回复 使用道具 举报
string是引用数据类型,==会比较地址
回复 使用道具 举报
ystem.out.println(“abc”==”ab”+”c”);   打印为 true
这是编译器处理后的结果,"ab"+"c"在编译器看来就是“abc”,就给你进行运算了也就是运行时打印的是“abc”==“abc”所以是true
*********************************************
String s3 = “你好吗”;
   String s4 =”你”;
   String s5 =”好吗”;
   System.out.println(s3==(s4+s5))  打印为 false
因为s4和s5是两个引用,具体的指向不清楚,所以编译器不去计算的(要是这也计算那就不需要运行了~)s4+s5在运行的时候会产生一个新的字符串(s4+s5的结果需要一个地址来存储,这个地址就是新字符串的地址了),这个字符串的地址和s3进行比较当然是false
回复 使用道具 举报
笑脸迷人 发表于 2014-10-9 11:41
ystem.out.println(“abc”==”ab”+”c”);   打印为 true
这是编译器处理后的结果,"ab"+"c"在编译器看来 ...

反编译试了一下,第一句编译后直接就成了“System.out.println(true);”"abc"、"ab"、"c"三个字符串一点影子都没有了。
回复 使用道具 举报
我觉得会不会是因为中文和英文的地址有出入
回复 使用道具 举报
英文字符串是简单字符,字符转常量缓存池会对他们进行缓存,但汉字比较复杂,不进行缓存,更不会根据内容是否相等来确定字符串常量的唯一性,内存中可以出现多个内容相同的汉字字符串常量,即是上面出现的情况,引用的地址不相同
回复 使用道具 举报
==无法比较字符串的,因为==比较的是地址值。在java基础中比较字符串可以使用equals()方法,这个方法是String类提供来比较字符串是否相等的方法。
回复 使用道具 举报
杜庆娇 发表于 2014-10-9 08:53
我感觉,应该就是这个问题

不是应该,确实是这样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马