Java常量字符串String理解
Java常量字符串String理解
以前关于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 由于都是同⼀字符序列,因此指向的肯定是同⼀对象。
编译期间完成的),它与 X.strX ,Y.strY有相同的字Z.strZ 也是如此。"hell"+"o",两个常量字符串相加后,创建了⼀个新的字符串常量(这个⼯作是编译期间
符序列,因此指向同⼀对象。
虽然⼀个常量表达式将两个字符串常量链接在⼀起的结果在编译器已完成,但是
String s1="hel";
String s2="lo";
String s3=s1+s2;
运⾏期间创建。这三条语句所创建的"hello"字符串作为String对象存储在内存中的⼀个独⽴位置。
这段代码中,s3只能在运⾏期间创建
⼀个运⾏时创建的字符串加到字符串常量池(如果它还没有⼊池)。如果上⾯的三条代码改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"。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论