Nivelle 开拓视野冲破艰险看见世界 身临其境贴近彼此感受生活

原生类型

2017-10-29
nivelle

定义

原生类型就是java中不属于对象的那5%的部分

包含:boolean,byte,short,char,int,float,long,double这8种常见的数据类型,包装后的对象按照规则存储在堆中,而”线程栈”上只存储引用地址.对象自然会占用较大的空间存放在堆中,在原生态类型中,”栈”上直接保存了它们的值,而不是引用.

Interger a =1;
Interger b=1;

Interger c=200;
Interger d=200;

a==b;//true
c==d;//false

在编译阶段,若将原始类型int赋值给Interger类型,就会将原始类型自动编译为Integer.valueOf(int);如果将Integer类型赋值给int类型,则会自动转换调用intValue()方法.

Integer.valueOf(int)方法源码:

public static Integer valueOf(int i){
    if(i>=-128&&i<=IntegerCache.high)
    
    return IntegerCache[i+128];
    
    else
    
    return new Interger(i);
}


在默认情况下,IntergetCache.high是127,也就是说,如果传入-128~127之间的数字,那么通过Integer.valueOf(int)得到的对象时被cache的,自然的,对于同一个数字cache的对象时同一块儿内存地址,所以第一个输出true,第二个输出已经不在这个范围,因此会重新new Integer(int),所以为false.

我们可以通过设置JVM启动参数-Djava.lang.Interger.IntergerCache.high=200来间接设置IntegerCache.high值,也可以通过设置参数-XX:AutoBoxCacheMax来达到目的.

同理:

  • Boolean的两个值true和false都是在cache在内存中的,无须做任何改造,自己new Boolean是另外一块空间

  • Byte的256个值全部cache在内存中,和自己new Byte操作得到的对象不是一块儿空间

  • Short,Long两种类型的cache范围为-128~127,无法调整最大尺寸,即每月设置,代码中完全写死,如果要拓展,需要自己来做.

  • Float,Double没有cache,要在实际场景中cache需要自己操作.


数字间的比较:

  • 当Integer与int类型比较的时候,会将Integer转化为int类型来比较(也就是通过调用intValue()方法返回数字),直接比较数字

  • Integer做比较的时候,Integer会自动拆箱,就是比较他们的数字值

  • switch case为选择语句,匹配的时候不会用equals(),而是自己用”==”.而在switch case语句中,语法层面case部分不能写Integer对象的,只能是普通数字,如果是普通数字就会将传入的Integer自动拆箱.

  • 反射中,对于Integer属性不能使用field.setInt()和field.getInt()操作.


上一篇 连接池线程池

下一篇 异步并发

评论