Java的数据类型详解

1、 数据类型

1.1、数据类型的作用

数据类型用来声明变量,程序在运行过程中根据不同的数据类型分配不同大小的空间。
比如::
int i = 10;
double d = 1.23;
i变量和d变量类型不同,空间大小不同。

1.2、数据类型在java语言中包括两种

第一种:基本数据类型
基本数据类型又可以划分为四大类八小类:

	四大类:
	第一类:整数型
		byte,short,int,long(没有小数的)
	第二类:浮点型
		float,double(带有小数的)
	第三类:布尔型
		boolean:只有两个值true和false,true表示真,false表示假
	第四类:字符型
		char:java中规定字符型字面量必须使用单引号括起来,属于文字。
	
	八小类:
	byte、short、int、long
	float、double
	boolean
	char

第二种:引用数据类型
字符串型String属于引用数据类型。String字符串不属于基本数据类型范畴。Java中除了基本数据类型之外,其他都是引用数据类型。

1.3 基本数据类型

1.3.1 字符编码

对于8种基本数据类型来说:
其中byte , short , int, long, float , double , boolean,这7种类型计算机表示起来比较容易,因为他们都是数字。其中布尔类型只有两个值true和false,实际上true和false分别在C++中对应的是1和0,1为true, false为0。

对于char类型来说计算机表示起来比较麻烦,因为char对应的是文字,每一一个国家的文字不一样,文字不能直接通过"自然算法"转换成=二进制。这个时候怎么办?字符编码诞生了。

什么是字符编码?

1、字符编码是人为的定义的一-套转换表。
2、在字符编码中规定了一系列的文字对应的二进制。
3、字符编码其实本质上就是一本字典,该字段中描述了文字与二进制之间的对照关系。字符编码是人为规定的。( 是某个计算机协会规定的。)
4、字符编码涉及到编码和解码两个过程,编码和解码的时候必须采用同一套字符编码方式,不然就会出现乱码。

字符编码的发展过程

起初的时候计算机是不支持文字的,只支持科学计算。实际上计算机起初是为了战争而开发的,计算导弹的轨道… .

后来随着计算机的发展,计算机开始支持文字,最先支持的文字是英文,英文对应的字符编码方式是: ASCII码。

ASCII码采用1byte进行存储,因为英文字母是26个。( 键盘上所有的键全部算上也超不过256个。1byte可 以表示256种不同的情况。所以英文本身在计算机方面就占有优势。)

‘a’ – (采用ASCII码进行编码)-> 01100001

01100001 – (采用ASCII码进行解码)-> ‘a’

如果编码和解码采用的不是同一个编码方式,会出现乱码。
‘b’ —> 98
‘c’ —> 99
‘a’ —> 97
‘A’ —> 65
‘B’ —> 66
‘0’ —> 48(这个,0,不是那个0,是文字10)
‘1’ —> 49

随着计算机语言的发展,后来国际标准组织制定了Iso-8859-1编码方式,又称为latin-1编码方式,向_ 上兼容ASCII码。但不支持中文。

后来发展到亚洲,才支持中文,日文,韩文…

中文这块的编码方式: GB2312<GBK<GB18030 ( 容量的关系)

以上编码方式是简体中文。

繁体中文: big5 (台湾使用的是大五码。)

在java中,java语言为了支持全球所有的文字,采用了一种字符编码方式叫做unicode编码。unicode编 码统一了 全球所有的文字,支持所有文字。具体的实现包括: UTF-8 UTF-16 UTF-32… .|

1.3.2 byte类型

byte类型的取值范围是[-128~127],可以标识256个不同的数字。
因为byte类型在内存中占用一个字节,是八个bit位,所以byte类型可以储存的最大值是:01111111(127)
注意:在计算机中,一个二进制位最左边的是符号位,当为0时表示正数,当为0时表示整数,当为1时表示负数。所以byte类型最大值是:01111111,也就可以表示成:10000000(二进制)- 1,byte类型最大值是2的7次方-1.

1.3.3 short类型

short类型占2个字节,取值范围是-32768~32767.short和byte类型主要用于特定的应用场合,例如,底层的文件处理或者存储空间很宝贵时的大数组。
java中有一一个语法规则:
当这个整数型字面量没有超出byte的取值范围,那么这个整数型字面量可以直接赋值给byte类型的变量。这种语法机制是为了方便写代码,而存在的。

