以前对于String的理解只限于三点,对于String类的类在机制的内在探究,以下通过一个实例问题进行解答,供大家参考!String使用非常方便,初学者遇到问题不用困惑,在有大神讲解和互相交流帮助下学习,建立一个学习氛围会更快,进入Java互助学习qun 422九12四8⑨,一起解决问题,搞定Java不是事。
前期准备工作(包括相关工具或所使用的原料等)Eclipse或MyEclipse 详细的操作方法或具体步骤
一、关于String的理解以前是仅限于以下三点:
1、String是final类,不可继承;
2、String类比较字符串相等时时不能用“==”,只能用“equals”;
3、String类不可更改。
二、String使用非常方便,因此一般涉及字符串时都用该类进行字符串处理。但是对于String类的类在机制,探究很少。遇到以下例子:

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

但是实际上却输出的是:

这就使我产生疑问。然后经过各种资料来分析才明白:
==只有在两个比较对象指向同一对象时,其值才为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有相同的字符序列,因此指向同一对象。
虽然一个常量表达式将两个字符串常量链接在一起的结果在编译器已完成,但是,

这段代码中,s3只能在运行期间创建。这三条语句所创建的"hello"字符串作为String对象存储在内存中的一个独立位置。
Java提供一个机制,通过String类定义的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"。以上分析给大家一个参考。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本教程系本人依照真实经历原创,未经许可,谢绝转载。- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
