equals和==的区别

equals:用于判断两个变量是否是对同一个对象的引用,即判断存放在堆中的内容是否相同.

 1.第一:对象不同,内容相同:

==:等于。比较两个地址是不是一样的(地址一样值肯定一样)(比较的是引用,引用是什么下面有介绍)
equals:相同。比较两个地址指向的 实际对象的内容 是不是同一个(比较的是对象)
两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。

1
2
3
4
5
6
7
8
9
10
    package proj1;
public  class  file2 {
 
     public  static  void  main(String[] args) {
       // 这句话设计到了两段不同内存,s是一段(存放在栈中), new   String( "java" )(存放在堆中)是一段
         String s =  new  String( "java" );//s指向对象newString("java")的首地址。
         String s1 =  new  String( "java" );//s1指向对象new String("java")的首地址
 
         System. out .println(s==s1);             //false,两个不同的对象存放地址当然不一样
         System. out .println(s. equals (s1));     //true,地址中的值是一样的
     }

  第二:同一对象,"等号和

equals结果相同,引用类型做比较的时候两个都可以;

引用类型:

"引用"(reference)是c++的一种新的变量类型,是对C的一个重要补充。它的作用是为变量起一个别名。假如有一个变量a,想给它起一个别名,可以这样写:

int a;int &b=a;

这就表明了b是a的"引用",即a的别名。经过这样的声明,使用a或b的作用相同,都代表同一变量。在上述引用中,&是"引用声明符",并不代表地址。

不要理解为"把a的值赋给b的地址"。引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。声明引用并不开辟新的内存单元,所以b和a都代表同一变量单元。

1
2
3
4
5
6
7
8
9
10
11
12
13
package proj1;
 
public  class  file2 {
 
     public  static  void  main(String[] args) {
         String s1 =  new  String( "java" );
         String s2 = s1;
 
         System. out .println(s1==s2);             //true,s1,s2都指向了同一个地址
         System. out .println(s1. equals (s2));     //true  //true地址一样值当然一样
     }
 
}

  

第三:这种情况值相同对象就是相同的

1
2
3
4
5
6
7
8
9
10
11
12
13
package proj1;
 
public  class  file2 {
 
     public  static  void  main(String[] args) {
         String s1 =  "java" ;
         String s2 =  "java" ;//由于上一句已经把Java这个常量放入了常量池,所以这里对直接指向常量java的地址
 
         System. out .println(s1==s2);             //true,s1,s2存放的都是常量Java的首地址
         System. out .println(s1. equals (s2));     //true 地址一样地址存放的值也是一样的
     }
 
}

  第四:下列情况注意,当不是直接赋值而是其他类型转化过来的时,对象发生改变。由于t的值是变量s1转化而来所以不会放到常量池。所以当再次把"11"给s时,它会新赋值再放到常量池

当再次给s2时由于常量池中s已经放进去"11"这个值了,所以就直接在常量池中找到赋给s2.所以(t==s(false) t==s2(false)  不是同一个对象)  s==s2(true)(还是指向常量池中的同一个对象),同理对于比较String a="123"和"123"还是一样是true.

package proj1;

public class file2 {

public static void main(String[] args) {
int s1 =11;
String t=String.valueOf(s1);
String s="11";
String s2 = "11";

System.out.println(s2==t); 
System.out.println(s==t); 
System.out.println(s2==s); //指向同一个常量的地址所以相同
System.out.println(t.equals("11")); 
}

}

 

 

最后补充一点,Java的基本变量和引用变量

 基本变量:基本数据类型如char,byte,int,double,short,float,long,boolean,基本变量变量名是指向变量数据值。

引用变量:数组,对象,接口。变量名指向的是地址


所以才能有基本类型的变量用==就可以判断数值是否相等,毕竟是常量池中的同一个东西嘛

==比较对象时就是比较地址是否相等,String不是基本类型,所以才看到值相等的两个变量不一定地址也相等

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值