博舍

基本类型和包装类型的区别 ai2018和2019的区别

基本类型和包装类型的区别

1.基本类型有初始值,而包装类型的默认值是null数据类型默认值byte0short0int0long0Lfloat0.0fdouble0.0dchar‘/u0000’(空)booleanfalse2.包装类型可以为null,而基本类型不可以

在第一点我们说了,基本类型有初始值,而包装类型的默认值是null。而这也是为什么包装类型可以应用于POJO中,而基本类型则不行。在《阿里巴巴Java开发手册》中写到:

【强制】所有的POJO类属性必须使用包装数据类型。正例:数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE(NullPointerException)风险。

3.存储位置有所区别

如果一个基本类型是成员变量就存储在堆内存里,如果是局部变量就存储在栈内存里;而包装类型则存储的是堆中的引用

4.包装类型可用于泛型,而基本类型不可以

如果我们这么写Lista=newArrayList();编译器会报错:Typeargumentcannotbeofprimitivetype(类型参数不能为基本类型)这是为什么呢?因为泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除,最后只保留原始类型,而原始类型只能是Object类及其子类。这里有一道经典的测试题:

Lista=newArrayList();Listb=newArrayList();System.out.println(a.getClass()==b.getClass());

上述代码输出的结果为true,就是因为List和List在jvm中的Class都是List.class。

5.在使用“==”进行判断的时候的不同

我们来看一个例子:

Integera=newInteger(1);Integerb=newInteger(1);System.out.println(a==b);//falseSystem.out.println(a.equals(b));//true

包装类型是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,因此在使用==进行判断的时候,判断的是其指向的地址是否相等,若想判断它们的内容是否相等,需要使用equals()方法。而基本类型使用==直接判断其值是否相等。

6.自动装箱和自动拆箱

把基本类型转换成包装类型的过程叫做装箱(boxing)。反之,把包装类型转换成基本类型的过程叫做拆箱(unboxing)。

1)基本类型和包装类型进行==比较,包装类型会自动拆箱,直接和基本类型比较值inta=9;Integerb=9;System.out.println(a==b);

上述代码的结果为true。

2)当需要进行自动装箱时,如果数字在-128至127之间,会直接使用缓存中的对象,而不是重新创建一个对象。

这个知识我之前从未听闻,正是在写这篇文章的时候查看相关技术博客才了解到的,又学到了新知识!我们先来看这么一段代码:

IntegerA=199;inta=A;

执行第一句代码的时候,系统为我们执行了:IntegerA=Integer.valueOf(199);执行第二句代码的时候,系统为我们执行了:inta=A.intValue();

也就是说,自动装箱是通过Integer.valueOf()完成的;自动拆箱是通过Integer.intValue()完成的。理解了原理之后,我们开始进入正题:

Integera=100;Integerb=100;System.out.println(a==b);

上述代码的两个包装类型被赋值100后,都会进行自动装箱,那么==的结果是什么呢?答案是true。那么下面的输出结果是什么呢?

Integera=199;Integerb=199;System.out.println(a==b);

答案是false。

同样都是包装类型的赋值,比较结果却不一样,这是怎么回事呢???之前我们已经知道了,自动装箱是通过Integer.valueOf()完成的,那我们就来看看它的源码吧。

publicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i//highvaluemaybeconfiguredbypropertyinth=127;StringintegerCacheHighPropValue=VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if(integerCacheHighPropValue!=null){try{inti=parseInt(integerCacheHighPropValue);i=Math.max(i,127);//MaximumarraysizeisInteger.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE-(-low)-1);}catch(NumberFormatExceptionnfe){//Ifthepropertycannotbeparsedintoanint,ignoreit.}}high=h;cache=newInteger[(high-low)+1];intj=low;for(intk=0;k=127;}privateIntegerCache(){}}

看过源码之后,我们就可以明白怎么回事了:

在Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为-128~127时的Integer对象。

所以一开始的代码Integera=100;Integerb=100;System.out.println(a==b);的结果是true,因为100在-128~127范围之内,直接从缓存池中拿的。而Integera=199;Integerb=199;System.out.println(a==b);的结果是false,因为199不在这个范围之内,所以new出来了两个Integer对象。既然是new出来的,那就会在堆空间中产生不同的对象,不同的对象在进行==比较的时候,比较的是内存中的地址,不同对象的内存地址肯定不一样,所以返回false。

但是,我们再看一段代码

Integera=9999;Integerb=9999;System.out.println(a+1==b+1);

上述代码的运行结果是true,这是因为这2个包装类型的Integer在运算时会自动拆箱,变成2个基本数据类型的比较,相当于在判断

a.intValue()+1==b.intValue()+1

而两个基本数据类型比较时只看数值大小,故结果为true

第一次体会旅和游的区别

从7月2号到7月8号,这几天的时间,到重庆与成都旅游了一趟,说是旅游,主要是旅,因为大部分时间都是在路上渡过,真正的游,时间都好短。

因为飞机票,没有买到,只能坐高铁去。

从我们这里坐高铁到重庆,长达8个多小时,下午3点零9分的票,一直坐到晚上11点27分。从家到高铁站,高铁站到酒店,共计又是大概一个小时左右。

回来是从成都到我们家,也是差不多。上午10点42的车,一直坐到晚上7点27分。加上酒店到高铁站,高铁站到家的时间,也是差不多一个小时左右。

在重庆三天,在路上花费的时间也是好多。从酒店到景点基本上也是半天的时间,真正玩也就个把小时。

所以这次的旅游,真是主要在旅,不在游了。旅途时间长,游玩时间少。

好歹,重庆去过了,成都也去过去了,也许,这就够了。

希望下一次旅游时,能多点游玩的时间,在路上的时间能短一些。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