黑马程序员技术交流社区

标题: 一个简单问题,就是想不到,关于String [打印本页]

作者: janfrost    时间: 2015-2-4 20:40
标题: 一个简单问题,就是想不到,关于String

  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.         }
复制代码
问打印结果。
想不通为什么。。唉。


作者: 田得聖老师    时间: 2015-2-4 20:45
==比较的是引用地址,比较字符串内用用equals
作者: 张_磊    时间: 2015-2-4 21:42
String字符串存在于常量池中,String a 的“heima”,是在常量池中找有没有,有的话就直接拿来用,也就是指向了MESSAGE。所以他们的地址值相同。而b+c是又造了一个String字符串,==比较地址值时返回结果为false,用(b+c).equals(MESSAGE)的返回结果就为true。(个人理解的观点)
作者: kenfine    时间: 2015-2-4 22:15
这个涉及到一个设计模式:享元设计模式。好像很复杂...{:3_62:}
作者: duxubo    时间: 2015-2-4 22:29
private final static String MESSAGE = "heima";
String a = "hei"+"ma"; 因为hei   ma  是字面常量值   在编译器编译时,就已经在class文件中写死了 和MESSSAGE他们在常量池中同为同一个值,所以为true而b+c是变量在编译期间无法确定其具体值。Java在操作b+c是其实是调用StringBuilder执行append方法完成字符串的拼接,位于字符串缓冲区
所以最后一条语句放回false
作者: duxubo    时间: 2015-2-4 22:30
是返回false   刚才打错字了  
作者: 边晓炎    时间: 2015-2-4 22:32
受教了!
作者: 邓士林    时间: 2015-2-5 16:00
并不是每个String都会创建一个对象
作者: xiao飞    时间: 2015-2-5 16:30
我记得是 在创建字符串 会先在方法去的常量池中去找是否有相同的字符串,如果没有就创建,有就不创建
作者: huangchunwei    时间: 2015-2-5 17:57
学习学习。。。
作者: 冷遇    时间: 2015-2-5 20:29
多分享,多收获,多学习!
作者: robertlu    时间: 2015-2-5 21:21
我也不是很理解
作者: 烟雾绕    时间: 2015-2-5 21:56
henhaodetiezi
作者: outsider1020    时间: 2015-2-5 22:06
学习学习。。。。。。
作者: 奔跑的猴子    时间: 2015-2-5 22:50
5楼说的很详细
作者: 610757257    时间: 2015-2-6 01:26
ture
ture
作者: Julie    时间: 2015-2-6 01:33
打印出    true和false。因为MESSAGE是静态变量,被放在方法区,对象a在创建对象之前现在方法区查找看是否有自己想要的东西,一看,已经有“heima”了,所以a就指向了这块区域,即返回true。但是(b+c)就相当于在堆中开辟了一块新的空间放“heima”,地址不相同,所以返回false
作者: Julie    时间: 2015-2-6 01:34
你再复习一下String类那部分的知识点。
作者: BEIKOU    时间: 2015-2-6 08:04
感谢分享,学习了
作者: O(∩_∩)O~wen    时间: 2015-2-6 09:03
  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分配了空间,地址也不一样
作者: 万合天宜    时间: 2015-2-6 09:50
直接看图,一目了然。






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