Java中的数据类型

Java中的数据类型有两大类:基本数据类型、引用数据类型,下面来具体介绍下

一、基本数据类型

1.1 数值型

整数型

默认值都是0,long类型的默认值为0L

byte

字节型
只有一个字节的内存空间
1个字节 = -2^7 〜 2^7-1 即 -128〜127(这个范围必须记住)

byte b = 5; 
byte b2 = -128;


short

短整型
2个字节
即: -2^15〜 2^15-1 即: -32768~32767(这个范围必须记住,记得时候可以和char类型对比着记)

short类型不经常用,由于Java是从C语言开发出来的,而short在C语言中用的比较多,所以Java就直接继承过来了,这是一个历史遗留问题
short s = 54; 
short s = -900;


int

整型
4个字节
-2^31〜 2^31-1(大约为正负21亿)

int i = 100000;
int i = 0x23;//可以

在这里插入图片描述
从JDK1.7开始是允许的。允许数字之间插入_分隔数字。在编译的时候会自动忽略这些_ 相当于定义变量: int j = 100000000;

int  i = 00001111; //八进制

Java中整数默认类型就是int


long

长整型
8个字节
-2^63 〜 2^63-1
以L作为结尾标识这个数字是一个long类型的数字

 long l = 3L; //(大小写无所谓,但是小写区分起来比较麻烦,一般用的都是大写)


1.2 浮点型

计算机中小数是不能精确存储的。当把二进制转化为十进制的时候,结果都是无穷小数,表示的时候都是截取其中的一部分。

float

单精度
4个字节:必须以f作为结尾 (默认值0.0f)

虽然int的取值也是4个字节,但是它们的取值范围不同,float中4位表示整数,一位表示小数点,27位表示小数。
float f = 3.2f;
float f = 2.4;  //  错误,小数默认的是double类型的,现在相当于大类型转小类型。。
double

双精度
8个字节 (默认值0.0)

虽然long的取值也是8个字节,但是它们的取值范围不同,double中52位取值用来表示小数和指数,只有11位来表示整数,1位表示小数点。

Java中小数默认是double类型

double d = 3.5;
double d = 4.6D; //可以(这种写法不常见,但是是正确的)
double d = 3.9e4; //是十进制的科学计数法 –>double=39000.0
//(虽然看起来是整数,但是科学计数法有的时候是小数,所以就直接把它看成double)
double d = 0x3p2; 
//是十六进制的科学计数法等价于3*22  -> 12
//(知道p表示16进制就可以了,不需要知道怎么计算)
注意:java中的数值类型都是有符号的(正负数都可以表示)


1.3 字符型

底层用的是utf-8编码。

char

2个字节 0 ~65535 (默认值‘\u0000‘以\u开头表示这个字符它对应的是UTF-8的编码)

char c  = 'a';
char c = '中';

ps:编码规则
ASCII–0~127 65-A 97-a
西欧码表:ISO-8859-1—0-255—1个字节(兼容了ASCII)
gb2312(表示的是简体汉字,默认兼容西欧码表,不仅仅是简单的兼容,前256位还是一个字符用一个字节表示的)----0-65535—gbk—2个字节
Unicode编码体系:utf-8(默认兼容西欧码表,不仅仅是简单的兼容,前256位还是一个字符用一个字节表示的。它只是收集了常见语言的常见字符,并不是所有的字符)—3个字节。它也叫万国码表。

ps:转义字符

\t 制表符
\n换行
\r回车
\反斜杠
\’单引号
\”双引号

(回车和换行是有区别的:在早期的打字机中,回车是到了该行第一个字符的地方,需要换行才会到第二行)。

1.4 布尔型

大小是根据操作系统和JDK版本不同而定的

boolean:true/false

boolean b = false;//(默认值)
bit位(最小的内存单位)
Byte字节 1Byte = 8bit
1KB=1024B
MB GB TB PB---计算机中存储单位

二、引用数据类型

类—class
接口—interface
数组—[](数组有个源生类Array)

三、数据类型的转换

3.1 隐式转换/自动类型转换

五个规律

规律一:小的类型可以转化为大的类型—byte->short->int->long float->double

byte b = 100;
int i = b;
long l = 63; //当整数的值在int类型的范围内的时候,可以不用添加L这个结尾

规律二: 整数可以转化为小数,但是可能产生精度损失(这个损失不是溢出)

int i = 5;
float f = i;
long l = 6;
float f = l;

规律三:字符型可以转化为整型

char c = 'a';
int i = c;
short s = 'a';//可以
char c = 100;//可以

规律四:任何整型都可以赋值给浮点型的变量,但是可能产生精度损失。

规律五: char→int,long(int 可以转换成long,箭头有传递功能)

举例说明

char c = 98;  
//编译时就已经成了char c = 'b' 底层存储的是'b'
short s = 'b'  
//编译的时候就已经成了short = 98. 底层存储的是98
char c = 'a';  
//分开编译的,编译完了char c ='a';'a'已经以字符的形式存在了内存中
short s = c;-
//报错  现在JVM已经不确定c字符是否在short类型的取值范围内了。
short s = 100; 
//编译完成之后s的取值已经存入内存中了
char c = s;  
//报错 再次使用时,不能按照对应的码表转换成字符,不能确定这个数字在码表的范围内了。

定义了char类型的变量c,存储的数据是一个字符,不需要检查具体的字符编码(任何编码都可以表示。都兼容了西欧码表,字母表示的时候都是一个字符),当赋值给short类型的时候,short需要检查这个字符对应的编码是否在short类型的取值范围内,这个时候无法确定这个字符对应的具体编码,由于short类型的取值范围和char类型没有完全重合,为了防止出现超过范围的情况,不允许赋值。

short s = 97;
char c = s; //报错

总结

在这里插入图片描述
char和short之间可以直接赋值,底层会进行优化,但是不能间接赋值。

char 转化成int、long可以间接赋值,也可以直接赋值,反过来赋值只可以直接赋值。

各个基本类型之间是平等的,不存在父子关系。

可以把int类型直接赋值给byte、short、char而不需要强制类型转换,只要范围不超出其表数范围。(赋值的时候只能直接赋值赋值,间接赋值就会报错)

3.2 显式转换/强制类型转换

long l = 54;
int i = (int)l;

(把大的类型转化为小的类型的时候,需要强制转换)

double d = 3.5;
int i = (int)d;

小数强转成整数的时候,小数部分直接舍弃,不是四舍五入。会产生精度损失的。
把浮点数据转换成整数类型变量的时候,需要强制类型转换。

ps:附
在计算机中,绝大部分小数,在计算中是没有办法精确表示的。

double类型不能精确存储小数

可以使用一下类型:

Hexadecimal–十六进制
Decimal–十进制
Octal—八进制
Binary–二进制

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值