javaintshort区别_Java基础之数据⽐较Integer、Short、int、
short
基础很重要,基础很重要,基础很重要。重要的事情说三遍,。
今天聊⼀聊Java的数据⽐较,这个范围⽐较⼤,基础类型的⽐较、引⽤类型的⽐较。
前提:
1、Java和c#都提供⾃动装箱和⾃动拆箱操作,何为⾃动装箱,简单点说就是将值类型转换成为引⽤类型,⾃动拆箱就是将引⽤类型转换成为值类型。并且我们还经常被教导,要避免⾃动的装箱和拆箱操作,因为这个会影响性能。
2、⽐较常⽤的运算符是==,equals。
下⾯分⼏类来说明数据的⽐较,
引⽤类型之间的⽐较:Integer与Integer之间的⽐较、Boolean与Boolean之间的⽐较、Integer与Boolean之间的⽐较
值类型之间的⽐较:int与int之间的⽐较、int与bool之间的⽐较
值类型与引⽤类型之间的⽐较:Integer与int之间的⽐较、Boolean与bool之间的⽐较
开⼯
引⽤类型之间的⽐较--Integer与Integer之间的⽐较
简单说明⼀下,Integer是引⽤类型,代表的是整形数字
上代码
1 public static void main(String[] args) throwsException {
2 Integer integer = new Integer(0);
3 Integer mInteger =
Integer.valueOf(0);4 Integer sInteger = 0;5
6 System.out.println(integer == mInteger);//false
7 System.out.println(integer == sInteger);//false
8 System.out.println(mInteger == sInteger);//true
9
10 System.out.println(memoryAddress(integer));11 System.out.println(memoryAddress(mInteger));12
System.out.println(memoryAddress(sInteger));13
14 }15
16 private static intmemoryAddress(Object object) {17 //内存地址会有所不同
18 returnSystem.identityHashCode(object);19 }
执⾏结果:
分析:
1、执⾏结果和我们预想的不太⼀样,引⽤类型是在堆上存放的,每个引⽤的地址应该都不相同。但是mInteger == sInteger  执⾏结果为true,并且mInteger ,sInteger的内存地址是相同的。
2、要分析这个原因,我们需要了解Java设计者为了性能⽽进⾏的⼀些努⼒,查看Java源代码,可以看到Integer的valueof⽅法⾥⾯包含了⼀个缓存:其中IntegerCache.low =-127,IntegerCache.high=128
1 @HotSpotIntrinsicCandidate
2 public static Integer valueOf(inti) {
3 if (i >= IntegerCache.low && i <=IntegerCache.high)
4 return IntegerCache.cache[i + (-IntegerCache.low)];
5 return newInteger(i);
6 }
对于使⽤Integer.valueof()⽅法,如果数值是-127⾄128,那么会使⽤缓存对象,否则会new⼀个对象。
3、Integer sInteger = 0;  发⽣了什么呢?⾃动装箱,等价于Integer sInteger=Integer.valueOf(0)。通过这个,我们就可以得出⽐较等于true的原因了,都是从缓存中读取的对象,难怪内存地址会⼀致。
引⽤类型⽐较--Integer与Integer引⽤类型⽐较  使⽤equals
上代码:
1 public static void main(String[] args) throwsException {
2 Integer integer = new Integer(0);
3 Integer mInteger =
Integer.valueOf(0);4 Integer sInteger = 0;5
6 System.out.println(integer == mInteger);//false
7 System.out.println(integer == sInteger);//false
8 System.out.println(mInteger == sInteger);//true
9
10 System.out.println(memoryAddress(integer));11 System.out.println(memoryAddress(mInteger));12
System.out.println(memoryAddress(sInteger));13
14 System.out.println(integer.equals(mInteger));//true
15 System.out.println(integer.equals(sInteger));//true
16 System.out.println(mInteger.equals(sInteger));//true
17
18 }19
20 private static intmemoryAddress(Object object) {21 //内存地址会有所不同
22 returnSystem.identityHashCode(object);23 }
分析:使⽤equals⽐较,只要数值相同,那么⽐较结果就是相同。查看Java源代码:
1 public booleanequals(Object obj) {
2 if (obj instanceofInteger) {
3 return value ==((Integer)obj).intValue();
4 }
5 return false;
6 }
可以看到Integer的equals⽐较,其实⽐较的就是数值。
值类型之间的⽐较:int与int
上代码
1 int m=0;
2 int i=0;
3 int s=0;
4 System.out.println(m==i);//true
5 //值类型是没有equals⽅法6
//System.out.println(m.equals(i));
分析:对于int 的⽐较,⽆需多⾔,本来就是数值⽐较。
Integer与int的⽐较:
1 Integer integer = new Integer(0);
2 Integer mInteger = Integer.valueOf(0);
3 Integer sInteger = 0;//等价于Integer。valueof
4 int i = 0;
5 System.out.println(integer == i);//true
6 System.out.println(mInteger == i);//true
7 System.out.println(sInteger == i);//true
8 System.out.println(integer.equals(i));//true
9 System.out.println(mInteger.equals(i));//true
10 System.out.println(sInteger.equals(i));//true
分析:
1、Integer类型与int类型通过==⽐较,Integer会⾃动拆箱,转换成int数值进⾏⽐较
2、equals⽅法更是读取对应的int数值进⾏⽐较。
因此引⽤类型与值类型之间的⽐较,使⽤equals与==都可以。
简单总结:
1、引⽤类型之间的⽐较,由于存在-127⾄128之间的缓存对象,因此使⽤== 进⾏⽐较存在风险。优先使⽤equals进⾏⽐较
2、引⽤类型与值类型进⾏⽐较,由于会⾃动拆箱,因此使⽤==和equals都可以正确得到结果
3、建议在实际编码过程中,对数值的⽐较使⽤equals
深⼊总结:
不仅仅Integer,其他的基本类型也都存在缓存,下⾯给出⼀个简单图表进⾏说明
基本类型
装箱类型
取值范围
是否缓存
缓存范围
byte
Byte
-128~127
-128~127
short
Short
-2^15 ~ (2^15 - 1)
-128~127
int
Integer
-2^31 ~ (2^31 - 1)
-
128~127
long
Long
-2^63 ~ (2^63 - 1)
-128~127
float
Float
--
double
Double
--
boolean
Boolean
true、false
true、false
char
Character
\u0000 ~ \uffff
java valueof\u0000 ~ \uffff
Java博⼤精深,要想深⼊,基础必须要好,才能避免bug。
我们程序员的职责就是少写bug,这才是我们⼀直学习的动⼒。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。