黑马程序员技术交流社区

标题: Java 数据类型总结 [打印本页]

作者: lucascgz    时间: 2015-12-7 22:53
标题: Java 数据类型总结

数据类型
--------------------------------------------------------------------------------
        java语言是强类型语言
        对于每一种数据都定义了明确的具体数据类型, 在内存中分配了不同大小的存储空间
        8种基本数据类型+3种引用数据类型 -> 共11种数据类型.

|-数据类型
        |-基本数据类型 primitive type
                |-数值型
                        |-整数类型        -> byte, short, int, long
                        |-浮点类型        -> float, double
                |-字符型        -> char
                |-布尔型        -> boolean
        |-引用数据类型 reference type
                |-类        -> class(包括 enum)
                |-接口        -> interface(包括 @interface)
                |-数组        ->[]
        说明: 整数默认 int, 小数默认 double

        自jdk1.1版本就有了基本数据类型的包装类
                Byte, Short, Integer, Long, Float, Double, Character, Boolean
        但是, 从jdk5.0起才有 auto boxing/unboxing 特性
--------------------------------------------------------------------------------
1.        整数类型
        byte                1*8        bit                -2^7~2^7-1                即 -128~+127
        short                2*8 bit                -2^15~2^15-1        即 -32768~32767
        int                        4*8 bit                -2^31~2^31-1        约 ±21 亿
        long                8*8 bit                -2^63~2^63-1        数值后+l或L, 如 long num = 32L;
                                                                                        建议+L, 因+l和数值1实在太像了, 易混淆

        注意:
                java中没有无符号整形. 最高位为符号位, 0为非负, 1 为负数
                int 和 byte        较常用, 整数类型默认为 int.
                ***虽然 long 占 8 字节, float 占 4字节,
                        但由于整数和浮点数在计算机中存储方式的不同, float 取值范围比 long 大!!!

                byte 和 short 类型主要用于特定的应用场合.
                如底层的文件处理(IO流)或者需要控制占用存储空间量的大数组

                byte, short 型基本不用于算术运算, 因为会被自动提升为 int 类型

                开发中: 尽量避免使用 int 以下的数据类型来定义变量
                        int age = 20; // 定义年龄
               
                注意各整数类型的范围, 当运算溢出时, 丢失精度!!!
                如 long height = 8848 * 1000 * 1000;
                // 右边的运算结果为 int 型, 但是运算结果为 88 亿, 已经超过 int 取值范围, 将溢出, 丢失精度!!!
                // 应修改为 long height = 8848 * 1000 * 1000L;
        ----------------------------------------
        //java.net 包中 InetAddress 对象常用 byte
        如        byte[] ip = {(byte)192,(byte)168,(byte)0,(byte)254,};
                for (byte b : ip )
                {
                        System.out.println(b);        //-64, -88, 0, -2
                }
        ----------------------------------------
        // 面试题
        System.out.println(12345 + 5432l);
        /*
        结果是 long 型的 17777.
        注意, 而不是int 型的 66666, 因为 5432l 实际上是 5432L.
        ***是, l(L) 和 1(数值) 实在太像了
        */
--------------------------------------------------------------------------------
2.        浮点类型
        float 和 double 主要差异在精度的不同.
        float                4*8 bit                单精度浮点数, 有效数字6~7位, 取值范围±3.4E38F
                                                        其数值后+f或F, 如 float num = 34.5F; 建议+F
        double                8*8 bit                双精度浮点数, 有效数字15位, 取值范围±1.7E308
                                                        其数值后+d或D, 但一般不加.
       
        还可以使用科学计数法表示小数: 如 1.1E2(110.0), -1.1E2F(110.0F).
        其中,
                小数部分(尾数部分) 可以为 (-10, 10)范围内的取值;
                指数部分, ??? 需要看浮点数在计算机中的存储?

        小数默认为 double

        只有很少的情况适合使用 float.
        如, 需要快速地处理单精度数据, 或者需要存储大量的数据.

        ***虽然 long 占 8 字节, float 占 4字节,
                但由于整数和浮点数在计算机中存储方式的不同, float 取值范围比 long 大!!!

        /*
         * 由于整数和浮点数在内存中存储方式的不同,
         * 虽然 float 占 4 个字节, 而 long 占 8 个字节, 但 float 可表示的数值范围比 long 大
         * 所以, long -> float 可以自动类型提升
         */
        System.out.println(Float.MAX_VALUE > Long.MAX_VALUE); // true
        System.out.println(Float.MIN_VALUE > Long.MIN_VALUE); // true


        System.out.println(Float.MAX_VALUE); // 3.4028235E38
        System.out.println(Float.MIN_VALUE); // 1.4E-45
       
        System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308
        System.out.println(Double.MIN_VALUE); // 4.9E-324
--------------------------------------------------------------------------------
3.        字符型
        char                2*8 bit                0~2^16-1        即 0~65535, 也即'\u0000'~'\uFFFF'

        取值范围为0~65535
        (1) 能将[0, 65535] 范围内的整数值或整型常量直接赋值给 char 常量/变量
                如 char ch = 65535;
                /*
                注意是整数值或整型常量, 而不是整型变量(对整数值);
                编译时, 编译器知道整数值和整型常量是否在 char 的取值范围内, 所以可以;
                但不知道整型变量的值是否在 char 取值范围内
                ch = 1L; // incompatible types: possible lossy conversion from long to char
                */
        (2)        *** 自动类型转换时, char 可自动转换为 int/long/float/double
        (3) 没有任何数据类型能自动转换为 char, 即使 byte/short 都不行(byte/short 存在负值, 而 char 没负值);
        (4) 注意: char 可以装中文, 都为2个字节. 如, char ch = '你';
                中文在内存中, 也是以2个字节存储的.
        (5) char 常量中只能是单个字符, 不可以多余一个也不可以没有
                char ch = '10'; // 编译错误. 包含的是2个字符, 而不是1个.
                char ch = ''; // 编译错误. 包含的是0个字符, 而不是1个.
        (6) 常见 ASCII 码
                '0'        ---> 48        // 其他数字类推
                'a'        ---> 65 // 其他小写字母类推
                'A'        ---> 97 // 其他大写字母类推
                '\n'---> 10 // 换行
                '\r'---> 13 // 回车

--------------------------------------------------------------------------------
4.        布尔型
        boolean                没说明占几个字节                true 和 false

        ***整型值和 boolean 值之间不能进行相互转换.
--------------------------------------------------------------------------------





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2