黑马程序员技术交流社区

标题: 以下输出结果你能算对几个? [打印本页]

作者: rover0321    时间: 2014-6-22 16:57
标题: 以下输出结果你能算对几个?
本帖最后由 rover0321 于 2014-6-22 16:57 编辑

总结了一些关于String 对象引用与字符串常量比较的问题。
  1. public class StringTest
  2. {

  3.     /**
  4.      * @param args the command line arguments
  5.      */
  6.     public static void main(String[] args)
  7.     {
  8.         String a = "hello";
  9.         String b = "hello";
  10.         String newA = new String("hello");
  11.         String c = "hel";
  12.         String d = "lo";
  13.         final String finalc = "hel";
  14.         final String finalgetc = getc();

  15.         System.out.println("a == b ? " + (a == b));
  16.         System.out.println("a == newA ? " + (a == newA));
  17.         System.out.println("a == hel + lo ? " + (a == "hel" + "lo"));
  18.         System.out.println("c == finalc ? " + (a == finalc + "lo"));
  19.         System.out.println("c == finalc ? " + (a == finalgetc + "lo"));
  20.         System.out.println("a == c + d ? " + (a == c + d));
  21.         System.out.println("finalgetc == finalc ? " + (finalgetc == finalc));
  22.     }
  23.    
  24.     private static String getc()
  25.     {
  26.         return "hel";
  27.     }
  28. }
复制代码




作者: 波涛    时间: 2014-6-22 20:07
哪位给分别解释一下啊?
作者: 黎志勇    时间: 2014-6-22 20:14
求楼主解释一下。
作者: 毅心缘    时间: 2014-6-23 01:10
  1. System.out.println("c == finalc ? " + (a == finalc + "lo"));
  2.         System.out.println("c == finalc ? " + (a == finalgetc + "lo"));
复制代码



这两个结果怎么不一样呢??
作者: rover0321    时间: 2014-6-23 18:39
黎志勇 发表于 2014-6-22 20:14
求楼主解释一下。

我在以下blog做了解释
http://blog.csdn.net/rover0321/article/details/33332197
作者: rover0321    时间: 2014-6-23 19:06
毅心缘 发表于 2014-6-23 01:10
这两个结果怎么不一样呢??


我在以下blog做了解释
http://blog.csdn.net/rover0321/article/details/33332197
作者: rover0321    时间: 2014-6-23 19:12
波涛 发表于 2014-6-22 20:07
哪位给分别解释一下啊?


我在以下blog做了解释
http://blog.csdn.net/rover0321/article/details/33332197
作者: 波涛    时间: 2014-6-23 22:30
rover0321 发表于 2014-6-23 19:12
我在以下blog做了解释
http://blog.csdn.net/rover0321/article/details/33332197

页面404, 博客页面没找到!
作者: 215041631    时间: 2014-6-23 22:35
没有该页面!
作者: m313786372    时间: 2014-6-23 23:01
太神奇了……求解释。
作者: 倪大大    时间: 2014-6-24 00:04
求解释下 你这个博客打不开啊
作者: 毅心缘    时间: 2014-6-24 00:10
你的博客还没审批通过呢。看不到啊
作者: 不一样的颜色    时间: 2014-6-24 00:12
哪位给分别解释一下啊?
作者: 依然阿邦    时间: 2014-6-24 00:30
进来学习
作者: 韩天雷    时间: 2014-6-24 08:44
MARK MARK MARK
作者: java_668    时间: 2014-6-24 08:47
我来看一下....
作者: 张周飞    时间: 2014-6-25 09:39
感谢楼主 学习了,
作者: 18353666072    时间: 2014-6-25 10:00
你能解释一下==  和equals的用法么,,想知道啊
作者: 且听风语    时间: 2014-6-25 14:33
String newA = new String("hello");  
        // 1.栈内存中创建一个String类型的引用变量newA;  
        // 2.在字符串常量池中寻找有没有"hello",如果没有则在字符串常量池中创建对象  
        // 如果有则将地址直接返回对象引用。  
        // 3.通过向构造函数传递另外一个字符串对象的引用在堆中创建一个新的对象,并将地址  
        // 赋给引用变量newA。  
关于这个字符串创建问题
用创建引用类型的方法得到的字串
应该是不管 地址池中有没有这个"hello" 都会重新再去创建一个“hello”指向新的对象
根本不会到地址池中去寻找
作者: rover0321    时间: 2014-6-26 08:50
215041631 发表于 2014-6-23 22:35
没有该页面!

可以看了。
作者: rover0321    时间: 2014-6-26 08:51
18353666072 发表于 2014-6-25 10:00
你能解释一下==  和equals的用法么,,想知道啊

== 对于基本数据类型则比较数值,对于引用则比较的是它们指向的地址。
作者: rover0321    时间: 2014-6-26 08:52
毅心缘 发表于 2014-6-24 00:10
你的博客还没审批通过呢。看不到啊

可以看了。
作者: rover0321    时间: 2014-6-26 09:10
且听风语 发表于 2014-6-25 14:33
String newA = new String("hello");  
        // 1.栈内存中创建一个String类型的引用变量newA;  
      ...

我看到String类的构造函数中没有字符串类型的。所以我推断这里传递给构造函数的肯定是引用变量。
new String("hello")这半句表达式中的''hello''应该是创建在字符串常量池中。而用引用创建的新对象是在堆中的。然后将堆中的地址赋值给newA。
作者: rover0321    时间: 2014-6-26 09:11
波涛 发表于 2014-6-23 22:30
页面404, 博客页面没找到!

现在好了。
作者: 爨庚轩    时间: 2014-6-26 10:21
毅心缘 发表于 2014-6-23 01:10
这两个结果怎么不一样呢??

finalc被final修饰,相当于宏变量,在代码中出现finalc的地方可直接替换为hel,finalgetc 虽然被final修饰但是在编译时不能确定finalgetc 的值,所以finalgetc 不是宏变量,在代码中需要先执行getc()方法,得到的就不是同一个对象
作者: 不死不休眠    时间: 2014-6-26 12:08
huitiezuanbi{:3_56:}
作者: 790324255a    时间: 2014-6-26 13:31
学   习   下
作者: 辻方慑    时间: 2014-6-26 17:52
可以在这里详细解说一下 注释是一个好程序员的基本功~~~




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