数据类型分为两大类
变量类似于内存中的一个个盒子,盒子有形状和大小,不同的数据类型代表不同的形状只有形状一致的东西才能放到对应的盒子中,对于同形状的盒子(同类型),也有大小之分(取值范围的不同)。
一、基本数据类型
数字型
整数类型
byte
- 字节,长度为1个字节,8位。
- 字节类型的应用常见于I/O操作中,对于文件的处理上。
- 字节好比人民币里的“分”单位,日常比较少用,关键时候还是离不开的。
short
- 短整型,长度为2个字节,16位。
- 短整型使用得比较少;在32位CPU中,JVM会自动把short转换为int;在程序运行中,short不会比int更节省内存。
- 在存储和传输上,确定值short能装下时,使用short比使用int更节省空间。
int
- 整型 长度为4个字节,32位。
- 整型比较常用,在64位CPU中又会转为long。
long
- 长整型 长度为8个字节,64位。
- 同short和int,在64位CPU上运行效率高,根据实际情况使用。
浮动类型
- 浮点数是不精确的,一定不能用于比较。浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
- 特别需要注意的是两个浮点数的算术运算。
java.math.BigDecimal;
public class Test{
public static void main(String args[]){
System.out.println(0.05+0.01); //0.060000000000000005
System.out.println(1.0-0.42); //0.5800000000000001
System.out.println(4.015*100); //401.49999999999994
System.out.println(123.3/100); //1.2329999999999999
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//结果为false
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd); //0.5 正确值
System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1); //0.5000000000000001 错误值
//判断两个值是否相等
BigDecimal bd1=BigDecimal.valueOf(0.1);
BigDecimal bd2=BigDecimal.valueOf(1.0/10);
System.out.println(bd1);
System.out.println(bd2);
System.out.println(bd1.equals(bd2));
}
}
float
- 单精度浮点型,长度为4个字节,32位。
- 单精度浮点型使用较少,JVM会自动把float转换为double后再运算,能节省存储和传输空间但不节省内存空间。
double
- 双精度浮点型,长度为8个字节,64位。
- 双精度浮点型在开发中比较常用。
字符型
char
- 字符型,长度为2个字节,16位。
- 字符型比较少用,对应的字符数组及String比较常用。
布尔型
boolean
- 布尔型,1位。
- 值只能为true或flase,常用来做判断。
二、引用数据类型
类、接口、数组。Integer,Byte,Float,Double,Char,String,其它一切java提供的,或者你自己创建的类。
其中Integer又叫 int的包装类。而Byte和Float也类似,一般包装类的名字首写是数值名的大写开头。
String类你可以理解成 char[]数组去想就明白了。因为数组是一个类,所以String也就是一个类了。它不是基本数据类型。
变量的转换
自动转换原则:由表述范围小的转向表述范围大的。
由大的转向小的,使用强制转换,有可能会丢失信息。
要特别注意是否值是否溢出了。
public class HelloWorld {
public static void main(String []args) {
System.out.println(1000000000*200); //-1863462912 溢出了
System.out.println(1000000000*(long)200); //200000000000
System.out.println(1000000000*200L); //200000000000
}
}
变量的存放
所以在对String值进行比对时,不能直接使用==符合;得使用equals()方法;这是个常见的错误。
public class HelloWorld {
public static void main(String []args) {
char k = 'K';
char h='K';
System.out.println(k==h); //true
String y ="Y";
String w = "Y";
String u=new String("Y");
System.out.println(y==u); //false
System.out.println(y==w); //true
System.out.println(y.equals(u)); //true
}
}
使用关键字new,一定会开辟一个新的堆内存空间。想要进行字符串内容的比较,可以使用equals()。