数据类型
一、什么是数据类型
1.百度百科: 数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。
简单理解 : Java对数据进行了分类,存在不同的类型
为什么需要数据分类:不同的数据类型占用的存储空间不一样,为了更好的利用计算机内存 空间,防止出现小数据存在大数据类型导致浪 费空间的情况(存入的数据是以二进制的形式 放入存储空间的:01010101010101010101010101010101)
2.在 Java 的领域里,
基本数据类型变量(包括整数[byte、short、int、long]}、浮点型[float、double]、字符型[char]、布尔类型[boolean]): 存的是数据值本身
引用数据类型变量: 存的是保存数据的内存空间地址,输出时输出的是数据。
学习数据类型基本认识:
Java中每个变量都有一种类型,数据类型限制变量能用的存储空间,所以可以存入的值也是有范围的
示例:比如byte数据类型能存的值在-128~127之间,超过就没法存
二、进制
1.进制的概念
(1)10进制 (逢10进1)(计数) 在我们生活中最常用,同样,在我们写代码中也最常用。
其中的符号可以是 :1 2 3 4 5 6 7 8 9 0
(2)2进制 (逢2进1)
其中的符号可以是: 1 0
(3)8进制 (逢8进1)
其中的符号可以是: 0 1 2 3 4 5 6 7
(4)16进制(逢16进1)
其中的符号可以是:
0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)
示例:2A
三、基本数据类型(8种)
1.计算机中的存储单位
1024T
1T = 1024G
1G = 1024MB
1M = 1024KB
1KB=1024Byte
1Byte = 8 bit【1个bit就是一个二进制位】
2.整型数据byte short int long
为什么会有不同大小的类型,举个例子比如存 5 这个数据怎么存的?
byte(8位,范围是-128到127)
short(16位)
int(32位)
long (64位)
上面的byte short int long 最大长度可以通过jdk文档去找到 具体的范围。
如果值比long还大,怎么办?
Java提供了一个类:BigInteger:用于处理较大整数
long赋值时,因为整数默认是int类型,要转换为long类型的值,后面加上l或L
同一个整数可以使用不同的进制表示:(System.out.println(0b101)需jdk1.7才能按照十进制输出)
Java7 开始 支持数字之间用 _ 分割(12_34_56输出123456)
3.浮点型 float double 其实就是小数
float(单精度32位)
直接给变量赋值时必须在浮点类型数据后面加上f 或F
[ 表示该数据是一个浮点类型数据 ]
double( 双精度64位)
单精度双精度区别:
(1)对于单精度浮点数,运行速度相比double更快,占内存更小,
但是当数值非常大或者非常小的时候会变得不精确。
(2)双精度比单精度表示的位数大 精确的位数多,简单地说, float表示的小数点位数少。
默认浮点数的类型是 double
表现形式:
常规
例如 3.14 3.14f
科学计数法
例如 3.14e2 3.14*10^2 3.14e-2
注意:存入的数据会有精度损失 [ 使用浮点数的时候需要注意 ]
例如 double num= 1.0, 是一个无限接近1.0的一个值
结论:浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是 因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运 算的时候要特别小心。
那怎么更精确的表示浮点数呢?
Java提供了一个类BigDecimal来表示更精准的浮点数
4.字符char
什么是字符:单引号引起来的一个符号就是字符数据 例如:'A'
存储单位16 位[0-65535] [2个字节,16位]。字符常量使用单引号 ''(英文状态下)包裹起来。
表现形式:
'A'最常用,最直观的方式
使用一个数字表示,对应有一个ASCII码表[ 字符编码 ]
例如:char c = 65;//表示 'A' 这个字符
16进制表现形式
'A'->65(10进制)
'A'->0x41(16进制)怎么表示? '\u0041'
特殊符号(需要使用转义符号转义)
\' \" \\ \r(回车) \n(换行) \t(制表符Tab)
字符数据可以当成一个整数来使用,
什么是ASCII表,就像化学元素周
5.布尔类型boolean
值只有两个 true false,不能使用 0 1表示
四、 引用类型
1.引用类型String
String是 java中已经设计好的一个类,表示的值是字符串,是字符串数据类型
[注意:Java中设计的类和我们自己设计的类的性质是一样的]
常见形式:String s = "你好";
当String 和 + 一起使用的时候,这时候+ 是拼接字符串的功能
System.out.println("你好"+2);//结果为 你好2
int a = 5;
int b = 10
System.out.println("a="+a+",b="+b); //结果为a=5,b=10
2.一个类其实就是一种引用数据类型
自己写的一个类也是一种数据类型,类型为类名
我们自己写的类和Java已经写好的,性质一样
五、 数据类型转换
整型数据【值】 : 默认类型为int类型 :例如:12默认为int类型
小数数据 : 默认为double类型 :例如:3.14默认为double类型
①自动类型转换:小数据类型转大数据类型【存储空间的大小】
②强制类型转换:
①大数据类型转小数据类型[存储空间大小]
②相同存储空间不同类型表达值范围不一样[例如:char及short
3.数据转换说明
1.在Java中,boolean类型与所有其他7种类型都不能进行转换。(byte short int long float double char)
2.如下7种数据类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化:
byte short ,char int long float double
①自动类型转换: [short和char ,因值的范围不同,不能自动转换]其他都可以自动完成转换
②强制类型转换: 必须强制转换。
思考:为什么float 在long 后面?
小数(浮点数) 的存储方式,结构和整数不一样:知道就好无须深入研究..
(1)自动转换
1)数据类型过长 和 溢出
byte b = 128;//超出byte范围
long intMax = int最大数(查jdk文档)
2)long float double只要两个操作数中有一个是上面类型的,另一个就会被转换成相应类型,并且结果也是该类型: 例如
int num = 10;
double b = 10.01;
double c = num + b;
System.out.println(c);
3)如果2个操作数(包括byte,short,char,int),都将会转换为int类型,并且结果也是int(自动向上转型)
short s = 10;
int num = 20;
int n = num + s;
System.out.println(n);
byte b=3;
b=(byte)(b*3);//必须声明byte。
System.out.println(b);
4)char类型向更高长度类型(例如整型)转换时,会转换为对应的ASCII码值,再做其他类型的自动转换
例如:
char c = 'A';
int num = 10;
int a = c+num;
System.out.println(a);
需要注意的是:
1.char型具有两个字节,其数值范围是0 ~ 2^16-1,
2.short类型也具有两个字节,其值的范围是-2^15 ~ 2^15-1
这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为值范围问题),同时,byte当然可以直接提升到short型。
所以,char 不能和byte short 相互自动转换
5)特例 :只看类型不看值
示例1:
int a = 129;
byte b = (byte)a;//编译器只看容器不看值
System.out.println(b);//结果为-127
示例2:
byte b = 100;//可以自动转换
float f = 1.3;//不能自动转换
int a = 2147483647;
a = a+1;
System.out.println(a); // 结果为 -2147483648
(2)强制转换
1.强制类型转换的语法
数据类型 变量名 = (数据类型)值;//值可能是更高的类型
2.强制类型转换的注意事项
(1)高转低会导致精度丢失,不同类型的强制转换,可能会导致精度的下降.
(2)实际开发中:应该要知道被强制转换的数据,是在一个已知的范围;
3.示例
比如说:double 转 float
示例一:
int i1=123;
int i2=456;
float f1 = (float) ((i1+i2)*1.2);//容量大的类型转换为容量小的类型时,要加上强制转换符
示例二:
short i=99;
char c=(char)i;
System.out.println(c);
示例三:
byte b1=1;
byte b2=2;
byte b3=(byte)(b1+b2); //byte,short,char在计算时首先转换为int,大容//量(int)转换为小容量的类型(byte)时要加强制转换
特 例:
byte t = 127;//不报错
int a = 127;
//需要强制转换才不报错:编译器只看容器【只看类型】不看值
byte b = (byte)a;System.out.println(b); // 结果为 127