您的位置:首页 > 编程语言 > Java开发

Java学习之数据比较

2018-02-26 15:46 211 查看
这里主要是总结一些常见的比较及其区别:

等号“==”的比较

使用“==”能够进行比较的是常见的基本数据类型,比较的是变量的内存地址。

Object的equals()方法

在Object类中equals()方法的作用和“==”类似,比较的也是变量的内存地址。

String中的比较方法

str.equals(String otherstr)

如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。

str.equalsIgnoreCase(String otherstr)

忽略大小写,如果两个字符串具有相同的字符和长度,返回true。

str.compareTo(String otherstr)

该方法为按字典顺序比较两个字符串,该比较是基于字符串中各个字符的Unicode值,如果String对象位于参数字符串之前,比较结果为负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为正整数,如果相等,结果为0。

几种包装类(Integer、Boolean、Byte、Character、Double、Number)的数据比较

public class Equal {
public static void main(String[] args) {
String str1=new String("123");
String str2=new String("123");
String str3="123";
String str4="123";
String str5=new String("12");
double e=1.23;
double f=1.23;
Integer int1=new Integer(10);
Integer int2=new Integer(10);
Integer int3=new Integer(9);
//String类型下的比较
System.out.println(str3==str4);
System.out.println(str1==str2);
System.out.println(str2.equals(str3));
System.out.println(str2.compareTo(str1));
System.out.println("-----------");
//基本类型的比较
System.out.println(e==f);
System.out.println("-----------");
//包装类的比较
System.out.println(int1==int2);
System.out.println(int1.equals(int2));
System.out.println(int1.compareTo(int2));
System.out.println(int3.compareTo(int2));
//改进str2
str2=str2.intern();
System.out.print("改进后的str2和str3的比较:");
System.out.println(str2==str3);
}
}


结果为:

true
false
true
0
-----------
true
-----------
false
true
0
-1
改进后的str2和str3的比较:true


这里对代码稍作解释:

一般我们定义形如

String str3=”123”;

String str4=”123”;

时,第一次定义的“123”,会被放入字符串池中,当再次定义str4时,这是它会先去寻找字符串池中是否已经存在“123”,如果存在,则返回字符串池中“123”的地址引用,因此str3==str4也就成立。

很明显一般的基础类型定义的变量可以直接通过“==”进行比较,但是针对于String以及数据包装类Integer等,“==”比较的只是对象引用的值,而对象引用的值(即指针的值)是对象的地址,存放在栈内存中,实际对象则是存放在堆内存中的,引用所包含的地址就是对象的堆地址。对象在每new一次的时候,都会申请一个新的地址空间,即使空间内容相同,但申请到的地址不同,所以在用“==”进行比较时,无法正确得出结果。因此String和Integer等类覆盖了父类Object的equals()方法,从而可以比较对象中的内容,但是在Object类中,equals()方法其实是和“==”等效的。

其中String和Integer等类还包含有compareTo方法,能够有效的比较大小,并得出对应的结论,具体关于compareTo的方法的介绍可以查看API

最后再说一下,intern()这个函数,下面是API中关于这个函数的介绍

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

由此可见,当调用intern方法后,str2的值即是“123”的地址值,所以str2==str3也就成立。

关于Java中堆栈的介绍,大家可以参考下面这个链接

Java堆栈详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: