java类型比较_Java数据类型的比较

1. “==” : 可以比较基本数据类型 , 也可以比较引用数据类型 。基本数据类型比较的是值,引用数据类型比较的是地址。

基本数据类型byte,short,char,int,long,float,double,boolean

封装数据类型Byte,Short,Character,Integer,Long,Float,Double,Boolean

示例代码1:/**

* @ClassName: TypeCompare1

* @Author: liuhefei

* @Description: byte, short, int, long四种基本数据类型以及其包装类的比较

*  1. 基本数据类型与其对应的包装类运算或比较时,会自动拆箱成基本数据类型;

在自动装箱时,会先检查其值是否在-128到127之间,如果在这之间,就会直接指向常量池中其值的地址;

如果不在-128到127之间,就会创建一个新的对象,存储在堆中,就是两个不同的对象,比较时为false.

2.同时byte, short, long也具有该特性。

3.不同类型之间的基本数据类型也可以使用==进行比较,比较的是它们的值

*

* @Date: 2020/5/11 17:53

*/

public class TypeCompare1 {
public static void main(String[] args) {
int i = 127;

int i1 = 127;

Integer i2 = 127;

Integer i3 = 127;

Integer i4 = new Integer(127);

Integer i5 = new Integer(127);

Integer i6 = 128;

Integer i7 = 128;

int i8 = 300;

int i9 = 300;

long l1 = 300;

float f1 = 300;

double d1 = 300;

System.out.println(i == i1); // true; 基本类型比较值

System.out.println(i1 == i2);// true;i2自动拆箱变成基本类型,两基本类型比较值

System.out.println(i1 == i4);// true; i4自动拆箱变成基本类型,两基本类型比较值

System.out.println(i2 == i3);// true; i2和i3都指向常量池中同一个地址

System.out.println(i2 == i4);// false; 两个不同的对象

System.out.println(i4 == i5);// false; 两个不同的对象

System.out.println(i6 == i7);// false; 自动装箱时,如果值不在-128到127,就会创建一个新的对象

//不同类型之间的基本数据类型也可以使用==进行比较

System.out.println(i8 == i9);   //true 基本类型之间的比较,比较的是值

System.out.println(i8 == l1);   //true

System.out.println(i8 == f1);   //true

System.out.println(i8 == d1);   //true

}

}

示例代码2:/**

* @ClassName: TypeCompare2

* @Author: liuhefei

* @Description: float,double的比较

* 1. float,double类型的包装类,都会在堆中创建一个新对象,因此比较的是对象的地址

*

* @Date: 2020/5/11 17:53

*/

public class TypeCompare2 {
public static void main(String[] args) {
float f1 = 314.15926f;

float f2 = 314.15926f;

Float f3 = 314.15926f;

Float f4 = 314.15926f;

System.out.println(f1 == f2);   //true,基本数据类型的比较,比较的是值

System.out.println(f3 == f4);   //false,包装类型的比较,都会创建新对象,比较的是对象的地址

System.out.println(f1 == f3);   //true, 包装类型拆箱为基本数据类型,比较的是值

double d1 = 314.15926575958;

double d2 = 314.15926575958;

Double d3 = 314.15926575958;

Double d4 = 314.15926575958;

System.out.println(d1 == d2);  //true,基本类型的比较,比较的是值

System.out.println(d3 == d4);  //false,包装类型的比较,都会创建新对象,比较的是对象的地址

System.out.println(d1 == d3);  //true,包装类型拆箱为基本数据类型,比较的是值

}

}

2. equals() : 只能比较引用数据类型, 默认比较的是地址值,它不能比较基本数据类型,基本数据类型不是Object类型, 不能使用equals方法比较。

使用equals方法比较引用类型时,等同于"==",比较的是两个对象的值是否相等。

如果你想自定义比较方法,需要重写equals方法。

3. Jave中,Object类是所有Java类的祖先,Object是Java语言中唯一一个没有父类的类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。可以使用类型为Object的变量指向任意类型的对象。

在Object类中定义的方法,在所有类中都可以使用。Object类中定义了equals()方法和hashCode()方法,具体如下:

public boolean equals(Object obj): 比较两个对象引用的值是否相等(比较地址)。指出调用该方法的对象是否与obj对象相等。即地址是否相等。

public int hashCode():该方法返回对象的哈希码值,唯一标识一个对象。

Object类中定义的equals方法,用于比较对象的内存地址, 对于引用数据类型进行equals比较,在没有重写equals方法的情况下,它们之间的比较还是基于它们在内存中的存放位置的地址值的。

而有些类重写了equals方法和hashCode方法,比如Byte,Short,Character,Integer,Long,Float,Double,String,Date,Boolean等等,在这些类当中equals方法有其自身的实现,而不再是比较类在堆内存中的存放地址了。

因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

4. 基本数据类型byte,short,char,int,long,float,double,boolean的比较应该使用双等号(==),比较的是它们的值。

5. 引用数据类型在使用==比较的时候,比较的是它们在内存中的存放地址.只有当它们是同一个new出来的对象时,它们的比较结果才会为true,否则比较结果为false.

基本数据类型在使用==比较的时候,比较的是它们的值。不同类型之间的基本数据类型也可以使用==进行比较

6. 基本数据类型与其对应的包装类运算或比较时,会自动拆箱成基本数据类型,也可以使用==直接进行比较。

在自动装箱时,会先检查其值是否在-128到127之间,如果在这之间,就会直接指向常量池中其值的地址;

如果不在-128到127之间,就会创建一个新的对象,存储在堆中,就是两个不同的对象,比较时为false.

7. 凡是new出来的都是对象,存储在堆内存中。

7. java中Integer类型对于-128-127之间的数是存缓冲区的,所以用等号比较是一致的。但对于不在这区间的数字是在堆中new出来的。所以地址空间不一样,也就不相等。

如果两个Integer类型的数相等,且在-128-127之间,用==比较返回true,其余返回false.

8. 对于引用数据类型,我们还可以使用x.compareTo(y)方法来比较, 如果x与y相等,返回0;x大于y返回1;x小于y返回-1;

9. 两个基本类型int进行相等比较,直接用==即可。一个基本类型int和一个包装类型Integer进行相等比较,直接用==比较即可,Integer类型会做拆箱操作。

10. Integer类型比较大小,要么调用Integer.intValue()转为基本类型用“==”比较,要么直接用equals比较。

总结:

(1)凡是new出来的都是对象,new Integer(127)与new Integer(127)使用==比较为false,使用equals比较才会返回true.

(2)无论如何,Integer与new Integer使用==比较都不会相等,使用equals比较才会返回true.

(3)两个都是非new出来的Integer,如果数在-128到127之间,使用==比较则是true,如果不在-128到127之间,使用==比较否则为false。而如果使用equals方法来比较,无论比较的数在不在-128到127之间都为true.

(4)int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比.

示例代码3:public class TypeCompare3 {
public static void main(String[] args) {
int i = 127;

int ii = 128;

Integer i1 = new Integer(127);

Integer i2 = new Integer(127);

Integer i3 = 127;

Integer i4 = 127;

Integer i5 = 128;

Integer i6 = 128;

Integer i7 = new Integer(128);

Integer i8 = new Integer(128);

Integer i9 = 200;

Integer i10 = 100;

System.out.println(i == i1);    //true int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

System.out.println(i == i3);    //true

System.out.println(ii == i7);   //true

System.out.println(i1 == i2);   //false  两个不同的对象

System.out.println(i1 == i3);   //false  无论如何,Integer与new Integer不会相等

System.out.println(i3 == i4);   //true  在-128-127之间,用==比较返回true

System.out.println(i5 == i6);   //false 不在-128-127之间,用==比较返回false

System.out.println(i7 == i8);   //false  两个不同的对象

System.out.println(i1 == i3);   //false  两个不同的对象

System.out.println(i5 == i7);   //false  两个不同的对象

//x.compareTo(y) 如果x与y相等,返回0;x大于y返回1;x小于y返回-1

int result1 = i1.compareTo(i2);

int result2 = i5.compareTo(i6);

int result3 = i7.compareTo(i8);

int result4 = i1.compareTo(i9);

int result5 = i1.compareTo(i10);

System.out.println("result1 = " + result1);  //0

System.out.println("result2 = " + result2);  //0

System.out.println("result3 = " + result3);  //0

System.out.println("result4 = " + result4);  //-1

System.out.println("result5 = " + result5);  //1

System.out.println("1: " + i1.equals(i2));   //true

System.out.println("2: " + i3.equals(i4));   //true

System.out.println("3: " + i5.equals(i6));   //true

System.out.println("4: " + i7.equals(i8));   //true

System.out.println("5: " + i1.equals(i3));   //true

System.out.println(i1.intValue() == i2.intValue());  //true

System.out.println(i3.intValue() == i4.intValue());  //true

System.out.println(i5.intValue() == i6.intValue());  //true

System.out.println(i7.intValue() == i8.intValue());  //true

}

}

11. long与Long的比较, float与Float的比较, double与Double的比较均与int与Integer的比较类似,不再多说。

示例代码4:public class TypeCompare4 {
public static void main(String[] args) {
float f1 = 3.14f;

float f2 = 3.14f;

Float f3 = 3.14f;

Float f4 = 3.14f;

Float f5 = new Float(3.14);

Float f6 = new Float(3.14);

System.out.println(f1 == f2);  //true   基本数据类型比较

System.out.println(f3 == f4);  //false  两个不同的对象

System.out.println(f5 == f6);  //false  两个不同的对象

System.out.println(f1 == f3);  //true  封装类型会拆箱

System.out.println(f1 == f5);  //true  封装类型会拆箱

System.out.println(f3 == f5);  //false

System.out.println("1: " + f3.equals(f4));  //true

System.out.println("2: " + f3.equals(f5));  //true

System.out.println("3: " + f5.equals(f6));  //true

}

}

示例代码5:public class TypeCompare5 {
public static void main(String[] args) {
double d1 = 3.1415926d;

double d2 = 3.1415926d;

Double d3 = 3.1415926d;

Double d4 = 3.1415926d;

Double d5 = new Double(3.1415926d);

Double d6 = new Double(3.1415926d);

System.out.println(d1 == d2);  //true   基本数据类型比较

System.out.println(d3 == d4);  //false  两个不同的对象

System.out.println(d5 == d6);  //false  两个不同的对象

System.out.println(d1 == d3);  //true  封装类型会拆箱

System.out.println(d1 == d5);  //true  封装类型会拆箱

System.out.println(d3 == d5);  //false  两个不同的对象

System.out.println("1: " + d3.equals(d4));  //true

System.out.println("2: " + d3.equals(d5));  //true

System.out.println("3: " + d5.equals(d6));  //true

}

}


原文链接:https://blog.csdn.net/weixin_39754267/article/details/114047929

posted @ 2021-03-02 22:07  LZ太热  阅读(713)  评论(0编辑  收藏  举报