每日一句
昨日翻译
Suffering is the most powerful teacher of life.
苦难是人生最强大的老师
今日名言
Great hopes make great men.
2019.03.09问题及解析
public class IntegerTest { public static void main(String[] args) { Integer num1 = 1; Integer num2 = 1; Integer num3 = 222; Integer num4 = 222; System.out.println(num1==num2); System.out.println(num3==num4); }}
请问上述程序的输出结果是什么?
答案与解析
跑过代码的小伙伴们都知道,输出的结果是:
true
false
这是为什么呢?这明明看着都是一模一样的,为什么却会输出两个截然不同的结果呢?
我们就得了解一下java.lang.Integer类,我们都知道基本数据类型中有一个int,这个Integer看着和它好像,他们之间会不会有什么联系呢?
我们一起来看一下Integer的API中说了什么
The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.
Integer类以一个对象的方式包裹了一个基本类型int的值。一个object类型的Integer包含了包含了一个类型是int类型的单独的成员变量。
In addition, this class provides several methods for converting an int to a String and a String to an int, as well as other constants and methods useful when dealing with an int.
并且这个类提供了多种方法,比如转换一个int类型为一个String类型,或者把一个String类型转换为int类型,还包含了其他当你要处理int时有用的常量和方法
原来这个类包含了处理int的各种方法和常量,开始提到了一个单词wraps,就是包裹的意思,那么我们java中也就习惯把这种和Integer相似的类统一称作包装类。
那么Integer是一个类,所以我们用“==”进行比较时,必然是比较的是地址,而不是值,那就说明赋值1给它时,他们指向的是同一个对象,这到底是发生了什么呢?
我们来看一下Integer中有一个私有的静态内部类IntegerCache,看一下看它的注释
* Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class.* Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache is initialized on first usage. The size of the cache* may be controlled by the {@code -XX:AutoBoxCacheMax=} option.* During VM initialization, java.lang.Integer.IntegerCache.high property* may be set and saved in the private system properties in the* sun.misc.VM class.
那么这里提到了当我们给一个-128到127的值进行自动包装时(也就是我们经常听到的装箱),它用来支持他们成为同一个身份。
根据他的类名,Integer缓存,也就是通过缓存的方式当我们给-128到127的值包装时会指向同一个对象,所以开始我们的num1==num2返回了true,同时我们的值可以不用是1,而是-128到127的任何一个数,他们都会返回true。
后面的false自然是num3、num4都重新创建了新的对象,他们指向的地址自然不同,因此返回false
所以最终会返回
true
false
今天又不得不表扬Carlos?和lmbby小伙伴了,希望大家都去看看他们的留言,能学到很多拆装箱的知识哦!
坚持总会有回报的,大家加油!
2019.03.10问题
public class StringTest {// static String s;//语句1 public static void main(String[] args) {// String s;//语句2 System.out.println("s="+s); }}
1.请问取消语句1的注释会输出什么?
2.请问取消语句2的注释会输出什么?
3.请问取消语句1和语句2的注释会输出什么?
往期回顾(3.5~3.9)
java每日一练(19_03_05) (System.out.println();的调用)
java每日一练(19_03_06) (基本数据类型的相互转换)
java每日一练(19_03_07) (MVC框架)
java每日一练(19_03_08) (程序题 异常 输出)
java每日一练(19_03_09) (程序的输出结果)
少年少女们,和我签订契约~变得更强吧!
眼过千遍,不如手过一遍,一定一定要把自己的想法写出来(想法不论对错,写你所想就是进步),这样才会有所收获,你的每一个留言和分享小刀都会认真回复,彼此学习共同进步~
END