数据类型
程序之中有很多的数据类型,每一个数据都有相关的类型,不同的数据类型占用的空间不同,数据类型的作用就是指导JVM在运行程序的时候给该数据分配多大的内存空间
基本数据类型、引用数据类型
基本数据类型(四大类八小种):整数型 byte short int long
浮点型 float double
布尔型 boolean
字符型 char
字符串“abc”不是基本数据类型,属于“引用数据类型”。字符属于“基本数据类型”
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
boolean | 1 |
char | 2 |
计算机在任何情况下只能识别二进制,对于,字节byte,1字节 = 8个比特位,一个比特位就是0或者1表示一个二进制位。1kb = 1024byte。
整数型当中的type占用一个1字节,占用8个比特位。关于java中的数字类型,数字都是有正负之分的,所以在数字的二进制当中有一个二进制位被称为“符号位”,并且这个符号位在所有二进制的最左边0表示正数,1表示负数。
* byte类型的最大值:01111111, 2的7次方 - 1 ,结果是127
byte类型的最小值:-128
byte类型可以表示256个不同的数字
八中数据类型当中,byte,short,int ,long ,float,double,boolean这7中数据类型计算机在表示的时候比较容易,因为底层是数字,十进制的数字和二进制存在转换关系。
但是八种数据类型的char类型表示的是现实世界的文字,文字和计算机二进制之间“默认”情况下是不存在任何转换关系的。
为了让计算机更好的表示现实世界当中的文字,我们需要人为干涉,提前制定好“文字”与“二进制”的关系,这种对照关系被称为:字符编码
最初出现的字符编码是ASCII码(一个字节编码)。
大写字母 | 十进制ASCII码 | 小写字母 | 十进制ASCII码 |
A | 65 | a | 97 |
B | 66 | b | 98 |
C | 67 | c | 99 |
D | 68 | d | 100 |
E | 69 | e | 101 |
F | 70 | f | 102 |
G | 71 | g | 103 |
H | 72 | h | 104 |
I | 73 | i | 105 |
J | 74 | j | 106 |
K | 75 | k | 107 |
L | 76 | l | 108 |
M | 77 | m | 109 |
N | 78 | n | 110 |
O | 79 | o | 111 |
P | 80 | p | 112 |
Q | 81 | q | 113 |
R | 82 | r | 114 |
S | 83 | s | 115 |
T | 84 | t | 116 |
U | 85 | u | 117 |
V | 86 | v | 118 |
W | 87 | w | 119 |
X | 88 | x | 120 |
Y | 89 | y | 121 |
Z | 90 | z | 122 |
随着计算机的发展,后来出现了一种编码方式,是国际化组织ISO制定的,这种编码方式支持西欧语言,向上兼容ASCII码,仍然不支持中文。这种编码方式是ISO-8859-1,又称为latin-1
随着计算机响亚洲发展,计算机开始支持中文、日文、韩文等国家文字,其中支持简体中文的编码方式: GB2312<GBK<GB18030
后来出现了一种编码方式统一了全球所有的文字,容量较大,这种编码方式叫做:unicode编码unicode编码方式有很多具体的实现:
utf-8;utf-16;utf-32
java语言采用了unicode编码方式,所以“标识符”可以使用unicode编码。
实际开发过程中使用UTF-8编码方式。
数据类型的取值范围
byte 【-128 - 127 】
short 【-32768 - 32767 】
boolean 【true ; false】
char 【0 - 65536】
数据取值的默认值,成员变量(全局变量)没有赋值,系统会自动赋值,局部变量没有赋值会报错。
byte、short、int、long | 0 |
float、double | 0.0 |
boolean | false【在c语言中false是0,true是1】 |
char | \u0000 |
数据类型详解
1.char数据类型:
public class DataTypeTest {
public static void main(String[] args) {
char c = 'a' ;
System.out.println(a);
char x = '过';
System.out.println(x);
}
}
java中char类型是两个字节,一个中文刚好是两个字节,所以java中char可以一储存一个中文字符
java中的转义字: “\”
public class DataTypeTest {
public static void main(String[] args) {
// 普通的n 字符
char c1 = 'n';
System.out.println(c1);
// 转义字符 换行符
char c2 = '\n';
System.out.println(c2);
}
}
System.out.println // 输出后换行
System.out.print // 输出后不换行
\t 代表制表符 制表符显示的为空格和空格表示相同,但他们的ACSII码不同。
\u 代表转换后边的unicode编码
*输出一个‘ \ ’
char c3 = '\\' ;
System.out.println(c3);
转义字符出现在特殊字符之前,会让特殊字符变成普通字符
jdk中 native2ascii.exe命令,可以将所有字符转换为ascii码
2.整数型数据:
数据类型 | 占用空间大小 | 默认值 | 取值范围 |
byte | 1 | 0 | 【-128~127】 |
short | 2 | 0 | 【-32768 -32767】 |
int | 4 | 0 | 【-2147473648-2147483647】 |
long | 8 | 0L |
**java语言中的‘’整数型字面值‘’被默认当做‘int’类型处理,要让“整数型字面值”被当做long来处理的话,需要在后边添加l \ L。
整数型的三种表达方式:字面值直接开头,就是10进制,以0开头就是8进制,以0x开头就是16进制形式。
long z = 122554887; //错误的定义方法
*****后边的数字会被当做int类型处理,处理错误超出了int类型的范围,所以在后边添加l、L来转换类型。
数据转换
x变量是long类型 8个字节,y变量是int类型4个字节。——————》 编译报错,大容量不能直接赋值给小容量。
大容量转换成小容量,需要进行强制类型转换,强制类型转换需要加‘强制类型转换符’,加上“强制类型转换符”后编译通过了,但是运行阶段可能会损失精度。所以强制类型转换符谨慎使用。
public class DataTypeTest {
public static void main(String[] args) {
long x = 100 ;
int y = (int)x;
}
}
强制原理:
原始数据:00000000 10000000 00000000 00000000 01100100
转换之后:10000000 00000000 00000000 01100100 // 补码形式
将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】计算机储存数据都是以补码的形式储存,将补码转换为原码就是最终结果。
byte b = 40;
byte c = 128; // 错误
特殊语法规则: 在字面值没有超过byte类型的范围时候,自动将int字面值转换为byte,(即自动实现从int到type,从大容量到小容量的自动转变),但是超过了就不行。
byte b = 40;
byte c = (byte)128;
System.out.println(c);
输出会出现问题
**语法机制
当一个整数字面值没有超过byte,short,char的取值范围,这个字面值可以直接给byte,short,char类型的变量。
3.浮点型数据:
float 单精度【4个字节】
double 双精度【8个字节】
double的精度太低了,不适合做财务软件。财务涉及到钱的问题,要求精度较高,所以为基础SE类库大众,准备了精度更高的类型,是一类引用数据类型,java.math.BigDecimal
其实java程序中SUN提供了一套庞大的类库,java开发者是基于这套基础的类库来进行开发的。
例如:String.java / String.class
在java语言当中,所有的浮点型数据默认被当做double类型来处理,如果想要当做float来处理,需要在字面值后边加上f、F。
大容量转换为小容量需要加‘强制转换符’,所以上述程序编译有误。
解决方案:1:强制转换
float a = (float) 5.1;
2:没有类型转换
float b = 5.1f;
注意:double 和 float 在计算机内部二进制储存的时候都是近似值。
4.布尔值(boolean)数据类型:
在java语言当中boolean类型只有两个值:true 和false, 没有其他值。
与c语言当中0,1可以表示真假不同,在底层存储的时候boolean类型占用一个1个字节,因为世纪储存的时候false底层是0,true底层是1。
5.转换规则:
1.除了boolean类型意外,剩下的其中类型都可以互相转换
2.小容量向大容量转换,称为自动容量转换
byte<short<int<long<float<double<char<
char和short可以表示的种类数量相同,但是char可以取更大的正整数。
3.大容量转换为小容量,程序才能运行通过,强制类型转换有可能造成数据丢失。
4.当整数的字面值没有超出byte,short,char的取值范围,可以直接赋值给变量。
5.byte,short,char混合运算时,各自先转换成了int类型再运算。
6.多种类型混合运算,会换成容量最大的数据类型再运算。