integer与int区别以及integer.values()方法详解
声明:本文为博主转载文章,原文地址见文末。
知识点1:integer和int的区别
/*
* int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,
* 而Integer的默认值为null
* ,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别
* ,则只能使用Integer
* 。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时
* ,结果为0,所以,int不适合作为web层的表单数据的类型。
* 在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的
* ,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
* 另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
*/
知识点2:integer.values()方法详解
1
2
3
|
System.out.println(Integer.valueOf( "127" )==Integer.valueOf( "127" )); System.out.println(Integer.valueOf( "128" )==Integer.valueOf( "128" )); System.out.println(Integer.parseInt( "128" )==Integer.valueOf( "128" )); |
为什么第一个判断返回了true
而第二个判断返回了false
?127
和128
有什么我不知道的区别吗?(当然除了127
小于128
…)
还有,为什么第三个判断返回了true
?
我看了另一个相关提问的回答,但是我还是不知道它们什么时候返回true还有为什么第二个判断返回false
。
回答#1:
Integer.valueOf(String)
确有一个不同寻常的行为。
valueOf
会返回一个Integer
(整型)对象,当被处理的字符串在-128
和127
(包含边界)之间时,返回的对象是预先缓存的。这就是为什么第一行的调用会返回true
-127
这个整型对象是被缓存的(所以两次valueOf
返回的是同一个对象)——第二行的调用返回false
是因为128
没有被缓存,所以每次调用,都会生成一个新的整型对象,
因此两个128
整型对象是不同的对象。
重要的是你要知道在上面的比较中,你实际进行比较的是integer.valueOf
返回的对象引用,所以当你比较缓存外的整型对象时,相等的判断不会返回true
,就算你
传个valueOf
的值是相等的也没用。(就像第二行中Integer.valueOf(128)==Integer.valueOf(128))
。想让这个判断返回true
,你需要使用equals()
方法。
parseInt()
返回的不是整型对象,而是一个int
型基础元素。这就是为什么最后一个判断会返回true
,第三行的判断中,在判断相等时,实际比较的是128 == 128
,
所以它必然是相等的。
再来说说第三种比较中的一点区别,使得它的结果与第二种比较不一样了:
一个unboxing conversion(一种比较时的转换,把对对象的引用转换为其对应的原子类型)在第三行的比较中发生了。因为比较操作符使用了==
同时等号的两边
存在一个int
型和一个Integer
对象的引用。这样的话,等号右边返回的Integer
对象被进一步转换成了int
数值,才与左边进行相等判断。
所以在转换完成后,你实际比较的是两个原子整型数值。这种转换正是你在比较两个原子类型时所期待看到的那样,所以你最终比较了128
等于128
。
回答#2:
Integer
类有一个静态缓存,存储了256个特殊的Integer
对象——每个对象分别对应`-128 和127之间的一个值。
有了这个概念,就可以知道上面三行代码之间的区别。
1
|
new Integer(123); |
显示创建了一个新的Integer
对象。
1
|
Integer.parseInt( "123" ); |
解析完字符串后返回一个int
值。
1
|
Integer.valueOf( "123" ); |
这种情况比其他的要更复杂一些。首先进行了字符串解析,然后如果解析的值位于-128
和127
之间,就会从静态缓存中返回对象。如果超出了这个范围,就会调用
Integer()
方法并将解析的值作为参数传入,得到一个新的对象。
现在,让我们看一下问题中的3个表达式。
1
|
Integer.valueOf( "127" )==Integer.valueOf( "127" ); |
上面的表达式返回true
,因为Integer
的值从静态缓存中取了2次,表达式返回了对象与自己比较的结果。因为只有一个Integer对象,所以返回结果为true
。
1
|
Integer.valueOf( "128" )==Integer.valueOf( "128" ); |
上面的表达式返回false
,因为128
没有存在静态缓冲区。所以每次在判断相等时等式两边都会创建新的Integer
对象。由于两个Integer
对象不同,所以==
只有等式
两边代表同一个对象时才会返回true
。因此,上面的等式返回false
。
1
|
Integer.parseInt( "128" )==Integer.valueOf( "128" ); |
上面的表达式比较的是左边的原始int
值128
与右边新创建的Integer
对象。但是因为int
和Integer
之间比较是没有意义的,所以Java在进行比较前会将Integer
自动拆箱,所以最后进行的是int
和int
值之间的比较。由于128
和自己相等,所以返回true
。
integer和int区别转自:绝地反击T博客
原文链接: stackoverflow 翻译: ImportNew.com- 靳禹
译文链接: http://www.importnew.com/9162.html
integer与int区别以及integer.values()方法详解的更多相关文章
- 数字内置方法详解(int/long/float/complex)
一.常用方法 1.1.int 以下是Python2.7的int内置函数: 序号 函数名 作用 举例 1 int.bit_length() 二进制存储这个整数至少需要多少bit(位). >> ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- Clone使用方法详解【转载】
博客引用地址:Clone使用方法详解 Clone使用方法详解 java“指针” Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文 ...
- Python数据类型及其方法详解
Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
- PHP PDO prepare()、execute()和bindParam()方法详解
每次将查询发送给MySQL服务器时,都必须解析该查询的语法,确保结构正确并能够执行.这是这个过程中必要的步骤,但也确实带来了一些开销.做一次是必要的,但如果反复地执行相同的查询,批量插入多行并只改变列 ...
- Java构造和解析Json数据的两种方法详解一——json-lib
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
随机推荐
- 五十行javascript代码实现简单的双向数据绑定
五十行javascript代码实现简单的双向数据绑定 Vue框架想必从事前端开发的同学都使用过,它的双向数据绑定机制能给我们带来很大的方便.今天闲着没事,尝试着实现一下双向数据绑定,接下来给大家分享一 ...
- Linux-进程描述(5)之进程环境
main函数和启动例程 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调 ...
- Native App和Web App 的差异
开发者们都知道在高端智能手机系统中有两种应用程序:一种是基于本地(操作系统)运行的APP:一种是基于高端机的浏览器运行的WebApp,本文将主要讲解后者. WebApp与Native App有何区别呢 ...
- 使用webpack打包css和js
1.安装webpack. npm install webpack -g 2.创建一个文件夹app. 3.新建文件test.js. require("!style-loader!css-loa ...
- 【转】QQ传输文件原理参考(来自互联网)
QQ的文件发送是怎样的过程呢?通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话.随即,发送计 ...
- Python:字符串的分片与索引、字符串的方法
这是关于Python的第3篇文章,主要介绍下字符串的分片与索引.字符串的方法. 字符串的分片与索引: 字符串可以用过string[X]来分片与索引.分片,简言之,就是从字符串总拿出一部分,储存在另一个 ...
- HTML5工具做屏幕自适应的两种方法
近一两年,HTML5在中国很火,也出了不少HTML5工具和模板.别的先不说,对于不同的H5工具,解决屏幕自适应问题的区别是什么? 简单来说,感应式设计是当用不同设备访问时,能够根据设备的宽度和高度对设 ...
- Django models Fild详解
本文参考自:django官方文档models/field 在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field o ...
- PHP获取Mp3文件信息
扫描本地MP3文件,获取文件信息
- OpenStack修复影响宿主机的QEMU漏洞CVE-2017-2615
距离这个虚拟化层面的漏洞公告发出已有两个多月了,漏洞详情可以查看: 360安全应急响应中心-360发现QEMU严重漏洞 影响国内大部分公有云 简单来说是通过Cirrus VGA操作读取宿主机内存中的内 ...