数据类型

基础类型

整数类型

byte占1个字节:-128~127

short占2个字节:-32768~32767

int占4个字节:-2147483648~2147483647

long占8个字节:-9223372036854775808~9223372036854775807      long类型后面要加上L  long num1 = 50L



浮点类型(小数)

float占4个字节 (数字后面要加上F以区分) float num1 = 21.3F

double占8个字节(常用)

字符类型

char占2个字节

char name = 'A'    char name1 = '马'      但是 char name2 = '小马'  不可以

注:所有的字符本质上还是数字,是通过Unicode编码表进行转换的,可以强制转换成int类型

在Unicode表中:‘a’=97,‘A’=65



注意:字符串String不是8大类型中的,它是单独的一个类



bool类型

占1个字节 只有true和false两个



引用类型

类 接口 数组



什么是字节:

- 位(bit):计算机内部存储的最小单位,11111111是一个八位的二进制数
- 字节(byte):计算机中数据处理的基本单位,一般用B来表示
- 1B(byte,字节)=1bit(位)
- 字符:计算机中使用的字母、数字、符号、字



- 1bit是1位
- 1Byte表示一个字节 1B=8b
- 1024B = 1KB
- 1024KB = 1M
- 1024M  = 1G



数据类型的转换

简单类型的数据进行转换时分为自动转换和强制转换。

自动转换:

由“低”转换到“高”(取值范围)

(byte、short、char)--->int---->short--->long--->float--->double

在编写程序时按照由小到大的顺序,可以直接把对应的“小”数据转换成“大”数据

    byte b = 100;
    int i = b;
    System.out.println(i);//结果是100,自动把byte转换成int
    
    int num1 = 100;
    float f = num1;
    System.out.println(f);//结果是100.0,自动把int转换成float



强制转换

由“大”转换到“小”时(取值范围),但是可能会有内存溢出和精度丢失问题

    int i = 129;
    byte b = (byte)i;//数据由“高”到“低”要进行强制转换
    System.out.println(b);//结果是-127 因为byte类型范围是-128~127,而129超出范围,内存溢出。
    
    float f1 = 12.34f;
    int num1 = (int)f1;//数据由“高”到“低”要进行强制转换
    System.out.println(num1);//结果是12,因为精度丢失,只取其整数部分12
    float f2 = -12.34f;
    int num2 = (int)f2;
    System.out.println(num2);//结果为-12,精度丢失,取整数部分-12

    int num1 = 1000000000;//10亿
    int num2 = 20;
    int num3 = num1 * num2;
    System.out.println(num3);//结果是-1474836480,因为int范围是-2147483648~2147483647,大概是20亿左右,而结果大概是200亿,内存溢出
    float f = num1 * num2;
    System.out.println(f);//结果也是-1.47483648E9,一样的结果,因为num1与num2运算结束后已经溢出了,只不过是把溢出的结果交给float
    float f1 = num1 * (float)num2;
    System.out.println(f1)//结果是2.0E10,表示200亿。





char本质还是整数类型,所以可以与数字进行数学运算

    char c = 'a';
    int num = c + 1;
    System.out.println(num);//结果是98,因为‘a’对应Unicode表是97, ‘a’+1则为98
    System.out.println((char)num);//结果是‘b',98对应Unicode表是'b'





进制

二进制0b    八进制0    十进制    十六进制0x

    int i1 = 0b10;//二进制  结果是2
    int i2 = 010;//八进制 结果是8
    int 13 = 10;//十进制  结果是10
    int i4 = 0x10;//十六进制  结果是16

    

浮点数的坑

    float f = 1.1f;
    double d = 11.0/10;
    System.out.println(f);//结果1.1
    System.out.println(d);//结果是1.1
    System.out.println(f == d);//结果是false
    
    
    float f1 = 23123123132132f;
    float f2 = f1 + 1;
    System.out.println(f1 == f2);//结果是true  f1与f2相差了1,但结果竟然是俩值相等

float是有限的离散的,对于它的数值是会进行舍入误差,是接近但不等于,所以不能对浮点数进行判断

对于一些大数据(银行等业务),不要用float double等,用BigDecimal类



string类型的坑

    String s1 = "hello";
    String s2 = "hello";
    System.out.println(s1 == s2);//结果是true
    
    String s3 = new String("hello");
    String s4 = new String("hello");
    System.out.println(s3 == s4);//结果是false







所得

一个位b是一个二进制数字(0或者1),一个字节是8个二进制数,而计算机存储或者读取一个字节代表着读或者写入8个二进制数。对应后续的IO流中的字节流和字符流。