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

© rover0321 中级黑马   /  2014-6-22 16:57  /  4750 人查看  /  29 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码



单选投票, 共有 23 人参与投票
您所在的用户组没有投票权限

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

29 个回复

正序浏览
可以在这里详细解说一下 注释是一个好程序员的基本功~~~
回复 使用道具 举报
学   习   下
回复 使用道具 举报
huitiezuanbi{:3_56:}
回复 使用道具 举报
毅心缘 发表于 2014-6-23 01:10
这两个结果怎么不一样呢??

finalc被final修饰,相当于宏变量,在代码中出现finalc的地方可直接替换为hel,finalgetc 虽然被final修饰但是在编译时不能确定finalgetc 的值,所以finalgetc 不是宏变量,在代码中需要先执行getc()方法,得到的就不是同一个对象
回复 使用道具 举报
波涛 发表于 2014-6-23 22:30
页面404, 博客页面没找到!

现在好了。
回复 使用道具 举报
且听风语 发表于 2014-6-25 14:33
String newA = new String("hello");  
        // 1.栈内存中创建一个String类型的引用变量newA;  
      ...

我看到String类的构造函数中没有字符串类型的。所以我推断这里传递给构造函数的肯定是引用变量。
new String("hello")这半句表达式中的''hello''应该是创建在字符串常量池中。而用引用创建的新对象是在堆中的。然后将堆中的地址赋值给newA。
回复 使用道具 举报
毅心缘 发表于 2014-6-24 00:10
你的博客还没审批通过呢。看不到啊

可以看了。
回复 使用道具 举报
18353666072 发表于 2014-6-25 10:00
你能解释一下==  和equals的用法么,,想知道啊

== 对于基本数据类型则比较数值,对于引用则比较的是它们指向的地址。
回复 使用道具 举报

可以看了。
回复 使用道具 举报
String newA = new String("hello");  
        // 1.栈内存中创建一个String类型的引用变量newA;  
        // 2.在字符串常量池中寻找有没有"hello",如果没有则在字符串常量池中创建对象  
        // 如果有则将地址直接返回对象引用。  
        // 3.通过向构造函数传递另外一个字符串对象的引用在堆中创建一个新的对象,并将地址  
        // 赋给引用变量newA。  
关于这个字符串创建问题
用创建引用类型的方法得到的字串
应该是不管 地址池中有没有这个"hello" 都会重新再去创建一个“hello”指向新的对象
根本不会到地址池中去寻找
回复 使用道具 举报
你能解释一下==  和equals的用法么,,想知道啊
回复 使用道具 举报
感谢楼主 学习了,
回复 使用道具 举报
我来看一下....
回复 使用道具 举报
MARK MARK MARK
回复 使用道具 举报
进来学习
回复 使用道具 举报
哪位给分别解释一下啊?
回复 使用道具 举报
你的博客还没审批通过呢。看不到啊
回复 使用道具 举报
求解释下 你这个博客打不开啊
回复 使用道具 举报
太神奇了……求解释。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马