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类是类继 ...
随机推荐
- React的学习(下)
摘要 众所周知,前端三大框架Angular.React.Vue,所以为了跟上时代的步伐,最近开始着手学习React,这时候就发现个大问题,框架一直在更新,提倡的编写语法也在更新,网上有许多教程都是一两 ...
- linux下删除乱码文件、目录
由于编码原因,在linux服务器上上传.创建中文文件或目录时,会产生乱码,如果想删除它,发现用rm命令是删除不了的 这种情况下,用find命令可以删除乱码的文件或目录. 首先进入乱码文件或目录所在的目 ...
- Python中使用Mysql(安装篇)
准备工作 import MySQLdb Linux系统自带了Python,但并不是都有这个包,至少我每次拿到一台全新的服务器时候,都发现没有装这个包. 这个东西的下载地址是 http://source ...
- 蓝桥杯-打印大X-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- iOS 自动构建套件 - flow.ci + fir.im + Coding
编者按:本文转载自 flow.ci 用户 GitHub@mzying2013 的实践分享,原文链接这里. 前言 相信很多最开始接触自动构建都是从 Jenkins 开始的.都是纯手工搭建,本地代码创库也 ...
- __call()和__callStatic()实例详解
<?php class Demo { //第一个参数是方法名,第二个参数是方法参数,以数组形式传入 public function __call($method,$args) { //遍历参数$ ...
- MNIST机器学习
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片: 1. MNIST数据集 MNIST,是不是听起来特高端大气,不知道这个是什么东西? == 手写数字分类问题所要用到的(经典)MNIS ...
- java泛型探索——介绍篇
1. 泛型出现前后代码对比 先来看看泛型出现前,代码是这么写的: List words = new ArrayList(); words.add("Hello "); words. ...
- SSH小结
工作有一段时间了,经常用SSH登录远程机器,但对原理一直不是很了解,所以查阅了一些资料,写个小结. 一. SSH是什么? SSH的全称是Secure Shell, 是一种"用来在不安全的网络 ...
- centOS7下安装GUI图形界面
1.如何在centOS7下安装GUI图形界面 当你安装centOS7服务器版本的时候,系统默认是不会安装GUI的图形界面程序,这个需要手动安装CentOS7 Gnome GUI包. 2.在系统下使用命 ...