Java基础 (2) - 基本数据类型及包装类

关键字 -> 位数、常量池、包装类(自动装拆箱)

一、8种基本数据类型

整数类型:byte,short,int,long

浮点数类型:float(4B),double (8B)

字符类型:char (2B)

布尔类型:boolean (1B 或 4B)

 

二、位数

1、JVM规范中,boolean作为int处理,占4字节 ,boolean数组当做byte数组,占1个字节。

2、byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256。

 

三、包装类

能解决

1、基本类型并不具备对象的特性: 没有成员变量,方法可以调用。

2、不支持面向对象的变成机制(不可变)

 

种类

Byte,Short,Integer,Long,Double,Float,Charater,Boolean。

JDK1.5,开始提供自动装箱和拆箱功能,基本类型变量赋给对应的包装类变量称之为装箱。自动拆箱与之相反。

Java 7增强了包装类的功能,为所有的包装类提供了一个静态的compare(xxx val1,xxx val2)方法,来比较两个基本类型值得大小。(解决 两个128自动装箱后,比较它们的大小并不相等问题)

Java 8再次增强包装类的功能,可以支持无符号运算。

 

基本类型和包装类区别

1、声明方式不同:包装类型需要使用new关键字来在堆中分配存储空间,基本类型不需要。

2、存储方式及位置不同:基本类型存储在栈中,而包装类型是在堆中,然后通过引用来使用。

3、初始值不同:包装类型的初始值为null,基本类型的初始值 eg:int -> 0,boolean ->false。

4、使用场景不同:常用的集合如Collection、Map时必须使用包装类(不可变性)。

 

常量池

好处:

1、节省内存空间

2、提高运行效率

包装类

Byte,Short,Integer,Long,Character,Boolean 6种 ,在 -128 ~ 127中用到常量池,会自动拆箱装箱,其余数字范围则会新建实例

两种浮点数类型的包装类Float,Double并没有实现常量池技术

 

基础类型

被final修饰时:

  如果是成员变量,一定会存入常量池,比如变量b;

  如果是局部变量,既不会存入常量池,也不在栈中;

 

没有被final修饰时:

  不管是成员变量还是局部变量,都不一定会被存入常量池,int类型的变量会以2的15次方为基准,大于等于这个数就会存入常量池,小于则不会;

  但是double类型1d不会,2d会,这个原因也没找到是为什么;

 

 

四、包装类常见问题

1.数值包装类

/** Integer案例**/

      Integer i1 = 128;

      Integer i2 = 128;

      Integer i3 = 127;

      Integer i4 = 127;

      System.out.println(i1 == i2);//false

      System.out.println(i3==i4); //true

  

/** Long案例**/

      Long l1 = 128L;

      Long l2 = 128L;

      Long l3 = -128L;

      Long l4 = -128L;

      System.out.println(l1 == l2);//false

      System.out.println(l3==l4);//true

   

/**Float(Double)案例(形成对比)**/

     Float f1 = 128f;

     Float f2 = 128f;

     Float f3 = 127f;

     Float f4 = 127f;

     System.out.println(f1 == f2);//false

     System.out.println(f3==f4);//false

 

2、原理

因为Byte,Integer,Long对在-128~127之间的数据进行了缓存,如果待转换的数值 i 在该范围了则直接从缓存取,而不是new Integer(i)。

    Float和Double则是每次都new一个新的,没有缓存机制,所以都为false。

 

3、JDK源码:

/**Integer的实现**/

public static Integer valueOf(int i) {

        if(i >= -128 && i <= IntegerCache.high)

            return IntegerCache.cache[i + 128];//IntegerCache.high为127,取缓存

        else

            return new Integer(i);

    }

/**Long的实现**/

  public static Long valueOf(long l) {

final int offset = 128;

if (l >= -128 && l <= 127) { // will cache

    return LongCache.cache[(int)l + offset];

}

        return new Long(l);

    }

/**Float的实现(无缓存)**/

  public static Float valueOf(float f) {

        return new Float(f);

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值