Java的数据类型介绍
java是一个强类型的编程语言,所有的变量在第一次出现的时候必须有数据类型。几乎所有的编程语言中都会有数据类型,什么是数据类型呢?软件的存在主要是进行数据的处理,现实生活中的数据会有很多,所以编程语言对其进行了分门别类,然后不同的数据类型的数据会给其分配不同大小的空间进行存储。换句话说,java中的数据类型作用就是指导java虚拟机在程序运行阶段到底应该给该变量分配多大的内存空间。
Java中的数据类型分为两种:
基本数据类型(Primitive Type)
引用数据类型(Reference Type)
java中的基本数据类型分为4类8种 :
1.布尔型:
boolean 只能使用true/false进行赋值
不能使用数字进行赋值【c++可以】
2.字符型:
char 底层基于Unicode编码实现的不区分中英文,统一都是2个字节 = 16位
char x = ‘a’;//指定字面值的赋值方式
char y = ‘中’;//指定字面值的赋值方式
char z = ‘\t’;//转义字符
\t \r \b \n
制表符 返回行首 退格键 换行
char t = 88;//通过ascii编码进行赋值
char w = ‘\u4e2d’;//通过Unicode编码进行赋值
3.整型:
组成:符号位[1] + 数值位[n-1]
取值范围:-2^(n-1) 到 2^(n-1)-1
n-1:符号位占用一个位
-1:0占用一个位
byte short int long
位: 8 16 32 64
字节: 1 2 4 8
*: 整数类型默认是int类型
*:long结尾尽量加上L
*:当一个数值超出int类型最大边界的时候注意使用long类型
*:jdk7.0开始 数字中间可以加_为了提高可读性
整数类型的赋值方式:
int num1 = 55;//十进制进行赋值
int num2 = 055;//八进制进行赋值 0-7
int num3 = 0x55;//十六进制进行赋值 0-9 a-f
int num4 = 0b1011;//二进制进行赋值 0-1
4.浮点型:
组成: 符号位 + 幂值位 + 数值位
float double
位: 32 64
字节: 4 8
F/f D/d
Java中的引用数据类型分为3类无数种:
1.类
2.接口
3.数组
java中除了以上的8种基本数据类型之外,其它的数据类型均属于引用数据类型,也就是说字符串在java中不属于基本数据类型,而属于引用数据类型。请看八种基本数据类型对照表:
接下来我们来看一下byte类型的取值范围:首先byte属于字节型,占用空间大小是1个字节byte,1个byte是8个bit位,二进制位中的一个1或者一个0就是一个bit位,而java中的数字有正负之分,二进制位中最左边的数字表示符号位,0表示正数,1表示负数,所以byte类型最大值是:01111111,将这个二进制位转换为十进制是:127。byte类型最小值是-128,也就是说1个字节可以表示256种不同形式。对于以上的八种基本数据类型来说,其中七种类型byte,short,int,long,float,double,boolean计算机表示起来是很容易的,因为这七种类型底层直接就是数字,十进制的数字和二进制之间有固定的转换规则,其中boolean类型只有true和false,而true底层实际上是1,false底层实际上是0。除了以上的七种数据类型之外,还有一种类型叫做字符型char,这个对于计算机来说表示起来就不是那么容易了,因为字符毕竟是现实世界当中的文字,计算机是如何表示文字的呢?
最初的时候美国标准协会制定了ASCII码,ASCII码采用1个字节编码,大家是否还记得1个字节可以表示256种不同的形式,对于美国来说这个足够了,因为英文单词就是由26个英文字母拼凑而成,大小写全部才52个,再加上标点符号也不会超过256个。ASCII码中规定’a’对应97,’b’对应98,以此类推,’A’对应65,’B’对应66,以此类推,’0’字符对应48,’1’字符对应49,以此类推,这些常见的编码还是需要大家记住的。
什么是编码?什么是解码?我们拿’a’来解释:
● ‘a’ ----(以ASCII字符集进行编码)----> 01100001
● 01100001----(以ASCII字符集进行解码)----> ‘a’
大家一定要注意:编码和解码要采用同一种字符编码方式(要采用同一个对照表),不然会出现乱码。
随着计算机的不断发展,为了让计算机支持更多国家的语言,国际标准组织又制定了ISO-8859-1字符集,又被称为latin-1,向上兼容ASCII码,仍不支持中文,主要支持西欧语言。
当计算机发展到亚洲的时候,计算机开始支持简体中文、繁体中文、日本语、朝鲜语等,其中支持简体中文的字符集包括:GB2312 < GBK < GB18030,它们的容量大小不同。支持繁体中文的大五码Big5等。
后来,国际组织制定了一种字符编码方式,叫做Unicode编码,这种编码方式统一了全球所有国家的文字,具体的实现包括:UTF-8,UTF-16,UTF-32等。
java为了国际化,为了支持所有国家的语言,所以java采用的编码方式为Unicode编码。例如’中’对应的Unicode码是’\u4e2d’。在实际开发中几乎所有的团队都会使用Unicode编码方式,因为这种方式更通用,兼容性更好。
面试题:
java中的数据类型分为几种?
2种/无数种
基本数据类型 简单数据类型 [程序里面自带的数据类型]
引用数据类型 自定义数据类型[程序员自己开发的数据类型]
Java基本数据类型转换
Java基本数据类型之间是存在固定的转换规则的,现总结出以下6条规则,无论是哪个程序,将这6个规则套用进去,问题迎刃而解:
● 八种基本数据类型中,除boolean类型不能转换,剩下七种类型之间都可以进行转换;
● 如果整数型字面量没有超出byte,short,char的取值范围,可以直接将其赋值给byte,short,char类型的变量;
● 小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short(char) < int < long < float < double
注:short和char都占用两个字节,但是char可以表示更大的正整数;
● 大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
● byte,short,char类型混合运算时,先各自转换成int类型再做运算;
● 多种数据类型混合运算,各自先转换成容量最大的那一种再做运算;
接下来,根据以上的6条规则,我们来看一下以下代码:
public class TypeConversionTest {
public static void main(String[] args) {
//1000超出byte取值范围,不能直接赋值
//byte b1 = 1000;
//如果想让上面程序编译通过,可以手动强制类型转换,但程序运行时会损失精度
byte b1 = (byte)1000;
//20没有超出byte取值范围,可以直接赋值
byte b2 = 20;
//1000没有超出short取值范围,可以直接赋值
short s = 1000;
//1000本身就是int类型,以下程序不存在类型转换
int c = 1000;
//小容量赋值给大容量属于自动类型转换
long d = c;
//大容量无法直接赋值给小容量
//int e = d;
//加强制类型转换符
int e = (int)d;
//int类型和int类型相除最后还是int类型,所以结果是3
int f = 10 / 3;
long g = 10;
//g是long类型,long类型和int类型最终结果是long类型,无法赋值给int类型
//int h = g / 3;
//添加强制类型转换符
int h = (int)(g / 3);
//long类型赋值给long类型
long m = g / 3;
//g先转换成byte,byte和int运算,最后是int类型,无法直接赋值给byte
//byte x = (byte)g / 3;
//将以上程序的优先级修改一下
byte x = (byte)(g / 3);
short y = (short)(g / 3);
short i = 10;
byte j = 5;
//short和byte运算时先各自转换成int再做运算,结果是int类型,无法赋值给short
//short k = i + j;
int n = i + j;
char cc = 'a';
System.out.println("cc = " + cc);
//将字符型char转换成数字,'a'对应的ASCII是97
System.out.println((byte)cc);
//char类型和int类型混合运算,char类型先转换成int再做运算,最终197
int o = cc + 100;
System.out.println(o);
}
}
运行结果如下图所示: