==与equals,String的equals()方法

==介绍

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)。

基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。

引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

public class test {

	public static void main(String[] args) {
		int i=100;//基本数据类型
		int j=100;//基本数据类型
		Integer x=100;//引用数据类型
		Integer y=100;//引用数据类型
		Integer s=1000;
		Integer d=1000;
		Integer a=new Integer(100);//引用数据类型
		Integer b=new Integer(100);//引用数据类型
		
		System.out.println("i的地址"+System.identityHashCode(i));
		System.out.println("j的地址"+System.identityHashCode(j));
		System.out.println("x的地址"+System.identityHashCode(x));
		System.out.println("y的地址"+System.identityHashCode(y));
		System.out.println("a的地址"+System.identityHashCode(a));
		System.out.println("b的地址"+System.identityHashCode(b));
		
		//基本类型相互比较其中的值,得true
		System.out.println("i==j:"+(i==j));
		
		//int的引用类型Integer与基本类型进行比较的时候,包装类会先进行自动拆箱,然后与基本类型进行值比较
		System.out.println("i==x:"+(i==x));
		
		//同上,包装类先拆箱为基本类型,然后值比较
		System.out.println("i==a:"+(i==a));
		
		//都是引用类型,比较的是地址
		//在-128~127的Integer值并且以Integer x = value;的方式赋值的参数,x会从包装类型自动拆箱成基本数据类型,以供重用
		System.out.println("x==y:"+(x==y));
		
		//都是引用类型,比较的是地址
		System.out.println("a==b:"+(a==b));
		
		//当s,d超出-128~127区间的时候,地址就变了,所以比较的结果就是false。
		System.out.println("s==d:"+(s==d));
	}
}

运行结果:

i的地址366712642
j的地址366712642
x的地址366712642
y的地址366712642
a的地址1829164700
b的地址2018699554
i==j:true
i==x:true
i==a:true
x==y:true
a==b:false
s==d:false

再看其它的包装器自动拆箱情况:
在这里插入图片描述

equals()方法介绍

它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

Boolean、Byte、Short、Integer、Long、Float、Doulbe、Character 8种基本类型的包装类都重写了 equals() 方法,所以比较的时候,如果内容相同,则返回 true,例如:

Integer a=new Integer(100);//引用数据类型
Integer b=new Integer(100);//引用数据类型
System.out.println("a==b:"+(a==b));
System.out.println(a.equals(b));

运行结果:

a==b:false
true

String类型的比较介绍

string是一个非常特殊的数据类型,它可以通过String x = value;的方式进行赋值,也可以通过String x = new
String(value)方式进行赋值。

String x = value;方式赋予的参数,会放入常量池内存块区域中;
String x = new String(value);方式赋予的参数,会放入堆内存区域中,当成对象处理。

public class test2 {

	public static void main(String[] args) {
		String a=new String("ab");//a为一个引用
		String b=new String("ab");//b为另一个引用,对象的内容一样
		
		String x="ab";//放在常量池中
		String y="ab";//从常量池中查找
		
		System.out.println("a的地址"+System.identityHashCode(a));
		System.out.println("b的地址"+System.identityHashCode(b));
		System.out.println("x的地址"+System.identityHashCode(x));
		System.out.println("y的地址"+System.identityHashCode(y));

		//地址相同,返回true
		System.out.println("x==y:"+(x==y));
		
		//地址不同,非同一个对象,返回false
		System.out.println("a==b:"+(a==b));
		
		//地址不同,值相同,返回true
		System.out.println(a.equals(b));
	}
}

运行结果:

a的地址366712642
b的地址1829164700
x的地址2018699554
y的地址2018699554
x==y:true
a==b:false
true

为什么string的equals()方法比较返回true,因为string重写了equals()方法
如果需要比较某个对象是否相同,一定要重写equals(),比较其中的内容是否相同,如果相同,返回true;否则,返回false!

public class Demo2 {
 
    public static void main(String[] args) {
        String name1="张三";  // 直接赋值方式
        String name2=new String("张三"); // new方式
        String name3=name2; // 传递引用
         
        // ==比较的是引用
        System.out.println("name1==name2:"+(name1==name2));
        System.out.println("name1==name3:"+(name1==name3));
        System.out.println("name2==name3:"+(name2==name3));
         
        // equals比较的是具体内容
        System.out.println("name1.equals(name2):"+(name1.equals(name2)));
        System.out.println("name1.equals(name3:"+(name1.equals(name3)));
        System.out.println("name2.equals(name3):"+(name2.equals(name3)));
    }
}

运行输出:

name1==name2:false
name1==name3:false
name2==name3:true
name1.equals(name2):true
name1.equals(name3:true
name2.equals(name3):true

内存示意图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值