浅析String类中“= =”和equals的应用

时间:2022-07-23 10:58:37

浅析String类中“= =”和equals的应用

[摘 要]String是编程中常用到的数据类型,Java中的String类是一种引用数据类型。它将从String类对象的两种创建方式入手,分析字符串作比较时 “= =”和equals()的具体应用。

[关键词]equal 字符串 数据类型

[中图分类号]TP311.1[文献标识码]A[文章编号]1007-9416(2010)02-0110-02

The Analysis of String class "= =" and the application of equals

Chen Yi Tong Yala

(School of Science, Hubei University of Technology; Wuhan 430068)

[Abstract]String is a commonly used in programming data types ,Java the String is a reference data type. the paper from the String class object to create the two methods are analyze when compared to the string "= =" and equals () the specific application.

[Key words]equal;string,data types

Java是一门强类型语言,每个变量都必须声明类型。Java语言的数据类型有两大类:一类是简单类型,也称主要类型,另一类是引用类或扩展类(主要是指String类型)。简单类型的变量中存储的是具体的值,而引用类型的变量中存储的是对象的引用。在Java中,通过两种方式可以比较两个数据是否相等:(1)使用操作符“==”;(2)使用equals方法。

1 简单类型的比较

在Java中,简单数据类型的比较一般是用操作符“==”来进行的。因为原子类型(int,char等)不是对象,因此只能使用“==”操作符进行比较。只要表达式两边的“值”相等,那么比较的结果就是true,否则为false。对于对象的比较更复杂些,“= =”操作符比较两个引用是否指向同一个对象,equals方法则实现更专门的相等性比较。

2 扩展类型的比较

Java中没有内置字符串类型,在标准Java库中包含一个名为String的预定义类。 将字符串作为预定义的对象处理允许Java提供极丰富的功能特性以方便处理字符串。

对于String类型的比较可以采用“==”,也可以采用equals()方法进行比较。如:

String s1=new String(“hello”);

String s2=new String(“hello”);

对于s1和s2,用 “==”的比较结果将返回false,而用equals()比较的结果将返回true。这是因为“= =”在比较引用数据类型的时候,比较的是对象本身,即只有两个变量代表同一个对象的时候,才能返回true。即在比较的时候,比较了对象的地址信息,只有地址相同的对象才能够返回true。所以上面代码用“==”比较结果为false。而String中的equals()方法实现对String 对象所代表的内容的比较,它们的内容是一样的,都是“hello”,所以比较结果为true。

2.1 字符串”==”的比较

String是java中最常用的一个不可变对象。其对象的创建有两种方式:

其一:String str=“abc”;

其二:String str=new String(“abc”);

下面具体的分析,由这两种方式所创建的对象用“==”来作比较的结果。

Ⅰ、两者都为第一种方式创建对象的比较

String strl=“abc”;

String str2=“abc”;

System.Out.println(str1= =str2);

若用String strl=“abc”;语句创建一个对象,在Java内部将包含了这样一些信息:

首先,定义一个名字为strl的String类的对象引用变量。接着,在栈内存中搜索是否存在着这样一个存储单元,用来存放“abc”的值。若没有,则将新开辟一个的存储单元存放“abc”的值。然后,创建一个新的String类的对象o。并将对象o指向新开辟的存储单元,同时在栈内存中标记这个引用的对象o。若已经存在值为“abc”的地址,则搜索对象o,返回该对象o的地址。最后,将strl指向对象o的地址。strl指向存在栈中数据的引用。

String str2=“abc”;在栈内存中创建了一个对象引用变量str2,之前栈内存中已有一个对象o值为“abc”,所以str2直接指向对象o。因此JVM创建了两个对象引用变量strl和str2,但仅创建了一个对象o。并且两个引用都指向了对象o。所以比较结果为true。

Ⅱ、两者都为第二种方式创建对象的比较

String strl=new String(“abc”);

String str2=new String(“abc”);

System.out.println(strl= =str2);

系统先在栈内存中分别创建了两个对象引用变量strl和str2,接着用new关键字在堆内存中创建了两个对象,因为new运算符在每一次运算时,都会产生一个新的对象,每一个新的对象都有自己的内存和地址。所以两个引用变量分别表示了两个不同的对象。因此比较结果为false。

Ⅲ、由两种方式各自创建对象的比较

String strl=“abc”;

String str2= new String(“abc”);

System.out.println(strl= =str2);

根据前面的分析,我们可以看出这个比较的结果为false。系统在栈内存中创建了两个对象引用变量strl、str2。其中strl指向栈中的一个对象,str2指向堆中的一个对象,即两个引用分别指向不同的两个对象。所以比较结果为false。

2.2 字符串值的比较

要比较字符串的值是否相等,可以调用equals()方法。equals()方法是java.lang.Object类中的方法,在String类中它重写了这一方法,比较时,只要字符串中的每一个字符对应相等。不管对象的地址是否相同、对象是否是同一个对象,字符串对象都相等。如:strl.equals(str2)只要strl和str2的字符串的信息相同结果就为true。在重写equals方法时,要注意满足离散数学上的自反性;对称性;传递性;一致性;非空性等特性。在String类中,还有一个函数也可以用于字符串的比较:equalsIgnoreCase()。它的比较规则是只要字符串对象的对应字符是相等的。那么对象就是相等的,并且忽略字母的大、小写。

此外,还有三个类:包装类(Boolean、Character、Integer、Long、Float和Double),File和Date。它们都重写了Object类中的equals()方法,这三种类型的对象比较时,类型相同且内容一致返回值为true。

另外,若声明的是字符串数组类型变量,如:

String[] str4={“a”,“b”,“c”};

String[] str5={“a”,“b”,“c”};

使用“= =” 和equals比较str4和str5的关系得到的返回值均为false。即不能用“= =”和String类的成员方法equals来比较两个字符串数组的关系。要想比较字符串数组内容可以用java.util包中Arrays类的静态成员equals方法。即System.out.println(Arrays.equals(str4,str5));打印结果为true。

3 结语

在对字符串作相等判断时,“==”判断的是地址是否相同,equal()判断的是字符值是否相同。大多数时候两者结果都是相同的。因为String对象是不变模式的,如果没有明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String 对象放到一个缓冲区,每次判断缓冲区中是否已存在这个对象,如果存在,那么后创建的相同字符串值的String对象也会指向最初创建字符串值对象的地址。也就是说字符串值相同的时候,大多数情况下地址也是相同的,这时“= =”与equal()结果是相同的。若对象是由String str = new String(“abc”)生成的而不是直接用String str = “abc”赋值生成的,或者经过了一些字符串连接处理,或者通过StringBuffer等对象生成的,都将会在内存中开辟新的地址,这时“= =”和 equal()结果就不会相同了。

总之,“==” 是用来判断两个对象的地址是否相同,即是否是指相同一个对象,比较的是真正意义上的指针操作。另外“= =”两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过,“==”比较的是地址。而String的equals()方法是比较的是两个String对象的内容是否一样,其参数是一个String对象时才有可能返回true,其它对象都返回false。一般来说,在比较两个对象是否相等的时候应该使用equals方法,而对于原子类型的数据,应该使用:“==”操作符。

[参考文献]

[1] 耿祥义编著.《Java2实用教程》[M].清华大学出版社,2009,4.

[2] 胡玉成,庞家乐等.Java编程常见问题若干例[J].武汉科技学院学报,2004,8,l7(4).

[3] 赵景晖.Java程序设计[M].北京:机械工业出版社,2008,1.

上一篇:基于视觉显著性的空地电视制导导弹攻击通道地... 下一篇:一种有效的Web关联规则挖掘方法