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

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

8种基本数据类型
整数类型:byte,short,int,long
浮点数类型:float,double
字符类型:char
布尔类型:boolean缓存

位数
一、JVM规范中,boolean做为int处理,占4字节 ,boolean数组当作byte数组,占1个字节。
二、byte类型是1byte也就是8位,能够表示的数字是-128到127,由于还有一个0,加起来一共是256。ide

包装类
能解决
一、基本类型并不具有对象的特性: 没有成员变量,方法能够调用。
二、不支持面向对象的变成机制(不可变),包装类。Byte,Short,Integer,Long,Double,Float,Charater,Boolean。对象

JDK1.5,开始提供自动装箱和拆箱功能,基本类型变量赋给对应的包装类变量称之为装箱。自动拆箱与之相反。
Java 7加强了包装类的功能,为全部的包装类提供了一个静态的compare(xxx val1,xxx val2)方法,来比较两个基本类型值得大小。(解决 两个128自动装箱后,比较它们的大小并不相等问题)
Java 8再次加强包装类的功能,能够支持无符号运算。内存

基本类型和包装类区别
一、声明方式不一样:包装类型须要使用new关键字来在堆中分配存储空间,基本类型不须要。
二、存储方式及位置不一样:基本类型存储在栈中,而包装类型是在堆中,而后经过引用来使用。
三、初始值不一样:包装类型的初始值为null,基本类型的初始值 eg:int -> 0,boolean ->false。
四、使用场景不一样:经常使用的集合如Collection、Map时必须使用包装类(不可变性)。源码

常量池
好处:
一、节省内存空间
二、提升运行效率
包装类
Byte,Short,Integer,Long,Character,Boolean 5种 ,在 -128 ~ 127中用到常量池,会自动拆箱装箱,其他数字范围则会新建实例
两种浮点数类型的包装类Float,Double并无实现常量池技术it

基础类型
被final修饰时:
  若是是成员变量,必定会存入常量池,好比变量b;
  若是是局部变量,既不会存入常量池,也不在栈中;io

没有被final修饰时:
  无论是成员变量仍是局部变量,都不必定会被存入常量池,int类型的变量会以2的15次方为基准,大于等于这个数就会存入常量池,小于则不会;
  可是double类型1d不会,2d会,这个缘由也没找到是为何;class

包装类常见问题
一.数值包装类
/ 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效率

二.原理
由于Byte,Integer,Long对在-128~127之间的数据进行了缓存,若是待转换的数值 i 在该范围了则直接从缓存取,而不是new Integer(i)。
    Float和Double则是每次都new一个新的,没有缓存机制,因此都为false。

三.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);}

相关文章
相关标签/搜索