java数据类型、数据转换以及一些坑
基础类型
整数类型
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流中的字节流和字符流。