八大基本类型如下
byte
boolean
char
int
short
long
float
double
下面具体介绍各个类型:
布尔类型占1个字节(8位),它的的值必须是true或者false,在JVM中会转换为1(true)或者0(false)。
char(字符类型)
char类型占2个字节(16位),用来表示字符,是基本数据类型。
String表示字符串,是类类型。一个String是由0~n个char组成。
额外:关于字符编码
(1)Java语言对文本字符采用Unicode编码。由于计算机内存只能存取二进制数据,因此必须为各个字符进行编码。
(2)常见编码:
1、ASCII
它是现今最通用的单字节编码系统,它主用于表达现代英语和其他西欧语言中的字符,只用一个字节的7位,一共表示128个字符。2、ISO-8859-1
又称为Latin-1, 是国际标准化组织(ISO)为西欧语言中的字符制定的编码,用一个字节(8位)来为字符编码,与ASCII字符编码兼容。所谓兼容,是指对于相同的字符,它的ASCII字符编码和ISO-8859-1字符编码相同。3、GB2312
包括对简体中文字符的编码,一共收录了7445个字符(6763个汉字+682个其他字符). 它与ASCII字符编码兼容。4、GBK
对GB2312字符编码的扩展,收录了21886个字符(21003个字符+其它字符), 它与GB2312字符编码兼容。5、Unicode
收录了全世界所有语言文字中的字符,是一种跨平台的字符编码,Unicode具有两种编码方案:
用2个字节(16位)编码,被称为UCS-2, Java语言采用;
用4个字节(32位)编码,被称为UCS-4;6、UTF
有些操作系统不完全支持16位或32位的Unicode编码,UTF(UCS Transformation Format)字符编码能够把Unicode编码转换为操作系统支持的编码,常见的UTF字符编码包括UTF-8、UTF-16、UTF-32。
关于UTF-8,使用一至四个字节为每个字符编码,其中大部分汉字采用三个字节编码,少量不常用汉字采用四个字节编码。因为 UTF-8 是可变长度的编码方式,相对于 Unicode 编码可以减少存储占用的空间所以被广泛使用。
关于char类型的值
字符’a’,的表示形式:
二进制数据形式为 :0000 0000 0110 0001
十六进制数据形式为 :0x0061
十进制数据形式为 :97
//使用具体字符来表示a char c = 'a'; //使用Unicode编码来表示字符a char c = '\u0061'; //0x开头的数字为十六进制,,使用十六进制表示a char c = 0x0061; //使用十进制来表示a char c = 97; //0开头的数字为八进制,使用八进制表示a char c = 0141; //一个中文汉字就是一个字符 char a = '中';
都是用来存整数的。
类型 | 在内存中占的位数或字节数 | 范围 |
---|---|---|
Byte | 8位,一个字节 | -2 ^7~2 ^7-1 |
short | 1位,2个字节 | -2 ^15~2 ^15-1 |
int | 32位,4个字节 | -2 ^31~2 ^31-1 |
long | 64位,8个字节 | -2 ^63~2 ^63-1 |
在Java语言中,为了区分不同进制的数据,八进制数以“0”开头,十六制以“0x”开头,二进制以“0b”开头
byte b1 = 97; //十进制 byte b2 = 0141;// 八进制 byte b3 = 0x61; //十六进制 byte b4 = 0b01100001; //二进制 //都是97打印出来 System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4);
(1)计算机中,数据传输大多是以“位”(bit,比特)为单位,一位就代表一个0或1(二进制),每8个位(bit)组成一个字节(Byte),所以,1个字节=8位0101代码,例如 0000 0001。
例如,0000 0001 ,表示二进制的数字1,它是1个字节,共8位0101代码组成。
(2)十六进制有0 1 2 3 4 5 6 7 8 9 A B C D E F ,它的范围是0~ 15 ,每4位0101代码可以表示一个十六进制的数字,因为4位表示的最小值是 0000,最大值1111 ,刚好范围是0~15 .
总结:1字节=8位
整数类型的默认类型是int,对于给出一个字面值是99的数据,在没有指明这个数据是什么具体的类型的情况下,那么java默认认为是int类型。
代码一:
byte a = 1; //编译报错 //a+1中a是byte类型,字面值1没有声明类型,那么默认是int //byte是8位,int是32位,那么结果是32位的数字 //b只是一个byte类型的变量,那么只能接收8位的数字 //修改为int b = a+1;就可以编译通过 byte b = a+1; //编译通过 //虽然1+1中的1都是默认的int类型 //但是这个俩个1都是固定的字面值 //编译器可以判断出其结果是否超出了byte表示的范围 //上面例子中a+1不能判断出结果的原因是:a是变量,是有可能发生变化的 byte c = 1+1; //编译报错 //编译器判断出其结果超出了byte的表示范围(-128~127) byte d = 1+127; //编译报错 /*原因:32位的数据赋值给byte类型的变量,因为使用的1这些都是字面值,默认是int,注意关键点在在最左边的1,编译器不认为是符号位,所以它默认是在前面补了24个0*/ byte e = 0b11111111; //编译通过 //输出结果为255 //因为1的前面补了24个0 int e = 0b11111111; //编译通过 //输出结果为-1 //因为这里做了类型强制转换 byte f = (byte)0b11111111;
代码二:
{ byte a=56; //编译通过 byte b=156; //编译失败,超出了byte的取值范围 int c=9999999999; //编译失败,超出了int的取值范围(10个9) long d=999999999; //编译通过,常量在int范围内(9个9),int类型可以自动转成long类型 long e=9999999999; //编译失败,常量超出int范围,不可以自动转成long类型 long f=9999999999L; //编译通过,在long类型的范围内(注意数值后面加了个L,表示这是long类型) Long g=999999999; //Long不是基本数据类型,不能和int直接转化 }
表示小数的类型
分类为float和double类型,float的精度为7位有效数字,double的精度为16位有效数字(浮点类型的默认类型是double类型)
声明
//后面加f或者F(必加) float f = 10.5f; //后面加d或者D或者不加 double d = 10.5d;
代码:
//编译通过 //字面值1.5默认类型是double double d = 1.5; double d = 1.5D; //编译报错 //字面值1.5默认类型是double //double和float的精确度不一样 float f = 1.5; //f2编译通过,因为字面值1的类型是int,可以自动转变为float类型 //f3编译报错,因为字面值1.5的类型是double,float不能转换为double类型。 float f1 = 10.5f; float f2 = f1+1; float f3 = f1+1.5;
浮点型的数据精度丢失
例如:
System.out.println(1.0-0.66); //输出结果: 0.33999999999999997
Java中的浮点数类型float和double不能够进行精确运算,虽然大多数情况下是运行是正常的,但是偶尔会出现如上所示的问题。浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。
解决?可以使用BigDecimal类
//add方法 + //subtract方法 - //multiply方法 * //divide方法 BigDecimal d1 = BigDecimal.valueOf(1.0); BigDecimal d2 = BigDecimal.valueOf(0.66); double result = d1.subtract(d2).doubleValue(); System.out.println(result); //输出结果:0.34