Integer与Int比较 2022-06-07 09:18 119阅读 0赞 **1、Integer与Int比较** 首先看一段比较有意思的代码: Integer a = 1000,b=1000; Integer c = 100,d=100; System.out.println(a==b); System.out.println(c==d); 如果这道题你能得出正确答案,并能了解其中的原理的话。说明你基础还可以。如果你的答案 是 true 和true的话,你的基础就有所欠缺了。 首先公布下答案, 运行代码,我们会得到 false true。 我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。 public static Integer valueOf(int i) { return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; } private static final Integer[] SMALL_VALUES = new Integer[256]; static { for (int i = -128; i < 128; i++) { SMALL_VALUES[i + 128] = new Integer(i); } } 当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128到127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128到127之间的时候,引用的是同一个对象,所以结果是true。 再看一段代码: Integer a = new Integer(1000); int b = 1000; Integer c = new Integer(10); Integer d = new Integer(10); System.out.println(a == b); System.out.println(c == d); 这道题是继上一题的后续,如果这道题你能很快速的得出答案,那么恭喜你,==比较符你就算掌握的比较透彻了。 正确答案: true 、false 看到这个答案很多小伙伴又会不解,先来说下第二个,按第一题来说Integer不是把-128到127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。 **2、String** 看一段代码: String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1 == s3); 按照==的语法来看, 首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确实true、false。 第二个输出false可以理解,第一个输出true就又让人费解了。我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。 然而除此之外还有一块区域叫做常量池。 像我们通常想String s1 = “abc”; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = “abc”这样一个对象之后,”abc”就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2 = “abc” 的时候,Java底层会优先在常量池中查找是否存在”abc”,如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是为什么答案是true 和false的原因。
相关 解读Java中的int和Integer&&int和Integer的区别比较 > 在学习java中突然意识到Integer和int是不一样的,网上冲浪后记录一下,大家一起学习。 文章目录 Java的两种数据类型 Integer和int 喜欢ヅ旅行/ 2023年09月23日 14:32/ 0 赞/ 20 阅读
相关 Java:基本类型int与封装类Integer的比较 int和Integer的区别 1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 朱雀/ 2023年03月13日 15:25/ 0 赞/ 136 阅读
相关 java中int与Integer用==比较 详解 Integer a =new Integer(100); Integer b =new Integer(100); Integer c =new Int 以你之姓@/ 2022年12月10日 14:43/ 0 赞/ 105 阅读
相关 Integer 与int 赋值比较 测试代码: ![复制代码][copycode.gif] @Test public void IntegerTest() { 超、凢脫俗/ 2022年06月11日 08:42/ 0 赞/ 106 阅读
相关 Integer与Int比较 1、Integer与Int比较 首先看一段比较有意思的代码: Integer a = 1000,b=1000; Integer c = 100,d=100 淩亂°似流年/ 2022年06月07日 09:18/ 0 赞/ 120 阅读
相关 Integer与int的比较与区别 如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。但是如果面试官再问一下In 迷南。/ 2022年05月21日 20:39/ 0 赞/ 104 阅读
相关 Integer、int比较的有趣题目 实例一: public class A { public static void main(String[] args) { 客官°小女子只卖身不卖艺/ 2022年05月15日 06:42/ 0 赞/ 108 阅读
相关 Java里Integer与int的比较 参考:[https://www.cnblogs.com/dazuihou/p/3567821.html][https_www.cnblogs.com_dazuihou_p_35 雨点打透心脏的1/2处/ 2022年03月02日 09:08/ 0 赞/ 142 阅读
相关 Integer与int的种种比较你知道多少? 如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。但是如果面试官再问一下In ﹏ヽ暗。殇╰゛Y/ 2022年02月02日 09:09/ 0 赞/ 133 阅读
相关 int与Integer的区别 1.int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。 2.int的默认值为0,而Integer的 àì夳堔傛蜴生んèń/ 2021年06月24日 16:10/ 0 赞/ 348 阅读
还没有评论,来说两句吧...