声明:本文为博主转载文章,原文地址见文末。
知识点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区别以及integer.values()方法详解的详细内容。