Java基础之基本类型和引用类型

类型介绍

java基本类型:

  java中基本数据类型有8种,可分为三类,布尔类型 boolean,字符类型char,数值类型。数值类型又分为整数类型byte、short、int、long,浮点类型float、double

名称 类型 字节 范围 表现方式 包装类
byte 最小类型 1 -128~127 byte a=0; Byte
short 短整型 2 -32768~32717 short a=0; Short
int 整型 4 -32768~32717 int a=0; Integer
long 长整型 8 -263~263-1 long a=0L; Long
double 双精度浮点型 8 * double a=0.00; Double
float 浮点型 4 6~7 float a=0.0f;或float a=0.0F; Float
char 字符型 2(1字符为2字节) 0~65535 char a='a'; Character
boolean 布尔类型 1 - boolean a=false; Boolean

注意:8位(bit)为1字节


引用类型:

  java中引用类型:一切对象(class、interfac、array)皆为引用类型。

内存分配

基本含义:

  1.基本数据类型直接存储在栈内,数据本身的值也存在栈空间内,而8种数据类型就是它们的存储模型。
  2.引用类型是按照存储对象的内存模型来进行数据存储的,其中"引用"存储在有序的内存栈上,对象本身的值存储在内存堆上。
  3.从中我们可以看出基本类型和引用类型的区别主要在于堆栈分配上。从下方代码示例来进行更为直观的感受。

代码示例:

    String a=new String("abc"); 
    String b=new String("abc"); 
    System.out.println(a==b); 
    System.out.println(a.equals(b));

  上述代码中打印的结果为false,true,因为我们知道在java中==如果是基本类型比较两者的数值,如果是引用类型比较的是两者的内存地址,而equals()则比较的是两者的数据,所以在上述代码中创建了两个String对象,用了两种方法进行比较得出基本类型和引用类型的堆栈区别。

自动拆箱、自动装箱

基本含义:

  java在1.5之后引入了自动拆箱和自动装箱,基本类型自动转化成为包装类型称之为自动装箱,包装类自动转化为基本类型称之为自动装箱。

代码示例:

    Integer a=3; // 自动装箱
    int b=a; //自动装箱

缺点:

  1.由于装箱会隐式的创建对象,在创建对象的同时会增加垃圾回收器(GC)的压力,影响程序的性能,所以尽量避免使用包装类进行循环运算。
  2.拆箱过程中可能会产生空指针异常。

示例代码:

装箱错误的示范!

    Integer sum=0;
    for(int i=0;i<100;i++){
        sum+=i;
    }

装箱正确的示范!

    int sum=0;
    for(int i=0;i<100;i++){
        sum+=i;
    }

拆箱错误示范!

    Object obj=null;
    int i=(Integer)obj;

拆箱正确示范!

    Object obj=1;
    int i=(Integer)(obj==null?0:obj);

包装类和String类型转化的方法

简单介绍:

   包装类型和String都有其对应的.valueOf()方法,并且Byte、Short、Integer、Long、Char这几个包装类的valueOf()方法都会做缓存,因为为他们的范围个数是有限的,但Float、Double这两个浮点数不是。或者进行强制类型转换(包装类之间不能进行强制类型转换)。

代码示例:

    Short a = 1;
    Integer b=Integer.valueOf(a); //通过方法进行类型转换
    Integer b= (int)a;//进行强制转换。

    // Integer.valueOf()的源码
    
    @HotSpotIntrinsicCandidate
    public static Integer valueOf(int i) {
        return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
    }

基本类型自动转化

前提和原因:

  1.两者类型彼此兼容。2.目的类型的空间范围一定大于转化的源类型。

正向转化: 由低字节向高字节自动转换

    //byte->short->int->long->float->double
    long a=1;
    float b=a; //正确
    int b=a; //错误

逆向转化:使用强制转化可能丢失精度:

int a = (int)(3.14);

你可能感兴趣的:(Java基础之基本类型和引用类型)