您所在的位置:开发 > Java > Java常量字符串String理解

Java常量字符串String理解

2007-11-14 18:29 重剑无锋 Csdn博客 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

本文给出了除了以前关于String的理解的三点外,关于String类的类在机制的内在探究,并配有一个实例问题的解答,供大家参考!

AD:

【引自重剑无锋的博客】以前关于String的理解仅限于三点:

1、String是final类,不可继承;
2、String类比较字符串相等时时不能用“ == ”,只能用“equals”;
3、String类不可更改。

String使用非常方便,因此一般涉及字符串时都用该类进行字符串处理。至于String类的类在机制,则极少去探究。直到读到下面这个例子。

class X

public static String strX="hello";
}
class Y
{
public static String strY="hello";
}
class Z
{
public static String strZ="hell"+"o";
}
class Test
{
public static void main(String[] args)
{
System.out.println( X.strX==Y.strY); 
System.out.println( X.strX==Z.strZ);
String s1="hel";
String s2="lo";
System.out.println( X.strX==(s1+s2));
System.out.println( X.strX==(s1+s2).intern());
}
}

按照我的理解,类X,类Y,类Z中的三个常量字符串属于不同的对象,用 == 操作符比较,那么结果必然是false,输出应该为:

false
false
false
false

但实际上输出确是:

true
true
false
true

使我大惑不解。因此,找了许多资料来看(尤其是C++和Java比较编程,里面解释比较详细),终于逐渐明白了原因。

== 只有在两个比较对象指向同一对象时,其值才为true。X.strX==Y.strY 与 X.strX==Z.strZ 测试结果都为true,说明这三个常量指向的都是同一个对象。

在Java中,String是字符串常量。由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。每个字符串常量只有一个String对象来表示。即使这个字符串常量出现在一个程序的不同位置甚至一个程序的不同程序包中。也就是说,X.strX与Y.strY由于都是同一字符序列,因此指向的肯定是同一对象。

Z.strZ也是如此。"hell"+"o",两个常量字符串相加后,创建了一个新的字符串常量(这个工作是编译期间完成的),它与X.strX,Y.strY有相同的字符序列,因此指向同一对象。

虽然一个常量表达式将两个字符串常量链接在一起的结果在编译器已完成,但是,

 String s1="hel";
String s2="lo";
String s3=s1+s2;

这段代码中,s3只能在运行期间创建。这三条语句所创建的"hello"字符串作为String对象存储在内存中的一个独立位置。

Java提供一个机制,通过String类定义的intern()方法把一个运行时创建的字符串加到字符串常量池(如果它还没有入池)。如果上面的三条代码改为:

String s1="hel";
String s2="lo";
String s3=(s1+s2).intern();

Java将把s1+s2所返回的字符串对象中的字符序列与已经存储在字符串常量池中的字符串进行比较。如果找到一个匹配,intern()就返回这个字符串的引用。如果没有找到匹配,s1+s2所返回的字符串将被加入到字符串常量池中,并返回这个字符串常量的引用。

这就解释了为什么X.strX==(s1+s2)返回false,而X.strX==(s1+s2).intern()返回true。(s1+s2).intern()指向strX,strY,StrX指向的字符串常量"hello"。

【相关文章】

【责任编辑:火凤凰 TEL:(010)68476606】

网友评论TOP5

查看所有评论(

提交评论

  1. 编程排行榜:图形编程的LOGO语言
  2. 什么是响应式Web设计?

热点专题

更多>>

读书

SUN Solaris 9/10系统管理员认证指南
本书专门根据SUN官方的SCSA for Solaris 9&10考试大纲撰写而成,全面覆盖了SCSA for Solaris 9/10的认证考点,除此之外本书还有

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 移动互联网生活门户 灵客风LinkPhone