首先要明白这些知识:
基本类型:byte 、 short、 int 、 long、float、double、char、boolean
引用类型:数组,类,接口,String 、枚举、 注解、
注意Integer,Short,Long,Byte,Float,Double,Character,Boolean这些基本数据类型的封装类不是引用类型。
对于这两种数据最大的区别在于基本数据类型是存放在栈中的,引用数据类型是在堆中的。直接上图
对于==:
1.遇到基本类型的时候是判断值是否相等,在遇到引用类型的数据时是比较引用是否相等。
2.在遇到引用类型的数据时,会比较两个引用是否相等。不比较值是否相等。
对于equals
1.原生的equls方法根据源码其实就是==。
2.String,Integer等类型重写了equlse方法,使其比较这些类型的值是否相等,不比较引用类型。
对于String这个引用类型数据,
String a="123";
String s=new String("123");
在内存中的存储是不一样的
因为在jdk1.8以后jvm把字符串常量池放进了堆中,所以heap(堆)就分为两块,一块是字符串常量池,另一块是用于存储普通对象及字符串对象。
1.对于String a="123";
首先jvm会先找字符串常量池中有没有123,若有,则直接把常量池中的123的引用返回给a。若没有,则自己创建一个常量123并且返回该常量的引用给a。所以对于两个这种形式的值相等的String ==会判定相等。
2.对于new String("123");这种方式
jvm直接在堆的另一半也就是正常的堆中直接创建一个普通的对象,无论在队中有没有这个值,多会创建,并且不会把123放进常量池。