"=="和equals方法究竟有什么区别?
比较之前先了解一些背景
(1)Java中内存分配模型
java的内存模型主要分三种,
栈:每个栈中的数据(原始类型和对象引用)都是私有的,编译器自动分配释放,其他栈不能访问。基本类型的变量,函数 的参数值,局部变量,对象引用.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是 对象),栈分为三个区:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
堆:程序员分配释放,若程序员不释放,程序结束后可能由os回收,jvm只有一个堆区(heap)被所有线程共享, 堆中不存放基本类型和对象引用,只存放对象本身 栈的资源比较少,运行速度快。.
静态区(方法区):跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
(2)基本数据类型不继承Object类即没有重写equals方法.因为所有类都继承object
首先Objet obj = new Object();(泛指引用类型)
其中变量obj占栈内存,new Object()占堆内存,此时变量obj变量中的值存放的是对象的引用.
A)equals()方法多用来比较对象是否相同(包括引用数据类型),比较的是变量中存放的引用地址.还有equals如果没有重写,则和’==’的意义一样,如果重写了,则会会按照重写的内容进行比较,javaBean规定当重写equals时候必须重写hashCode,如果不重写会出现对象相同但是hashCode不同,这样会出现问题,eg:HashSet存储元素时候是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。
- ‘==’多用来比较数据类型是否相同.
1)8种基本数据类型:变量直接存储的是“值”(==特有)
2)引用类型:和对象实例一样.(==和equals都可以使用)
如果要比较两个基本数据类型那必须用’==’,因为基本数据类型没有继承object,没有equals方法.
3)引用类型和基本类型比较
longj=10000l;
Long i=new Long(10000);
System.out.println(i==j);//true
编译成底层指令时,把引用类型转成了基本类型,再比较的值。
java中所有类都继承于Object,如果没有重写Object的 equals方法,那么,引用类型间的“==” 和 equal 都是比较的对象地址。StringBuffer 和StringBuilder特殊,也没有重写equals方法.==和equal都是比较地址,。当变量为基本数据类型时,用== 比较时,通常比较的是值,当变量为引用类型的时候用==比较时,通常比较的是对应的引用的内存地址。
局部变量和成员变量内存分配
对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String s = new String("william");会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。 再如 String s1 = new String(“william”); String s2 = s1; s1和s2同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。 类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。而类的方法却是 该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。