当前位置: 首页 > 科技观察

乱谈:如何向女友解释为什么Java中“1000==1000”为假,而“100==100”为真?

时间:2023-03-12 09:01:23 科技观察

publicstaticvoidmain(String[]args){Integerinteger1=100;Integerinteger2=100;System.out.println(integer1==integer2);Integerinteger3=1000;Integerinteger4=1000;System.out.println(integer3==integer4);}以上代码,输出结果为:truefalse自动拆箱首先,在介绍自动拆箱之前,我们修改上面的代码,将变量类型从Integer改为int,重新执行上面的代码:publicstaticvoidmain(String[]args){ininteger1=100;ininteger2=100;System.out.println(integer1==integer2);ininteger3=1000;ininteger4=1000;System.out.println(integer3==integer4);}输出结果is:truetrue那么,int和Integer有什么区别呢?Int是一种基本数据类型,而Integer是一个包装类。因为Java是面向对象的语言,所以很多地方需要用对象来代替基本数据类型,比如集合中的元素必须是对象类型。因此,Java物种为所有的基本类型都提供了相应的包装类,int对应的包装类就是Integer。有了基本数据类型和封装类,就需要相互转换。将基本类型转换为包装类的过程称为装箱,反之称为拆箱。在JavaSE5中,为了减少开发者的工作量,Java提供了自动拆箱和自动装箱的功能。自动装箱:就是将基本数据类型自动转换成相应的包装类。自动拆箱:就是将包装类自动转换成对应的基本数据类型。在我们的第一个示例中,我们使用Integerinteger1=100定义并初始化了一个变量;.这次涉及到自动装箱。因为100是基本类型int,需要赋值给包装类型对象integer1,此时进行了一次自动装箱。整数integer1=100;实际上是一种简化的写法Integeri=newInteger(10);因为Java提供了自动装箱的功能。自动装箱缓存机制JavaSE的自动拆箱也提供了与缓存相关的功能。为了节省内存和提高性能,Java提供了多种封装类型的缓存机制,可以在自动装箱过程中将一些对象放入缓存中,实现对象的复用。比如Byte、Short、Integer、Long、Character等都支持缓存。对于Integer,里面有一个IntegerCache的内部类。它缓存整数值在-128和+127之间的对象。当Integer类第一次被使用时,这个缓存会被初始化。稍后,可以使用缓存中包含的实例对象而不是创建新实例(在自动装箱的情况下)。也就是说,当我们自动装箱一个数值在-128到+127之间的数字时,我们不是每次都创建一个新的对象,而是直接从缓存中取出一个缓存对象。==什么是比较知道了autoboxing和它的缓存机制,接下来我们来看一下。当我们在代码中使用==来比较两个对象时,比较的是什么?很多人会认为,对于整数类型,比较的当然是整数的值,其实不然。==在Java中比较对象的地址。如果两个对象的地址相同,则返回真,否则返回假。因此,因为自动装箱,因为缓存机制,因为==比较地址。所以比较-128到+127这两个Integer时,因为都是从缓存中取出的同一个对象,所以对象的地址相同,返回true。对于1000,因为不在缓存范围内,每次都会创建一个新的对象,所以会返回false。但需要注意的是,只有自动装箱时才有缓存机制,与构造函数中的缓存无关,比如下面的代码:Integerinteger1=newInteger(100);Integerinteger2=newInteger(100);System.out。println(整数1==整数2);输出结果为false作者简介:漫画编程,是以漫画+音频的形式讲解枯燥编程知识的公众号。致力于让编程变得更有趣。本文转载自微信公众号“漫花编程”,可通过以下二维码关注。转载本文请联系漫花编程公众号。

最新推荐
猜你喜欢