• Java数据类型


    目录:

    Java语言支持的类型

    基本数据类型

    引用类型

    空类型(null type)

    1.整型

    2.字符型

    3.浮点型

    4.布尔型


     

    Java语言是强类型语言,意思是每个变量和每个表达式都有一个在编译时就确定的类型,也就是:所有变量必须先声明,后使用。

     

     

    Java语言支持的类型分为两类:

    ①基本类型(Primitive Type)

    ②引用类型(Reference Type)

     

    1 基本数据类型包括:boolean类型和数值类型。
    2 
    3                         ⊥数值类型有:整数类型和浮点类型。
    4 
    5                        ⊥整数类型包括:byteshortintlongchar(字符型也是一种整数类型)
    6                                     ⊥浮点类型:floatdouble

     

    引用类型包括:类、接口和数组类型,还有一种特殊的null类型。 

    所谓引用类型就是对一个对象的引用,对象包括【实例】和【数组】两种。
    引用类型就是一个指针,只是Java语言不再使用指针这个说法。

     


     

    空类型(null type):就是null值的类型,这种类型没有名称。因为null类型没有名称,所以不可能声明一个null类型的变量或者转换到null类型。

    空引用(null)是null类型变量唯一的值。

    空引用(null)可以转换为任何引用类型。

      在实际开发中,程序员可以忽略null类型,假定null只是引用类型的一个特殊直接量。

    注意:空引用(null)只能被 转换成→ 引用类型不能转换成基本类型 ,因此不能把一个null值赋给基本数据类型。

     


     

     

    1.整型 

        通常所说的整型,实际指的是如下4中类型。

        byte:一个byte类型整数在内存里占8位,表示范围:-128(-27)~127(27-1)

        short:一个short类型整数在内存里占16位,表示范围-32,768‬(-215) ~ 32767(215-1)

        int:一个int类型整数在内存里占32位,表示范围是:-2147483648(-231)~2147483647(231-1)

        long:一个long类型整数在内存里占64位,表示范围是:-9223 372036 854775 808(-263)~ 9223 372036 854775 807(263-1)

        

        int是最常用的整数类型,因此在通常情况下,一个Java整数常量默认就是int类型。

        除此之外,有如下两种情形必须指出

        ★如果直接将一个较小的整数常量(在byte或short类型的表示范围内)赋给一个byte或short变量,系统会自动把这个整数变量当成byte或short类型来处理。

        ★如果使用一个巨大的整数常量(超出了int类型的表示范围)时,Java不会自动把这个整数常量当成long类型来处理。如果希望系统把一个整数常量当成long类型来处理,应在这个整数常量后增加 l 或 L 作为后缀。通常推荐使用L,因为字母 l 很容易和 1搞混。

        下面的代码片段验证了上面的结论。

        程序:IntegerValTest.java

    1 //下面代码是正确的,系统会自动把56当成byte类型处理
    2 byte a = 56;
    3 
    4 //下面代码是错误的,系统不会把9999999999999当成long类型处理,所以超过int的表示范围,从而引起错误
    5 long bigValue = 9999999999999;
    6 
    7 //下面代码是正确的,在巨大的整数常量后使用L后缀,强制使用long了类型
    8 long bigValue2 = 9223372036854775807L;

     

        注意:可以把一个较小的整数常量(在int类型的表示范围内)直接赋给一个long类型的变量,这并不是因为Java会把这个较小的整数常量当成long类型来处理,Java依然把这个整数常量当成int类型来处理,只是这个int的类型的值会自动类型转换到long类型。

     

        Java中整型变量有4种表示方式:二进制、十进制、八进制和十六进制,其中八进制的整数常量以0开头,十六机制的整数常量以0x或0X开头,其中10-15分别以a~f来表示(此处的a~f不区分大小写)。

     

        下面的代码片段分别使用八进制和十六进制的数。

        程序IntegerValTest.java

    1 //以0开头的整数常量是八进制的整数
    2 int octalValue = 013;
    3 
    4 //以0x或0X开头的整数常量是十六进制的整数
    5 int hexValue1 = 0x13;
    6 int hexValue2 = 0xaF;

        

       二进制整数:

       在某些时候,程序需要直接使用二进制整数,二进制整数更“真实”,更能表达整数在内存中的存在形式。不仅如此,有些程序(尤其在开发一些游戏时)使用二进制整数会更便捷。

       Java7新增了对二进制整数的支持,二进制的整数以0b或0B开头。

       程序片段如下: 

     1 //定义两个8位的二进制整数
     2 int binVal1 = 0b11010100;
     3 
     4 byte binVal2 = 0b01101001;
     5 
     6 //定义一个32位的二进制整数,最高位是符号位
     7 int binVal3 = 0B10000000000000000000000000000011;
     8 
     9 System.out.println(binVal1);//输出212
    10 System.out.println(binVal2);//输出105
    11 System.out.println(binVal3);//输出-2147483645

        从上面的粗体字可以看出,当定义32位的二进制整数时,表明它是一个负数,负数在计算机里是以补码的形式存在的,因此还需要换算成原码

     

        提示:

        所有数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数。

        但计算机以补码的形式保存所有的整数。

        补码的计算规则:

            整数的补码和原码完全相同,负数的补码是其反码加1;

            反码是对原码的按位取反,只是最高位(符号位)保持不变。

     

     将上面的二进制整数binVal3转换成十进制的过程如下图所示(二进制整数转换成十进制):

     

        正如前面所指出的,一个Java整数常量默认就是int类型,因此使用二进制形式定义整数时,二进制整数默认占32位,其中第32位符号位

        如果在二进制整数后添加l或L后缀,那么这个二进制整数默认占64位,其中第64位是符号位。

        例如,如下程序:

     1 // 定义一个8位的二进制整数,该数值默认占32位,因此它是一个正数。
     2 //只是强制类型转换成byte时产生了溢出,最终导致binVal4变成了-23
     3 
     4 byte binVal4 = (byte)0b11101001;
     5 
     6 // 定义一个32位的二进制整数,最高位是符号位,但由于数值后添加了L后缀,因此该整数实际占64位,第32位的1不是符号位。
     7 // 因此binVal5的值等于2的31次方+2+1
     8 
     9 long binVal5 = 0B10000000000000000000000000000011L;
    10 
    11 System.out.println(binVal4); // 输出-23
    12 System.out.println(binVal5); // 输出2147483651

     

         上面程序中粗体字代码与前面程序片段的粗体字代码基本相同,只是在定义二进制整数时添加了'L'后缀,这就表明把它当成浪long类型处理,因此该整数实际占64位,此时的第32位不再是符号位,因此它依然是一个正数。

        至于程序中的byte binVal4 = (byte)0b11101001; 代码,其中0b11101001依然是一个32位的正整数,只是程序进行强制类型转换时发生了溢出,导致它变成了负数 。

     


    2.字符型 

        字符型通常用于表示单个字符,字符常量必须使用单引号(')括起来。

        Java语言使用16位的Unicode字符集作为编码方式,而Unicode的被设计成支持世界上所有书面语言的字符,包括中文字符,因此Java程序支持各种语言的字符。

        字符型常量有如下三种表示形式:

        ★直接通过单个字符来指定字符型常量,例如'A'、'9'和'0'等。

        ★通过转义字符表示特殊字符型常量,例如' '、' '等。

        ★直接使用Unicode的值来表示字符型常量,格式是'uXXXX',其中XXXX代表一个十六进制的整数。

        Java语言中常用的转义字符如下表(Java语言中常用更多转义字符):

       

     

        字符型常量也可以采用16进制编码方式来表示,范围是:'u0000'~'uFFFF',一共可以表示65,535个字符,其中前256个字符和ASCII码中的字符完全重合。

        不仅如此,char类型的值也可直接作为整数类型的值来使用,但它是一个16位的无符号整数,即全部是正数,表示范围是0~65,53。

        如果把0~65,535范围内的一个int整数赋给char类型变量,系统会自动把这个int整数当成char类型来处理,下面程序简单示范了字符型变量的用法。

        程序:CharTest.java

     1 public class CharTest{
     2     public static void main(String[] args){
     3         // 直接指定单个字符作为字符类型常量
     4         char aChar = 'a';
     5         
     6         // 使用转义字符来作为字符类型常量
     7         char enterChar = '
    ';
     8 
     9         // 使用用Unicode的编码值来指定字符类型常量
    10         char ch = 'u9999';
    11 
    12         // 将输出一个 '香' 字符
    13         System.out.println(ch);
    14 
    15         // 定义一个 '疯' 字符类型常量
    16         char zhong = '疯';
    17 
    18         // 直接将一个char类型变量当成int类型变量使用
    19         int zhongValue = zhong;
    20         System.out.println(zhongValue);
    21 
    22         // 直接把0~65,535范围内的一个int整数赋给一个char类型变量
    23         char c = 97;
    24         System.out.println(c);
    25     }
    26 }

     

         Java没有提供表示字符串的基本数据类型,而是通过String类来表示字符串,由于字符串有多个字符组成,因此字符串常量使用双引号括起来。如下代码:

     1 // 下面代码定义了一个s变量,它是一个字符串实例的引用,是一个引用类型的变量
     2 String s = '沧海月明珠有泪,蓝田玉暖日生烟。';

        读者必须注意:

        char类型使用单引号括起来,而字符串使用双引号括起来。

        关于String类的用法以及对应的各种方法,读者应该通过查阅API文档来掌握,以此来练习使用API文档。

        

        值得指出的是,Java语言中的单引号,双引号和反斜线都有特殊的用途,如果一个字符串中包括了这些特殊字符,则应该使用转义字符的表示形式。

        例如,在Java程序中表示一个绝对路径:"c:coeds",这种写法得不到我们期望的结果,因为Java会把反斜线当成转义字符,所以应该写成如下形式:"c:\codes",只有同时写两个反斜线,Java才会把第1个反斜线当成转义字符,和后一个反斜线组成真正的反斜线。

     


     

    3.浮点型

        Java的浮点类型有两种:float和double。

        Java的浮点类型有固定的表示范围和字段长度,字段长度和表示范围与机器无关。

        Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,

        对于float型数值,第1位是符号位,接下来8位表示指数,再接下来的23位表示尾数;

        对于double类型数值,第1位也是符号位,接下来的11位表示指数,再接下来的52位表示尾数。

        注意: 因为Java浮点数使用二进制数据的科学计数法来表示浮点数,因此可能不能精确表示一个浮点数。例如,我们把5.2345556f值赋给一个float类型变量,接着输出这个变量时看到这个变量的值已经发生了改变。使用double类型的浮点数比float类型的浮点数更精确,但如果浮点数的精度足够高(小数点后的数字很多时),依然可能发生这种情况。如果开发者需要精确保存一个浮点数,则可以考虑使用BigDecimal类。

        double类型代表双精度浮点数, 一个double类型的数值占8个字节、64位;

        float类型代表单精度浮点数,一个float类型的数值占4个字节、32位。

        Java语言的浮点数有两种表示形式:

        ★十进制数形式:这种形式就是简单的浮点数,例如5.12、512.0、.512。浮点数必须包含一个小数点,否则会被当成int类型处理。

        ★科学计数法形式:例如5.12e2(即5.12×102),5.12E2(也是5.12×102)。

        

        必须指出的是,只有浮点类型的数值才可以使用科学计数法形式表示。例如,51200是一个int类型的值,但512E2则是浮点类型的值。

        Java语言的浮点类型 默认是double类型,如果希望Java把一个浮点类型值当成float类型处理,应该在这个浮点类型值后紧跟f或F。

            例如,5.12代表一个double类型的常量,占64位的内存空间;5.12f或者5.12F才表示一个float类型的常量,占32位的内存空间。

        

        除此之外,Java还提供了3个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。

            例如,使用一个正数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大0.0除以0.0对一个负数开方将得到一个非数

            正无穷大通过Double或Float的POSITIVE_INFINITY表示;

            负无穷大通过Double或Float的NEGATIVE_INFINITY表示,

            非数通过Double或Float的NaN表示。

       

        必须指出的是,所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至和NaN都不相等。

        注意:

        只有浮点数除以0才可以得到正无穷大负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。

        如果一个整数值除以0,则会抛出一个异常:ArithmeticException:/by zero(除以0异常)。

        下面程序示范了上面介绍的关于浮点数的各个知识点:FloatTest.java

     1 public class FloatTest{
     2     public static void main(String[] args){
     3         float af = 5.2345556f;
     4          //下面将看到af的值已经发生了改变
     5         System.out.println(af);
     6 
     7         double a = 0.0;
     8         double c = Double.NEGATIVE_INFINITY;
     9         float d = Float.NEGATIVE_INFINITY;
    10 
    11         //看到float和double的负无穷大是相等的
    12         System.out.println(c == d);
    13 
    14         //0.0除以0.0将出现非数
    15         System.out.println(a / a);
    16 
    17         //两个非数之间是不相等的
    18         System.out.println(a / a == Float.NaN);
    19 
    20         //所有的正无穷大都是相等的
    21         System.out.println(6.0 / 0 == 555.0/0);
    22 
    23         //负数除以0.0得到负无穷大
    24         System.out.println(-8 / a);
    25 
    26         //下面代码将抛出除以0的异常
    27         //System.out.println(0 / 0);      
    28     } 
    29 }

        Java 7新增的数值中使用下画线分隔

        正如前面程序中看到的,当程序中用到的数值位数特别多时,程序员眼睛“看花”了都看不清到底有多少位数。

        为了解决这种问题,Java 7引入了一个新功能:程序员可以在数值中使用下画线,不管是整型数值,还是浮点型数值,都可以自由地使用下画线。

        通过使用下画线分隔,可以更直观地分辨数值常量中到底包含多少位。

        如下面程序所示(UnderScore.java):

        

     1 public class UnderscoreTest{
     2     public static void main(String[] args){
     3         // 定义一个32位的二进制数,最高位是符号位
     4         int binVal = 0B1000_0000_0000_0000_0000_0000_0000_0011;
     5         double pi = 3.14_15_92_65_36;
     6         System.out.println(binVal);
     7         System.out.println(pi);
     8         
     9         double height = 8_8_4_8.23;
    10         System.out.println(height);
    11     }
    12 }

    4.布尔型

        布尔型只有一个boolean类型,用于表示逻辑上的“真”或“假”。

        在Java语言中,boolean类型的数值只能是true或false,不能用0或者非0来代表。

        其他基本数据类型的值也不能转换成boolean类型。

        例如,下面代码定义了两个boolean类型的变量,并指定初始值(BooleanTest.java):

     

    1 // 定义b1的值为true
    2 boolean b1 = true;
    3 
    4 // 定义b2的值为false
    5 boolean b2 = false;

     

        字符串"true"和"false"不会直接转换成boolean类型,但如果使用一个boolean类型的值和字符串进行连接运算,则boolean类型的值将会自动转换成字符串。看下面代码(程序清单同上)。

    1 //使用boolean类型的值和字符串进行连接运算,boolean类型的值会自动转换成字符串
    2 String str = true + "";
    3 
    4 //下面将输出true
    5 System.out.println(str);

        boolean类型的值或变量主要用做旗标来进行流程控制,Java语言中使用boolean类型的变量或值控制的流程主要有如下几种:

        ★ if条件控制语句

        ★ while循环控制语句

        ★ do循环控制语句

        ★ for循环控制语句

        除此之外,boolean类型的变量和值还可在三目运算符(?:)中使用。


     

  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/12460674.html
Copyright © 2020-2023  润新知