public class IntTest04{
	public static void main (String[] args) {
	//分析:以下代码编译可以通过吗?
	//300被默认当做int类型
	//b变量是byte类型
	//大容量转换成小容量,要想编译通过,必须使用强制类型转换符
	//错误:不兼容的类型:从int转换到byte可能会有损失
	//byte b = 300;
	//要想让以上的程序编译通过,必须加强制类型转换符I
	//虽然编译遁过了,但是可能精度损失。
	// 300这个int类型对应的二进制: 00000000 00000000 00000001 00101100
	// byte占用1个字节,砍掉前3个字节,结果是: 00101100 (44)
	byte b = (byte) 300;
	System.out.println(b) ; // 44
	//这个编译能遁过吗?
	// 1是int类型,默认被当做int类型来看。
	// x是byte类型,1个字节,大容量无法直接转换成小容量。
	//按说是编译报错的。但是编译通过
	bytex=1;
	bytey=127;
	//错误:不兼容的类型:从int转换到byte可能会有损失
	//byte z = 128;

1.3.4 int类型

int类型占4个字节,取值范围是:-2147483648~2147483647(刚刚超过20亿)在通常情况下,int类型最为常用。在java中,整数字面量一上来编译器就会将它看做int类型。比如如下代码非常经典:

//以下代码会报错,因为2147483648已经超出了int的范围,所以在没赋值之前就已经报错
//解决办法有多种,可以对其进行强制类型转换,或者在大数后面加一个L将其设置为long类型
long e = 2147483648
1.3.5 long类型

long类型占8个字节,取值范围是-9223372036854775808~9223372036854775807.long类型数值后面一般会有L或l。
十六进制数值会有前缀0x或0X,八进制有前缀0.从Java7开始,前缀0b或0B可以写进二进制数,如0b1001就是9。另外,同样是从Java7开始,还可以为数字字面量加下划线,如用1_000_000表示100万。

1.3.6 float类型

float类型占4个字节,取值范围大约在正负3.40282347E+38F(有效位数为6~7位)。float的数值有一个后缀F或f(例如3.14F),没有后缀的F的浮点数值总是默认为double类型。当然,也可以在浮点数后面加后缀D或者d。
注释:可以使用十六进制表示浮点数,例如,0.125 = 2^-3可以表示成0x1.0p-3.在十六进制表示法中,使用p表示指数,而不是e。(e是一个十六进制数位。)注意,尾数采用十六进制,指数采用十进制。指数的基数是2,而不是10.

一个小问题:long类型占8个字节,float类型占4个字节哪个容量大?
注意:任意一个浮点型都比整数型空间大,float容量 > long容量。

1.3.7 double类型

double类型占8个字节,取值范围大约在正负1.79769313486231570E+308(有效数字位数为15位),double类型被称为双精度浮点型,它是Java中浮点类型的默认数据类型,大多数情况下Java很少使用float类型,因为在大多数情况下它并不能满足要求。

1.3.8 char类型

字符型:char
1、char占用2个字节。
2、char 的取值范围: [0-65535]
3、char采 用unicode编码方式。
4、char类型的字面量使用单引号括起来。5、char可以存储一个汉字。

public class CharTest01 {
	public static void main (String[] args) {
	// char可以存储1个汉字吗?
	//可以的,汉字占用2个字节,java 中的char类型占用2个字节,正好。
	char c1 = '中' ;
	System.out.println (c1) ;
	char c2 = 'a';
	System.out.println(c2) ;
	char c3 = '0';
	System.out.println(с3) ;
	//错误:不兼容的类型: String无法转换为char
	//char c4 = "a";
	//错误:未结束的字符文字
	//char c5 = 'ab';
	}
}

关于整数能否直接赋值给char类型,我们要了解一下类型转换。
1、小容量可以直接赋值给大容量,称为自动类型转换。
2、大容量不能直接赋值给小容量,需要使用强制类型转换符进行强转。但需要注意的是:加强制类型转换符之后,虽然编译通过了,但是运行的时候可能会损失精度。

所以结合上面知识可以得出结论:
1、当一个整数赋值给char类型变量的时候,会自动转换成char字符型,最终结果是一个字符。
2、当一个整数没有超出byte、short、char的取值范围时,这个整数可以直接赋值给byte、char、short类型的变量。

2、数据类型总结

综合的看一下,在类型转换的时候需要遵循哪些规则?

第一条:八种基本数据类型中,除boolean 类型不能转换,剩下七种类型之间都可以进行转换:

第二条:如果整数型字面量没有超出byte , short,char的取值范围,可以直接将其赋值给byte , short, char类型的变量:

第三条:小容量向大容量转换称为自动类型转换,容量从小到大的排序为:
byte < short (char)< int< long < float < double, 其中short和 char
都占用两个字节,但是char可以表示更大的正整数

第四条:大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用:

第五条: byte , short,char类型混合运算时,先各自转换成int类型再做运算:

第六条:多种数据类型混合运算,各自先转换成容量最大的那一种再做运算:|

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值