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是引用类型,代表的是整形数字
上代码
public static void main(String[] args) throws Exception {
Integer integer = new Integer(0);
Integer mInteger = Integer.valueOf(0);
Integer sInteger = 0;
System.out.println(integer == mInteger);//false
System.out.println(integer == sInteger);//false
System.out.println(mInteger == sInteger);//true
System.out.println(memoryAddress(integer));
System.out.println(memoryAddress(mInteger));
System.out.println(memoryAddress(sInteger));
}
private static int memoryAddress(Object object) {
// 内存地址会有所不同
return System.identityHashCode(object);
}
执行结果:

分析:
1、执行结果和我们预想的不太一样,引用类型是在堆上存放的,每个引用的地址应该都不相同。但是mInteger == sInteger 执行结果为true,并且mInteger ,sInteger的内存地址是相同的。
2、要分析这个原因,我们需要了解Java设计者为了性能而进行的一些努力,查看Java源代码,可以看到Integer的valueof方法里面包含了一个缓存:其中IntegerCache.low =-127,IntegerCache.high=128
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
对于使用Integer.valueof()方法,如果数值是-127至128,那么会使用缓存对象,否则会new一个对象。
3、Integer sInteger = 0; 发生了什么呢?自动装箱,等价于Integer sInteger=Integer.valueOf(0)。通过这个,我们就可以得出比较等于true的原因了,都是从缓存中读取的对象,难怪内存地址会一致。
引用类型比较--Integer与Integer引用类型比较 使用equals
上代码:
public static void main(String[] args) throws Exception {
Integer integer = new Integer(0);
Integer mInteger = Integer.valueOf(0);
Integer sInteger = 0;
System.out.println(integer == mInteger);// false
System.out.println(integer == sInteger);// false
System.out.println(mInteger == sInteger);// true
System.out.println(memoryAddress(integer));
System.out.println(memoryAddress(mInteger));
System.out.println(memoryAddress(sInteger));
System.out.println(integer.equals(mInteger));//true
System.out.println(integer.equals(sInteger));//true
System.out.println(mInteger.equals(sInteger));//true
}
private static int memoryAddress(Object object) {
// 内存地址会有所不同
return System.identityHashCode(object);
}
分析:使用equals比较,只要数值相同,那么比较结果就是相同。查看Java源代码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
可以看到Integer的equals比较,其实比较的就是数值。
值类型之间的比较:int与int
上代码
int m=0;
int i=0;
int s=0;
System.out.println(m==i);//true
//值类型是没有equals方法
//System.out.println(m.equals(i));
分析:对于int 的比较,无需多言,本来就是数值比较。
Integer与int的比较:
Integer integer = new Integer(0);
Integer mInteger = Integer.valueOf(0);
Integer sInteger = 0;// 等价于Integer。valueof
int i = 0;
System.out.println(integer == i);//true
System.out.println(mInteger == i);//true
System.out.println(sInteger == i);//true
System.out.println(integer.equals(i));//true
System.out.println(mInteger.equals(i));//true
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 | -2^63 ~ (2^63 - 1) | 是 | -128~127 |
| float | Float | -- | 否 | |
| double | Double |
|
否 | |
| boolean | Boolean | true、false | 是 | true、false |
| char | Character | \u0000 ~ \uffff | 是 | \u0000 ~ \uffff |
Java博大精深,要想深入,基础必须要好,才能避免bug。
我们程序员的职责就是少写bug,这才是我们一直学习的动力。
Java基础之数据比较Integer、Short、int、short的更多相关文章
- java基础解析系列(二)---Integer
java基础解析系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java基础解析 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Java基础【基本数据类型包装类、int与String 之间的相互转换】
为什么会有基本类型包装类? 将基本类型数据类型封装成对象,这样的好处可以在对象中定义更多方法操作该数据. 包装类常用的操作就是用于基本数据类型与字符串之间的转换 问题:int a=100; 为什么不能 ...
- Java数据类型中String、Integer、int相互间的转换
1.Integer转换成int的方法 Integer i; int k = i.intValue(); 即Integer.intValue(); 2.int转换成Integer int i; Int ...
- 【Java面试题】5 Integer的int 的种种比较?详细分析
如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...
- (备忘)Java数据类型中String、Integer、int相互间的转换
1.Integer转换成int的方法 Integer i; int k = i.intValue();即Integer.intValue(); 2.int转换成Integer int i; Integ ...
- Java基础:整型数组(int[]、Integer[])排序
Windows 10家庭中文版,java version "1.8.0_152",Eclipse Oxygen.1a Release (4.7.1a), 参考链接:http://w ...
- java基础之数据类型转换
在写java程序时,经常会遇到需要数据类型转换,下面我们来介绍一些一些基本数据类型之间的转换. 1.int,folat,double,boolean,long 转换成字符串,其实很简单只需使用一个函数 ...
- java基础类型数据与String类包装类之间的转换与理解
数据类型转换一般分为三种: 在java中整型,实型,字符型视为简单数据类型,这些数据类型由低到高分别为:(byte,short,char--int-long-float-double) 简单数据类型之 ...
随机推荐
- 品牌电脑硬盘损坏后,使用MediaCreationTool从微软官方下载正版Windows到USB做安装盘
最近我的一台台式机电脑的硬盘损坏了.一开始是速度逐渐变慢,后来慢得难以忍受,有时半天无响应.查看 Windows event ,发现有 id 为 7 的磁盘报错.使用 Windows 8.1 家庭版自 ...
- 如何设置访问内网web项目
1.若我的项目搭建在一个linux虚拟机上 2.在内网的一台电脑做以下配置 3.测试访问 ******************************************************* ...
- HashMap和Hashtable的同和不同(详细比较)
一.综述 可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值.虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据h ...
- [20190324]奇怪的GV$FILESPACE_USAGE视图.txt
[20190324]奇怪的GV$FILESPACE_USAGE视图.txt--//发现GV$FILESPACE_USAGE定义很奇怪,做一个记录.1.环境:SCOTT@book> @ ver1P ...
- Angular的MVC理解--节自Adam Free的Pro angularv2
1. 定义 Angular的核心是采用MVC模式,即Model-View-Controller,也即MVW,Model-View-Whatever. 如下图所示,借助于ASP.NET的MVC模式来描述 ...
- iOS弹出UIViewController小视图
在TestViewController1中弹出TestViewController2 在TestViewController中点击按钮或者什么触发方法里面写入以下代码 TestViewControll ...
- 数据结构【查找】—B树
/*********************讲解后期补充*****************/ 先上代码 #include "000库函数.h" #define MAXSIZE 10 ...
- 微信小程序跳转微信小程序新增配置项目 navigateToMiniProgramAppIdList
每个小程序可跳转的其他小程序数量限制为不超过 10 个 从 2.4.0 版本以及指定日期(具体待定)开始,开发者提交新版小程序代码时,如使用了跳转其他小程序功能,则需要在代码配置中声明将要跳转的小程序 ...
- PHP到底有多牛?你所知道的网站都在用它
PHP到底有多牛?你所知道的网站都在用它 提起PHP,很多人的第一印象就是网站开发,确实,在网站开发方面,PHP难逢对手,当之无愧是“世界上最好的语言”. 有数据显示,目前全球5000万互联网网站中, ...
- js 常用的比较排序算法总结
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚, ...