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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© janfrost 初级黑马   /  2015-2-4 20:40  /  2356 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1.         private final static String MESSAGE = "heima";
  2.         public static void main(String[] args) {
  3.                 String a = "hei"+"ma";
  4.                 String b = "hei";
  5.                 String c = "ma";
  6.                 System.out.println(a==MESSAGE);
  7.                 System.out.println((b+c)==MESSAGE);
  8.         }
复制代码
问打印结果。
想不通为什么。。唉。

21 个回复

倒序浏览
==比较的是引用地址,比较字符串内用用equals
回复 使用道具 举报
String字符串存在于常量池中,String a 的“heima”,是在常量池中找有没有,有的话就直接拿来用,也就是指向了MESSAGE。所以他们的地址值相同。而b+c是又造了一个String字符串,==比较地址值时返回结果为false,用(b+c).equals(MESSAGE)的返回结果就为true。(个人理解的观点)
回复 使用道具 举报
这个涉及到一个设计模式:享元设计模式。好像很复杂...{:3_62:}
回复 使用道具 举报
private final static String MESSAGE = "heima";
String a = "hei"+"ma"; 因为hei   ma  是字面常量值   在编译器编译时,就已经在class文件中写死了 和MESSSAGE他们在常量池中同为同一个值,所以为true而b+c是变量在编译期间无法确定其具体值。Java在操作b+c是其实是调用StringBuilder执行append方法完成字符串的拼接,位于字符串缓冲区
所以最后一条语句放回false

点评

感谢  发表于 2015-2-6 13:54

评分

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

查看全部评分

回复 使用道具 举报 1 0
是返回false   刚才打错字了  
回复 使用道具 举报
边晓炎 来自手机 中级黑马 2015-2-4 22:32:27
7#
受教了!
回复 使用道具 举报
并不是每个String都会创建一个对象
回复 使用道具 举报
我记得是 在创建字符串 会先在方法去的常量池中去找是否有相同的字符串,如果没有就创建,有就不创建
回复 使用道具 举报
学习学习。。。
回复 使用道具 举报
多分享,多收获,多学习!
回复 使用道具 举报
我也不是很理解
回复 使用道具 举报
henhaodetiezi
回复 使用道具 举报
学习学习。。。。。。
回复 使用道具 举报
5楼说的很详细
回复 使用道具 举报
ture
ture
回复 使用道具 举报
打印出    true和false。因为MESSAGE是静态变量,被放在方法区,对象a在创建对象之前现在方法区查找看是否有自己想要的东西,一看,已经有“heima”了,所以a就指向了这块区域,即返回true。但是(b+c)就相当于在堆中开辟了一块新的空间放“heima”,地址不相同,所以返回false
回复 使用道具 举报
你再复习一下String类那部分的知识点。
回复 使用道具 举报
BEIKOU 来自手机 中级黑马 2015-2-6 08:04:56
19#
感谢分享,学习了
回复 使用道具 举报
  1. private final static String MESSAGE = "heima";
  2.     public static void main(String[] args) {
  3.             String a = "hei"+"ma";
  4.             String b = "hei";
  5.             String c = "ma";
  6.             System.out.println(a==MESSAGE);
  7.             System.out.println((b+c)==MESSAGE);
  8.             System.out.println((b+c).equals(MESSAGE));
复制代码

首先MESSAGE是一个常量,是存在常量池中的,a的字符串也是“heima”所以会从常量池中找到“heima"而不是自己在创建一个,因而a的地址和MESSAGE的地址是一个地址。b,c从一开始的就是各自新建了一个字符串,地址也就跟a的不一样,加完了也就相当于重新创建了一个字符串重新给这个b+c分配了空间,地址也不一样
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马