zoukankan      html  css  js  c++  java
  • Java数据类型

    基本类型和引用类型

    Java中的数据类型有两类:

    l  基本类型(又叫内置数据类型,或理解为值类型)

    l  引用类型

    基本类型和引用类型的区别

    1.  从概念方面来说

    基本类型:变量名指向具体的数值

    引用类型:变量名指向存数据对象的内存地址

    2.  从内存构建方面来说

    基本类型:变量在声明之后java就会立刻分配给他内存空间

    引用类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

    3.  从使用方面来说

    基本类型:使用时需要赋具体值,判断时使用“==”号

    引用类型:使用时可以赋null,判断时使用equals方法

    Java 基本类型

    ​Java的每种基本类型所占存储空间的大小是固定的。它们的大小不像其他大多数语言那样随机器硬件架构的变化而变化。这种不变性是Java程序相对其他大多数语言而言,更容易移植的原因之一。

    所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

    基本类型的分类

    与绝大多数编程语言类似,Java也支持数值型、字符型、布尔型数据。

    Java语言提供了8种基本类型,大致分为4

    整数型

    byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

    short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

    int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1

    long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1

    浮点型

    float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F

    double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

    字符型

    char:16位,存储Unicode码,用单引号赋值。

    布尔型

    boolean:只有true和false两个取值。

    基本类型取值范围表

    例:对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。

    publicclass PrimitiveDemo  {

         publicstaticvoid main(String[] args) {

             // byte

             System.out.printf("基本类型:byte 二进制位数:%d ", Byte.SIZE);

             System.out.printf("包装类:%s ", Byte.class.getName());

             System.out.printf("最小值(Byte.MIN_VALUE): 0x%x(十六进制), %d(十进制) ", Byte.MIN_VALUE,  Byte.MIN_VALUE);

             System.out.printf("最大值(Byte.MAX_VALUE): 0x%x(十六进制), %d(十进制) ", Byte.MAX_VALUE,  Byte.MAX_VALUE);

             // short

             System.out.printf("基本类型:short 二进制位数:%d ", Short.SIZE);

             System.out.printf("包装类:%s ", Short.class.getName());

             System.out.printf("最小值(Short.MIN_VALUE): 0x%x(十六进制), %d(十进制) ", Short.MIN_VALUE,  Short.MIN_VALUE);

             System.out.printf("最大值(Short.MAX_VALUE): 0x%x(十六进制), %d(十进制) ", Short.MAX_VALUE,  Short.MAX_VALUE);

             // int

             System.out.printf("基本类型:int 二进制位数:%d ", Integer.SIZE);

             System.out.printf("包装类:%s ", Integer.class.getName());

             System.out.printf("最小值(Integer.MIN_VALUE): 0x%x(十六进制), %d(十进制) ", Integer.MIN_VALUE,  Integer.MIN_VALUE);

             System.out.printf("最大值(Integer.MAX_VALUE): 0x%x(十六进制), %d(十进制) ", Integer.MAX_VALUE,  Integer.MAX_VALUE);

             // long

             System.out.printf("基本类型:long 二进制位数:%d ", Long.SIZE);

             System.out.printf("包装类:%s ", Long.class.getName());

             System.out.printf("最小值(Long.MIN_VALUE): 0x%x(十六进制), %d(十进制) ", Long.MIN_VALUE,  Long.MIN_VALUE);

             System.out.printf("最大值(Long.MAX_VALUE): 0x%x(十六进制), %d(十进制) ", Long.MAX_VALUE,  Long.MAX_VALUE);

             // float

             System.out.printf("基本类型:float 二进制位数:%d ", Float.SIZE);

             System.out.printf("包装类:%s ", Float.class.getName());

             System.out.printf("最小值(Float.MIN_VALUE): %s ", Float.toString(Float.MIN_VALUE));

             System.out.printf("最大值(Float.MAX_VALUE): %s ", Float.toString(Float.MAX_VALUE));

             // double

             System.out.printf("基本类型:double 二进制位数:%d ", Double.SIZE);

             System.out.printf("包装类:%s ", Double.class.getName());

             System.out.printf("最小值(Double.MIN_VALUE): %s ", Double.toString(Double.MIN_VALUE));

             System.out.printf("最大值(Double.MAX_VALUE): %s ", Double.toString(Double.MAX_VALUE));

             // char

             System.out.printf("基本类型:char 二进制位数:%d ", Character.SIZE);

             System.out.printf("包装类:%s ", Character.class.getName());

             System.out.printf("最小值(Character.MIN_VALUE): 0x%x(十六进制), %d(十进制) ", (int)  Character.MIN_VALUE, (int) Character.MIN_VALUE);

             System.out.printf("最大值(Character.MAX_VALUE): 0x%x(十六进制), %d(十进制) ", (int)  Character.MAX_VALUE, (int) Character.MAX_VALUE);

         }

    }

    输出:

    基本类型:byte 二进制位数:8

    包装类:java.lang.Byte

    最小值(Byte.MIN_VALUE):  0x80(十六进制), -128(十进制)

    最大值(Byte.MAX_VALUE):  0x7f(十六进制), 127(十进制)

    基本类型:short 二进制位数:16

    包装类:java.lang.Short

    最小值(Short.MIN_VALUE):  0x8000(十六进制), -32768(十进制)

    最大值(Short.MAX_VALUE):  0x7fff(十六进制), 32767(十进制)

    基本类型:int 二进制位数:32

    包装类:java.lang.Integer

    最小值(Integer.MIN_VALUE):  0x80000000(十六进制), -2147483648(十进制)

    最大值(Integer.MAX_VALUE):  0x7fffffff(十六进制), 2147483647(十进制)

    基本类型:long 二进制位数:64

    包装类:java.lang.Long

    最小值(Long.MIN_VALUE):  0x8000000000000000(十六进制),  -9223372036854775808(十进制)

    最大值(Long.MAX_VALUE):  0x7fffffffffffffff(十六进制),  9223372036854775807(十进制)

    基本类型:float 二进制位数:32

    包装类:java.lang.Float

    最小值(Float.MIN_VALUE):  1.4E-45

    最大值(Float.MAX_VALUE):  3.4028235E38

    基本类型:double 二进制位数:64

    包装类:java.lang.Double

    最小值(Double.MIN_VALUE):  4.9E-324

    最大值(Double.MAX_VALUE):  1.7976931348623157E308

    基本类型:char 二进制位数:16

    包装类:java.lang.Character

    最小值(Character.MIN_VALUE):  0x0(十六进制), 0(十进制)

    最大值(Character.MAX_VALUE):  0xffff(十六进制), 65535(十进制)

    数据类型间的转换

    自动转换

    一般情况下,定义了某数据类型的变量,就不能再随意转换。但是JAVA允许用户对基本类型做有限度的类型转换。

    如果符合以下条件,则JAVA将会自动做类型转换:

    1)由数据转换为数据

    显而易见的是,“小”数据类型的数值表示范围小于“大”数据类型的数值表示范围,即精度小于“大”数据类型。

    所以,如果“大”数据向“小”数据转换,会丢失数据精度。比如:long转为int,则超出int表示范围的数据将会丢失,导致结果的不确定性。

    反之,“小”数据向“大”数据转换,则不会存在数据丢失情况。由于这个原因,这种类型转换也称为扩大转换。 

    这些类型由“小”到“大”分别为:(byteshortchar)< int < long < float < double。 

    这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。

    2)转换前后的数据类型要兼容

    由于 boolean 类型只能存放 true  false,这与整数或字符是不兼容的,因此不可以做类型转换。

    3)整型类型和浮点型进行计算后,结果会转为浮点类型

    long x = 30;
    float y = 14.3f;
    System.out.println("x/y = " + x/y);

    运行结果

    x/y = 1.9607843

    可见 long 虽然精度大于 float 类型,但是结果为浮点数类型。

    强制转换

    在不符合自动转换条件时或者根据用户的需要,可以对数据类型做强制的转换。

    转换方式为:在数值的前面用一个括号"()"把要强制转换的类型标注出来。

    float f = 25.5f;
    int x = (int)f;
    System.out.println("x = " + x);

    装箱和拆箱

    Java中基本类型的包装类如下:

    Byte <-> byte

    Short <-> short

    Integer <-> int

    Long <-> long

    Float <-> float

    Double <-> double

    Character <-> char

    Boolean <-> boolean

    装箱

    装箱是将值类型转换为引用类型

    例:

    Integer i1 = new Integer(10); // 非自动装箱

    Integer i2 = 10; // 自动装箱

    System.out.println("i1 = " + i1);

    System.out.println("i2 = " + i2);

    拆箱

    拆箱是将引用类型转换为值类型

    int i1 = new Integer(10); // 自动拆箱

    Integer tmp = new Integer(20);

    int i2 = tmp.intValue(); // 非自动拆箱

    System.out.println("i1 = " + i1);

    System.out.println("i2 = " + i2);

    为何需要装箱

    一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意类型(因为Object是所有类的父类),以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。

    另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

    自动装箱、自动拆箱

    基本数据(Primitive)类型的自动装箱(boxing)、拆箱(unboxing)是自Java SE5开始提供的功能。

    Java SE5之前的形式:

    Integer i1 = new Integer(10); // 非自动装箱

    Java SE5之后:

    Integer i2 = 10; // 自动装箱

  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/deityjian/p/11408825.html
Copyright © 2011-2022 走看看