黑马程序员技术交流社区
标题:
关于字符串String比较的疑惑
[打印本页]
作者:
韦念欣
时间:
2012-6-29 16:16
标题:
关于字符串String比较的疑惑
本帖最后由 韦念欣 于 2012-6-30 08:27 编辑
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
}
}
复制代码
程序运行结果是:
true
true
true
false
true
true
true
问题:为什么intern()方法返回的字符串和"who"比较结果为真,而直接new出来的字符串和"who"比较结果为假??
作者:
唐志兵
时间:
2012-6-29 16:21
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"))); // equals是判断内容是否相等,所以返回true
System.out.println("who" == new String("who").intern()); //调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。不难看懂吧
System.out.println("who".equals(new String("who").intern())); // 返回true
}
}
复制代码
作者:
孙浩迪
时间:
2012-6-29 16:33
本帖最后由 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()方法,会节省内存。。
作者:
谭立文
时间:
2012-6-29 18:44
哥们遇到问题了首先查一下API文档,String的itern()方法以前我也没用过。但是API里讲的还是比较清楚的。
public String intern()返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串
。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
作者:
孙飞
时间:
2012-6-30 06:25
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()相当于是同一个字符串的地址在比较,肯定为真了。
作者:
韦念欣
时间:
2012-6-30 08:26
原来intern方法是获取字符串缓冲池的内容。
谢谢大家了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2