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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韦念欣 黑马帝   /  2012-6-29 16:16  /  2810 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韦念欣 于 2012-6-30 08:27 编辑
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s = "who";
  6.                 System.out.println("who" == s);                                                 // 返回true
  7.                 System.out.println("who".equals(s));                                           // 返回true

  8.                 System.out.println("who" == "who");                                         // 返回true
  9.                 System.out.println("who" == new String("who"));                      // 返回flase
  10.                 System.out.println("who".equals(new String("who")));                 // 返回true

  11.                 System.out.println("who" == new String("who").intern());          // 返回true,为什么这个返回的是true????
  12.                 System.out.println("who".equals(new String("who").intern()));    // 返回true
  13.         }
  14. }
复制代码
程序运行结果是:
true
true
true
false
true
true
true


问题:为什么intern()方法返回的字符串和"who"比较结果为真,而直接new出来的字符串和"who"比较结果为假??


5 个回复

倒序浏览
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s = "who";   
  6.                 System.out.println("who" == s);                   //判断内存地址是否相等,这里肯定相等    返回true
  7.                 System.out.println("who".equals(s));              //判断对象内容是否相等,这里相等  返回true

  8.                 System.out.println("who" == "who");                                            // 返回true
  9.                 System.out.println("who" == new String("who"));        //两个不同的对象,内存地址肯定不同                // 返回flase
  10.                 System.out.println("who".equals(new String("who")));         // equals是判断内容是否相等,所以返回true

  11.                 System.out.println("who" == new String("who").intern());          //调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。不难看懂吧
  12.                 System.out.println("who".equals(new String("who").intern()));   // 返回true
  13.         }
  14. }
复制代码
回复 使用道具 举报
本帖最后由 sunhaodi 于 2012-6-29 16:38 编辑

class Demo
{
        public static void main(String[] args)
        {
                String s = "who";
                System.out.println("who" == s);                                                 // 返回true
                System.out.println("who".equals(s));                                           // 返回true

                System.out.println("who" == "who");                                         // 返回true
                System.out.println("who" == new String("who"));                      // 返回flase
                System.out.println("who".equals(new String("who")));                 // 返回true

                System.out.println("who" == new String("who").intern());          // 返回true,为什么这个返回的是true????
                System.out.println("who".equals(new String("who").intern()));    // 返回true
        }
}

  String s1 = "who";
  String s2 = "who";

  s1== s2   这个应该是true吧   为什么是true呢?

程序在运行的时候会创建一个字符串缓冲池

当使用 s2 = "Who" 这样的表达是创建字符串的时候,程序首先会

在这个String缓冲池中寻找相同值的对象,s1先被将 s2 引用 s1 所引用的对象"Who"
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
  String s3 = new String("Who");
如果  s1==s3  肯定是false了  因为这个newString  是明确告诉你我要创建个新的。
Stirng s4=new String("Who").intern();
  String s1 = "Who";
为什么 s4==s1 true呢?  调用这个intern()方法之后又将s4打入字符缓冲池里了
所以会返回true;    调用intern()方法,会节省内存。。





评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
哥们遇到问题了首先查一下API文档,String的itern()方法以前我也没用过。但是API里讲的还是比较清楚的。
public String intern()返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
java虚拟机中存在一个字符串池,里面存在很多String对象,并且可以共享,并且把相同的字符常量合并。你第一句String s = "who";是把字符池中"who"的地址指向s,s就是一个引用变量,存在栈内存中,存储的是一个地址。第二句中的==是比较两个对象的引用地址,因为s的地址就是"who"的地址,所以返回true。System.out.println("who".equals(s));是比较对象的内容,都是who所以相等。其它的也没什么问题,咱说你的疑问吧,你如果直接new出来一个对象,虽然和"who"内容是相同的,但它是相当于在堆内存中新开辟了一块空间,有自己的地址,和"who"并不是一个相同的地址引用,所以==比较地址时返回false。但是当你new出来的对象调用intern方法时,会把你new出来的对象的内容和"who"的内容做一个比较,为真时,它会返回池中已存在 的字符串,所以"who" == new String("who").intern()相当于是同一个字符串的地址在比较,肯定为真了。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
原来intern方法是获取字符串缓冲池的内容。
谢谢大家了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马