数据类型分类

基本数据类型

byte, short, int, long, float, double, boolean, char

boolean

  • ?个字节

官方并没有明确说明 boolean 类型在内存中占用几个字节,很多其他资料上说他占用1个字节,不过对于boolean这种只用1个bit就可以表示的类型(如只用0、1表示),即使只用了1个字节也浪费了7位空间

  • 值只有 truefalse

    整数类型

    除了最左边1位是符号位用来表示正数还是负数,其他的都用来表示数值

  • byte

    • 1个字节
  • short
    • 2个字节
  • int
    • 4个字节
  • long

    • 8个字节
    • 如果数据比 long 类型还大,使用 java.math.BigInteger 类型

      浮点类型(有小数点的数据)

  • float

    • 4个字节
    • 单精度浮点数,可以表示7位有效数字

3.1415926 的有效数字包括了小数点前面和后面的部分加起来一共有7个,不包括小数点,那么最终的结果是 3.1315925,因为最后1位数字 6 是第8位

  • float表示的范围比int大

虽然float和int都同样占4个字节,但float表示的范围更大,是因为float有的位除了用来当作符号位和数值,还有的位用来表示次方,而int类型的4个字节除了符号位其他都是用来表示整数的

  • double (推荐用这个)
    • 8个字节
    • 双精度浮点数,可以表示15位有效数字

比float更精确,虽然比float更占空间,但对我们现在的硬件情况来说多4个字节没有什么影响,因此推荐用double

1.float 类型和 double 类型在计算的时候可能出现数据不精确的情况
0.1+0.2 = 0.30000000000000004,所以在涉及金钱的计算时,都不会使用 double 或 float,用 BigDecimal 替代

char(字符类型)

用于描述单个字符,如 ‘a’、’好’等

  • 用单引号表示

'a'

  • 多个字符组成字符串 String

现实生活中很少有数据能用单个字符就表示完,比如姓名、家庭地址等,所以会将多个字符连接起来,形成字符串,也就是 String 类型,在代码中用双引号表示,如"张三"是一个字符串,由'张''三' 这两个字符组成

  • 在计算机中存储的是该字符对应的十进制编号对应的二进制

计算机底层只能识别0和1,对于整数类型/浮点数类型的数字,只需要将十进制转换成二进制即可存储进计算机,但是存储这种字符类型的数据,还需要其他步骤。
给每个字符都设置一个编号,如 ‘a’ 对应的十进制编号是 97,我们再将十进制数字 97 转换成二进制后就可以存储到计算机里了,因此计算机本质上存储的就是这个字符的编号,而不是字符本身,这个编号表就是ASCII
字符 -> 字符对应的十进制编号 -> 二进制

  1. // 以下两种声明方式虽然不同,但最终在计算机中存储的数据都是一样的
  2. // 以字符的方式声明
  3. char a = 'a';
  4. // 以编号的方式声明
  5. char b = 97;
  6. System.out.println(a); // a 以char类型的方式展示
  7. System.out.println(b); // a 以char类型的方式展示
  8. System.out.println((int)a); // 97 以十进制的方式展示
  9. System.out.println((int)b); // 97 以十进制的方式展示
  • 2个字节(表示范围是0~65535),没有符号位

这个范围指的是编号的范围,如字符 ‘a’ 对应的十进制编号是 97,97 在 0~65535 范围里,所以字符 ‘a’ 可以声明成 char 类型的

  • java采用 Unicode 字符集编码

Unicode是世界通用的定长(所有字符都是16位)字符集。
该字符集将全世界所有字符都包含了进去,使用该字符集的好处是全世界的人都可以在java里将自己国家的文字或图案作为字符使用

引用数据类型(待更新)

数组、类、接口、枚举、标注等等

基本数据类型的字面量

什么是字面量

字面量也叫直接量常量

  1. // 下面的 11, 259, 1.2 就是字面量
  2. byte b = 11 /*字面量*/;
  3. short s = 259 /*字面量*/;
  4. double d = 1.2 /*字面量*/;

整数字面量

如 11, 12, 14 这种整数和 1.2, 11.2 这种浮点数的字面量的特点有区别,所以分开来说,这里先说值为整数的字面量

  • 字面量的默认类型是int类型

    1. // 不管字面量在不在其他基本数据类型的范围内,只要值是整数,都默认是int类型
    2. byte b = 11 /*默认int类型*/;
    3. short s = 259 /*默认int类型*/;
  • 字面量的值在被赋值变量对应数据类型的取值范围外会编译报错

    1. byte b = 259 /*byte取值范围是-128~127,259超出这个范围了,因此报错*/;
  • 如果字面量的值在int类型取值范围外,添加后缀改为其他类型,否则编译器会报错

    1. // 解决:我们在字面量后面加后缀可改变字面量的类型
    2. long l = 2222222222L /*字面量设置为long类型*/;

浮点数字面量

浮点数字面量如 1.2, 11.2 这种有小数点的

  • 字面量的默认类型是double类型

    1. // 不管字面量在不在其他基本数据类型的范围内,只要值是浮点数,都默认是double类型
    2. double d = 11.22 /*默认double类型*/;
    3. float f = 1.2 /*默认double 类型*/;
  • 如果将double类型的字面量赋值给float类型的变量编译器会报错 ```java float f = 1.1; // 即使字面量的值在float取值范围内,依然会报错,这点和整数字面量不同

// 解决:在字面量后面添加 F 后缀,表明字面量是 float 类型 float f = 1.1F;

  1. <a name="fSV2y"></a>
  2. ## 类型转换
  3. <a name="zDs4m"></a>
  4. ### 基本数据类型转换
  5. <a name="scLDv"></a>
  6. #### 自动类型转换
  7. 适用于`小类型`**到**`大类型`的转换,转换的过程自动完成,不需要我们写额外的代码 <br />判断两个类型谁大谁小的依据是他们各自对应的取值范围,如 byte的取值范围是 -128~127,short 的取值范围是-32,768~32,767,short的取值范围比byte大,因此在这个情况下byte是小类型short是大类型(不能仅通过字节大小进行比较,因为底层二进制序列结构可能不一样导致取值范围大小相差很大,如float和int虽然都占4个字节,但是float有的位用来表示次方,因此取值范围比int更大,所有在这个情况下float是大类型int是小类型)
  8. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/5357399/1631494546001-f17c33db-481e-4c66-b886-982bb6835794.jpeg)<br />
  9. ```java
  10. byte b = 1;
  11. short s = 2;
  12. s = b;

强制类型转换

适用于大类型小类型的转换,需要我们手动进行强制转换(可能造成数据的损失)。
格式:目标类型 变量名 = (目标类型)源类型变量名

  1. /*
  2. int 类型的变量无法直接赋值给 byte 类型的变量,是因为变量里的值是可以随时变化的,
  3. 编译器不能确定此刻的值到底是不是在 byte 类型范围内。
  4. 这和 int 类型的字面量直接赋值给 byte 类型的变量不同,字面量可以确定现在的值是否在 byte 类型范围内,
  5. 因此不会报错
  6. */
  7. int i = 25;
  8. byte b = i; // 这步编译器报错,编译器无法确定值是否一定是25,因此不能判定变量 i 中的值可以赋值给它
  9. byte b = (byte)i; // 强制转换