黑马程序员技术交流社区

标题: 为什么这两个结果都是ture?? [打印本页]

作者: yaolv7    时间: 2016-4-8 01:21
标题: 为什么这两个结果都是ture??
  1. String a = "aa";
  2.                 String b = "aa";
  3. System.out.println(a.equals(b));
  4.                 System.out.println(a==b);
  5.                
复制代码


不明白,明明一个比较内容,一个比较地址值

作者: 木辰    时间: 2016-4-8 06:12
因为String引用的字符串是final修饰的,a和b都指向同一字符串,所以都是为true
作者: 兵蜂    时间: 2016-4-8 08:38
变量a和变量b是指向同一个存储空间, 当是使用 " "直接赋值给多个变量时,这些变量是指向同一块区域的,算是一种优化
作者: 长衫造纸农_    时间: 2016-4-8 08:43
  必须是true
作者: 兵蜂    时间: 2016-4-8 08:44
变量a和变量b是指向同一个存储空间, 当是使用 " "直接赋值给多个变量时,这些变量是指向同一块区域的,算是一种优化
作者: 倚码可待    时间: 2016-4-8 09:22
内存地址和指向的对象都是一个
作者: 「AτS」    时间: 2016-4-8 10:37
String a ="aa";  //字符串常量池开始是没有这个字符串,所以创建一个,然后变量指向这个"aa"的地址
String b ="aa";  //上面一个变量已经在字符串常量池里创建了这个"aa"了,所以不会再重新创建,直接将b也指向这个"aa"
所以a和b在比较地址的时候,结果是为true!!

注意,String a = "aa";  和  String b = new String("aa"); 这两种创建方式是不一样的!!!!
String s = "abc";        //是在字符串常量池中创建一个"abc"对象
String s1 = new String("abc");        //这个是用new的方法在堆中创建一个String对象,它是在构造当中创建并接收了一个"abc"对象,总共创建两个对象。
作者: zhoubinjian    时间: 2016-4-8 10:46
楼上利害,学习了
作者: 65708535    时间: 2016-4-8 10:57
String a = "aa";                                    //a中的"aa"首先传入常量池,记录为aa
String b = "aa";                                   //b进入常量池进行匹配,如果匹配成功则不需要新创建
System.out.println(a.equals(b));        //a与b的值相等,必然为正确System.out.println(a==b);                 //地址值为同一个常量池,所以为正确
---------------------------------------------------------------------------------------
###12.05那天有详细的老师解答

作者: kcufow    时间: 2016-4-8 11:55
7楼解释的很好!
作者: lidandan    时间: 2016-4-8 12:16
都是true,很正常
作者: yaolv7    时间: 2016-4-8 18:05
「AτS」 发表于 2016-4-8 10:37
String a ="aa";  //字符串常量池开始是没有这个字符串,所以创建一个,然后变量指向这个"aa"的地址
String b ...

还有常量池这东西.......好吧,谢谢




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