`
LW371496536
  • 浏览: 3183 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

深入理解String类型对象相等与数值相等例程

 
阅读更多
在在JAVA语言中,String是一个特殊的类。虽然有时候它的用法与基础变量类型用法相同,但它毕竟是一个类,于是在对象的比较中也有“对象相等”与“数值相等”的概念。



1.对象相等
在Java语言中,对象相等有两种含义。一种是参考相等(Reference Equality),另一种是数值相等(Value Equality)
(1)参考相等。参考相等是指两个对象指向相同的内存空间,具有共同的实例变量。例如,下面的语句。
Rectangle r1, r2;
r1 = new Rectangle( 20, 60, 10, 50 );
r2 = r1;
r2.setPosition( 40, 40 );
其中r2 = r1;语句表示对象r2与对象r1指向同一个内存空间。当使用r2.setPosition( 40, 40 );语句改变对象r2的矩形位置时,也相当于改变了对象r1的矩形位置。对象r1和r2的关系示意图,如下





下当需要判断两个对象是否是参考相等时,使用关系运算符==来组成if语句的表达式。例如,判断Rectangle类对象r1和r2是否参考相等的if-else语句。
if ( r1 == r2 )
  System.out.println( "r1与r2参考相等" );
else
  System.out.println( "r1与r2参考不相等" );



2.数值相等
数值相等是指两个同类对象的所有实例变量值都一一对应相等。例如,下面的语句。
Rectangle r1, r2;
r1 = new Rectangle( 20, 60, 10, 50 );
r2 = new Rectangle( 20, 60, 10, 50 );
r2.setPosition( 40, 40 );
其中,对象r1和r2各自指向不同的内存空间,但是它们实例变量的初始化值完全相同。当使用r2.setPosition( 40, 40 );语句改变对象r2的矩形位置时,并没有改变对象r1的矩形位置。对象r1和r2的关系示意图,如图下图所示。
示。当需要判断两个对象是否是数值相等时,可以通过调用对象的实例方法equals()来实现。例如
if ( r1.equals( r2 ) )
  System.out.println( "r1与r2数值相等" );
else
  System.out.println( "r1与r2数值不相等" );
相应地,在Rectangle类中,需要添加实例方法equals(),其内容如下。
public boolean equals( Rectangle r )
{
  boolean b = ( x == r.x ) && ( y == r.y ) && ( width == r.width) && ( height == r.height );
  return b;
}
在Java语言提供的许多标准类中已经定义了equals()实例方法,我们不要再编写上面的方法,可以直接使用。最常用的是前面介绍过的String类中判断两个字符串是否相等的equals()方法。


在将两个对象进行某种比较时,一定要注意所调用的实例变量的修饰符是private,还是public的。如果是public修饰符,则可以直接使用两个对象进行比较。例如:
r1.width < r2.width
r3.length == r4.length
如果修饰符是private,则必须在对象的类中添加一个进行比较的实例方法,然后通过调用该方法和传递对象参数来完成比较。这是因为Java不允许在类之外访问其private实例变量,只允许在类内访问其对象的private实例变量,如下图所示。
每种类型的变量都有其默认值,例如,int类型变量的默认值为0,boolean类型变量的默认值为false。对象变量的默认值为null,表示一个变量还没有指向任何特定的对象。定义一个对象变量后,其默认值为null,创建该变量后null被具体的对象取代。当对象变量的值为null时,不可以通过其调用任何实例变量和实例方法,否则会发生NullPointerException错误。



请运行如下实例来体会String类的对象相等和数值相等。


package gxph.test;

public class String_test {



public static void dothese ()
{
String s = "12";
String s_same=s;
String s1 = "abc";
String s1_same=s1;

System.out.print("  s="+s);
System.out.println("  s_same="+s_same);
System.out.print("  s1="+s1);
System.out.println("  s1_same="+s1_same);

// s.copyValueOf(s1.toCharArray());
s = String.copyValueOf(s1.toCharArray());

System.out.print("  s="+s);
System.out.println("  s_same="+s_same);
System.out.print("  s1="+s1);
System.out.println("  s1_same="+s1_same);

s1 = "789";

System.out.print("  s="+s);
System.out.println("  s_same="+s_same);
System.out.print("  s1="+s1);
System.out.println("  s1_same="+s1_same);

}


public static void main(String[] args) {

dothese();
}

}

运行结果如下:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics