一、基本类型与包装类
Java的基本数据类型包括boolean、char、byte、short、int、float、long、double 8种。
其分别对应的包装类是:Boolean、Character、Byte、Short、Integer、Float、Long、Double类。
下面来分别介绍一下这些数据类型和对应的包装类。
1、布尔型(boolean和Boolean)
boolean只有两个对应的值,分别是true和false。用来判定逻辑条件。boolean型不能与其他类型的数据进行转换。
boolean flag1 = true;
boolean flag2 = false;
其对应的包装类为Boolean。
其构造方法可以是用boolean类型作为参数,也可以传入字符串作为参数,当只有传入的字符串是“true”的时候,对应的值才是true。
Boolean a = new Boolean(true); //true
Boolean b = new Boolean("true"); //true
Boolean c = new Boolean("1"); //false
当以boolean存入HashMap中时,是将boolean自动装箱成Boolean再存入,所以取值的时候需要强制转换为Boolean。
boolean a = true;
Map map = new HashMap();
map.put("a", a);
Boolean t1 = (Boolean) map.get(a);
Boolean类的成员方法包括了toString()、compareTo()、valueOf()、equals()、hashCode()、getBoolean()等方法,用法简单,此处不做描述。
2、字符型(char和Character)
char在定义时,需要用单引号作为引用。
(双引号为String类,单引号为char)
其对应的包装类为Character。Character中支持很多编码。但建议在程序中不适用此类型。
char a = 'a';
Character b = new Character('b');
(1)成员变量
static int MIN_RADIX :返回最小基数。
static int MAX_RADIX :返回最大基数。
static char MAX_VALUE :字符类型的最大值。
static char MIN_VALUE :字符类型的最小值。
static Class< Character > TYPE :返回当前类型。
类中还有很多成员变量,此处不做过多表述。
(2)方法
isDigit(char ch)、isDefined(char ch)、isLetter(char ch) 、getType(char ch)、toString()等等方法。
此处不做举例。
(3)转义字符
前面有反斜杠(\)的字符代表转义字符,它对编译器来说是有特殊含义的。
\t - 在文中该处插入一个tab键
\b - 在文中该处插入一个后退键
\n - 在文中该处换行
\r - 在文中该处插入回车
\f - 在文中该处插入换页符
\’ - 在文中该处插入单引号
\” - 在文中该处插入双引号
\ - 在文中该处插入反斜杠
3、整型
整型中对应的包装类均存在 将部分其他类型的数据转换为本类型的数据的方法。即valueOf、parseXXX方法可以将字符串形式的值装换为数字。
例子:
//对String类型的转换
int a = Integer.parseInt("666");
//int类型
int b = Integer.valueOf(666);
//String类型
int c = Integer.valueOf("666");
(1)byte和Byte
byte主要用于特定应用场合,如I/O操作中的输入输出流。
取值范围是-128-127(即-2^7 ~ 2^7-1)。
存储需求为1字节(8位)。
其对应的包装类是Byte。
(2)short和Short
short类型也是主要用于特定的应用场合。
取值范围是 -32 768~32 767(-2^15 ~ 2^15-1)。
存储需求为2个字节(16位)。
其对应的包装类是Short。
(3)int和Integer
int类型最常用。
取值范围是-2^31~2^31-1
存储需求为4个字节(32位)。
其对应的包装类是Integer。
(4)long和Long
long属于长整型。在赋值时使用后缀 L(如40000000000L)。
取值范围是 -2^63 ~ 2^63-1
存储要求是8个字节(64位)
其对应的包装类是Long。
4、浮点型
(1)float和Float
float的数值有后缀F(如3.14F),没有后缀F的默认为double类型。
取值范围有效数字为6-7位
其存储需求为4字节。
其对应的包装类是Float。
(2)double和Double
double的数值精度是float类型的两倍。也有人称之为双精度。绝大部分情况都是使用double作为浮点型数据类型。
取值范围有效数字为6-7位
其存储需求为4字节。
其对应的包装类是Double。
5、自动装箱和拆箱
装箱:自动将基本数据类型转换为其对应的包装类.
拆箱:自动将包装类型转换为基本数据类型.
包装类与基本数据类型之间可以实现数据类型的自动转换,即装箱和拆箱。
二、数据类型之间的转换
boolean型不能与其他类型的数据进行转换,否则会出错。
基本数据类型的级别从低到高如下:
byte < char < short < int < long < float < double
级别低到级别高的(从左到右)类型自动转换(隐式转换)。
级别高到级别低的(从右到左)类型需要强制类型转换。
整型向浮点型转换时,可能会有精度损失的转换。
byte a1 = 1;
//byte a2 = 1.0; //1.0属于double类型,需要强转
byte a2 = (byte) 1.0;
short b1 = 1;
//short b2 = 1.0; //1.0属于double类型,需要强转
short b2 = (short) 1.0;
int c1 = 1;
//int c2 = 1.0; //1.0属于double类型,需要强转
int c2 = (int) 1.0;
long d1 = 1; //1属于int类型,自动转换,不需要强转
long d2 = 1L; //1L表示long类型
//long d3 = 1.0; //1.0属于double类型,需要强转
long d3 = (long) 1.0;
float e1 = 1.0f; //1.0f表示float类型
float e2 = 1; //1属于int类型,自动转换,不需要强转
float e3 = 1L; //1L表示long类型,自动转换
//float e4 = 1.0; //1.0属于double类型,需要强转
float e4 = (float) 1.0;
//double的级别最高,全都是自动转换类型。
double f1 = 1;
double f2 = 1.0;
double f3 = 1L;
double f4 = 1.0f;
另外一个是参与计算时的转换。byte、char、short的数据在参与运算时会自动转换为int。
byte a = 1;
short b = 2;
char c = 3;
System.out.println(a+b+c);
上面的结果是6。
但在使用“+=”运算时,就不会发生类型转换。
byte a = 1;
//a = a + 1; //编译出错
a = (byte) (a+1);
a += 1;
上述的编译出错是因为 a+1 时,已经把a隐式转换为int类型,计算后的结果为int,需要强制转换为byte之后才能赋值。
short、char类型也同理。
还有另一个问题,就是级别高的往级别低的转换的时候的溢出问题。
short a = 128;
byte b = (byte) a;
System.out.println(a);
System.out.println(b);
上面的结果是:a = 128 ; b = -128
在Java中正数用源码表示,负数用补码表示,第一位是符号位。a的编码是:0000 0000 0000 0000 0000 0000 1000 0000,而强转为byte之后,只取byte的最大范围值,就是1000 0000,1000 0000是负数(第一位为1),所以是-128。
在一开始,我没注重基本类型的转换,在这里摔了一跤。趁机补回来吧。