终极探究"=="与equals方法区别

来源:互联网 发布:真空收纳袋好用吗 知乎 编辑:程序博客网 时间:2024/05/16 12:16

先解释一下名词:

堆:首先堆是动态分配的,JVM并不会自动释放这部分内存。只用等待系统的gc来进行内存回收。

栈:是在类加载中有系统静态分配的,而且分配时按照内存的高低地址分配。这部分内存系统会自动进行释放。

 

a)基本数据类型

                                                   对于基本数据类型是没有equals方法的,所以这里讨论==

   java中的基本数据类型是8种:int,short,long,byte,float,double,boolean,char(此处注意string不是基本数据类型)

 下面看在基本数据类型中==是如何比较的

 

public class equals2 {   public static void main(String args[]){   int i=10;   int j=10;   if(i==j){   System.out.println("值相等");   }else{   System.out.println("不相等");   }   }}

当然也可以说成比较内存地址.对于基本数据类型,在存储的时候是放在栈中的,但是对于引用类型变量间的比较就不是这样了.

 

b)引用类型的变量之间的比较

       引用类型的变量就是String 数组等,如果他指向对象类型的话,就涉及了两块内存,变量存储在栈内存中,对象本身存储在堆内存中,先看一个例子:

class A {int a = 1;}public class Test {public static void main(String args[]) {A obj1 = new A();A obj2 = new A();String s1, s2, s3 = "abc", s4 = "abc";s1 = new String("abc");s2 = new String("abc");System.out.println("s1.equals(s2)是" + (s1.equals(s2)));// trueSystem.out.println("s1==s3是" + (s1 == s3));// 比较的是内存值,肯定falseSystem.out.println("s1.equals(s3)是" + (s1.equals(s3)));// trueSystem.out.println("s3==s4是" + (s3 == s4)); // 这里是true,比较特殊因为创建s3和s4的时候指向同一对象了,静态赋值,java会先查看常量池,已经存在"abc”System.out.println("s2.equals(s3)是" + (s2.equals(s3)));//trueSystem.out.println("s1==s2是" + (s1 == s2));//falseSystem.out.println("obj1==obj2是" + (obj1 == obj2));//falseSystem.out.println("obj1.equals(obj2)是" + (obj1.equals(obj2))); //比较特殊,比较A的两个对象,没有重写equals}}

obj1和obj2是两个引用变量,他们分别指向堆内存中的两个new出来的对象,所以说obj1和obj2就是两个指向堆内存中的地址,没错就是地址~~


string  s3="abc"的实现和new 不同,他是利用常量池实现的

  

对于 obj1==obj2和第一图类似,但是obj1.equals(obj2)因为没有在该类中重写equals()方法,所以功能上和==的作用是相同的,但是这个和s1.equals(s2)是不一样的,这个比较的是A的两个对象.在这行代码中的equals()继承了Object类的equals()方法,boolean equals(Object o){

  return this o;

}

重写过程我没有写,自己写去啦~~~~`

总结 :

  ==判断指向对象的地址是否相同

  equals比较两个独立对象的内容是否相同,如果一个类中没有重写equals()方法,他的作用就和==是一样一样滴~~~



好了 ,就到这里了,最近刚刚开学太忙了,没有时间.苦逼大二生.以后关于java的数据结构实现,设计模式,框架都会写到的~~~~

原创粉丝点击