1、基本数据类型
基本数据类型一共有8种,分别为4种整型类型(byte、short、int、long),2种浮点型类型(float、double),1种字符类型(char),1种布尔类型(boolean)。在Java里面,基本类型所定义的变量都是值传递。下表是对8种基本类型的总结。
基本数据类型 | 存储位数 | 取值范围 | 常量表达注意点 |
---|---|---|---|
byte | 8 | -128~127 | |
short | 16 | -32768~32767 | |
int | 32 | -2^31~2^31-1 | |
long | 64 | -2^63~2^63-1 | long a=26L; |
float | 32 | -2^128 ~ 2^128 | float f; f=1.3f; |
double | 64 | -2^1024 ~ +2^1024 | |
char | 16 | 0~2^16-1 | 转义字符:(1)\’表示单引号 (2)\”表示双引号 (3)\表示一个斜杠\ (4)\n表示换行 (5)\b表示制表符 |
boolean | \ | true或false |
2.基本类型对应的包装类
当我们想把很多数据放进一个容器里时,比如有很多数字,不能直接放进去一个int型变量,因为容器里存放的是对象的引用。这时候就可以用到其包装类。下表是8种基本类型对应的包装类。
基本类型 | byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|---|
封装类型 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
下面用一段简单的代码来进行实验。
package Data_Type;
import java.util.ArrayList;
public class datatype {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<int> list_int=new ArrayList<int>(); //错误 Syntax error, insert "Dimensions" to complete ReferenceType
ArrayList<Integer> list1=new ArrayList<Integer>();//正确
}
}
另外截了一张javabrahman的图来辅助说明,意思与上面的例子类似,都表示不能将原始数据类型传递给泛型,而是应该将其包装类传递进去。
除此之外,我们有时需要处理对象而不是基本类型时就可以用到包装类创建出来的对象。所创建出来的对象有一些便捷的方法供我们使用。我只举出其中一些常用的方法,其他方法还有很多,有兴趣可以去尝试一番。
package Data_Type;
public class datatype {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a=10;
//类型转换
System.out.println(a.byteValue());
//得到int类型的最大值
System.out.println(Integer.MAX_VALUE);
//将String类型转换成double类型的值
String str=new String("3.14");
double strtodouble=Double.parseDouble(str);
System.out.println(strtodouble);
Character c='w';
//转换大(小)写
System.out.println(Character.toUpperCase(c));
//判断是否为大(小)写
System.out.println(Character.isLowerCase(c));
}
}
以下为运行结果:
10
2147483647
3.14
W
true
- 装箱
就是将一个基本类型包装成一个包装类。
//装箱方法1
Integer temp=new Integer(10);
//装箱方法2(自动装箱)
Integer temp1=100;
int i=10;
Integer temp2=i;
//装箱方法3
Integer temp2=Integer.valueOf(100);
- 拆箱
对应的,有装箱就有拆箱。
//拆箱方法1(自动拆箱)
Integer intTemp=100;
int temp=intTemp;
//拆箱方法2
int temp1=intTemp.intValue();
- 注意点
看下面的例子
Integer temp1=100;
Integer temp2=100;
System.out.println(temp1==temp2);
Integer temp3=200;
Integer temp4=200;
System.out.println(temp3==temp4);
输出结果:
true
false
我们知道,在使用==比较两个对象时,是比较它们的“地址”(判断是否指向同一对象)。那么为什么temp1==temp2的结果为true呢?
我们可以看看Integer.valueOf()的代码
我们看到当Integer的值在IntegerCache.low到IntegerCache.high之间时,返回的是IntegerCache.cache[]的一个东西。我们看看它的源码。
这个是Integer中的一个缓存类,也就是说有一个缓存池的范围为[IntegerCache.low,IntegerCache.high](也就是在[-128,127]之间),当创建一个新的Integer对象时,如果值在这个范围内,它会在缓存池里查找是否有等值的对象,如果有,则返回那个对象的引用(也就是两个Integer变量指向同一对象)。如果没有,则新分配堆内存空间给这个对象。
3、数据类型转换
当我们用这些数据类型定义出各种变量,我们要对这些变量进行运算,如果是同种类型,那没什么问题,但是如果是不同的两种数据类型进行类型操作,会发生什么?比如下面这个例子。(java整数型数据默认为int类型,浮点型数据默认为double类型)
public class datatype {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10;
byte b=2;
System.out.println(a+b);
}
}
我们知道byte类型是8位的,int类型是32位。所以2的二进制码为0000 0010,10的二进制码为0000 0000 0000 0000 0000 0000 0000 0110,java会自动在byte变量前面补齐0,这样就可以进行运算,且不会影响数值。这种类型称作自动类型转换,也称隐式类型转换,可以将范围较小的类型自动转化为范围较大的类型。
byte、char、short→int→long→float→double,这是类型自动转换方向。
对应地,还有一种类型叫做强制类型转换,也叫做显式类型转换。这种类型转换会将范围较大的类型强制转化为范围较小的目标类型,可能会损失精度。强制类型转换的格式是在数据前面加上(),并且在括号里输入目标类型。比如下面这个例子。
public class datatype {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10;
int b=220;
byte c=(byte)a;
byte d=(byte)b;
System.out.println("c:"+c);
System.out.println("d:"+d);
}
}
输出结果为
c:10
d:-36
我们可以发现将a强制转换后的值未发生变化,而b被强制转换后发生了变化。这是因为将范围较大的类型强制转换较小的类型时,java只会截取原数据的二进制码的右几位(取决于目标类型,比如byte类型就只截取右8位),而byte类型的范围为-128~127,只有8位,10的二进制码为0000 0110(前面的位数上全为0),而220的二进制码为1101 1100,因为byte是带符号的,截取后10的二进制码为0000 0110,未发生变化,而220截取后为1101 1100,最高位作为符号位,所以对应的十进制数为-36,此时发生变化。总的来说,当一个较大类型的数据大于目标类型的范围时,数值会发生变化。将浮点型类型转换为整型时,会损失精度,反之会提高精度。
public class datatype {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10;
int b=220;
double c=(double)(a+b);//提高精度
int d=(int)(12.2)+(int)(22.6);//损失精度
System.out.println("c:"+c);
System.out.println("d:"+d);
}
}
输出结果:
c:230.0
d:34
*此文章为个人总结,如果存在错误,还请大佬指教