本人是个菜鸟小白,每天都在一点点学习,最近遇到这种问题,今天来讨论一下…
Java中有八大基本数据类型:byte,short,int,long,double,folat,boolean,char
其中占1个字节的是byte,short和char占两个字节,int,float占四个字节,double和long占8个字节,boolean占1位,只有true和false,这八种数据变量中直接存储值
八大基本数据类型对应着各自的封装类型,提供了更多的方法,且不进行初始化时值默认为空(基本数据类型必须初始化)
还有就是像String类型这种,属于引用类型,变量中存储的是地址,对应的地址存储数据
对于基本数据类型,==是直接比较字面值
对于引用数据类型,==是比较的是,是否指向同一块内存空间。但是我们又常常碰到这样一个问题:
最终结果是 true,true,false,false那既然==是比较的地址,那么int数据的地址是怎样的呢,String又是怎样的呢?
对于基本数据类型来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会开辟一个空间,对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址。
另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种也在常量池开辟自己的缓存区,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么问题来了:
猜一下,结果是啥?
。
。
。
。
。
。
。
。
。
。
。
结果是true,false。没想到吧,这是为啥呢?其实是因为 Integer 包装类为了提高一些性能和内存利用,有一个类似缓存的概念,在常量池中的存储范围为**[-128,127]**,127在这范围内,是直接存储于常量池这个缓存区的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。
先看一下Object类中equals()的源码:
Object的源码:
发现equals()方法的本质还是实现==进行比较,就本质上来说,区别并不大
那么问题来了,如果本质上的区别并不是很大,为什么还单独存在一个equals()方法呢?
因为Obejct类是所有类的老祖宗类,其他的类就都可以重写这个equals()方法,拥有自己的equals()方法
这里看下两个引用数据类型的源码
String的源码:
Integer源码:
因为每个引用数据类型重写的都不一样,就不一一分析了,String和Integer这两个常用的我们来简单的说下
分析String源码的equals()方法,我们知道它就是比较字符串的内容是否一样,不是内存的比较
举个例子:
==上面说过了就不多说了,说一下equals(),比较的是内存空间中的内容是否相等,所以这两个都是true,大家明白了嘛?
总结
大家明白了吗?本人比较菜,哪里有啥问题大家可以评论出来,一起讨论一起学习,这篇先说到这,Integer这篇没有说,后期还会进行更新和修改~