Java学习之数据比较

这里主要是总结一些常见的比较及其区别:

等号“==”的比较

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

Object的equals()方法

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

String中的比较方法
  1. str.equals(String otherstr)
    如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。
  2. str.equalsIgnoreCase(String otherstr)
    忽略大小写,如果两个字符串具有相同的字符和长度,返回true。
  3. str.compareTo(String otherstr)
    该方法为按字典顺序比较两个字符串,该比较是基于字符串中各个字符的Unicode值,如果String对象位于参数字符串之前,比较结果为负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为正整数,如果相等,结果为0。
  4. 几种包装类(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堆栈详解

猜你喜欢

转载自blog.csdn.net/dypnlw/article/details/79375525
今日推荐