1. 八大基本数据类型
数据类型 | 大小 | 范围 |
---|---|---|
字节型:byte | 8位 | -128~127 |
字符型:char | 16 | \u0000~u\ffff |
短整型: short | 16 | -32768~32767 |
整型:int | 32 | -231 ~ 231-1 |
长整型: long | 64 | -263 ~ 263-1 |
单精度浮点型: float | 32 | 3.4e-45~1.4e38 |
双精度浮点型:double | 64 | 4.9e-324~1.8e308 |
boolean | 1 | true/false |
Java决定了每种简单类型的大小,这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一
1.1 整形
在 Java 中, 整型的范围与运行 Java代码的机器无关。这就解决了软件从一个平台移植到 另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题
长整型数值有一个后缀 L 或 1 (如 4000000000L
)
1.2 浮点型
程序中我是怎么处理金额的
浮点类型用于表示有小数部分的数值,在java中有两种浮点类型
类型 | 存储要求 | 取值范围 |
---|---|---|
float | 4字节 | 有效位数为6-7位 |
double | 8字节 | 有效位数为15位 |
double
表示这种类型的数值精度是float
类型的两倍;绝大部分应用程序都采用double类型,很多情况下,float
类型的精度很难满足需求float
类型的数值后面有一个后缀F或f,例如3.14f
,没有后缀 F 的浮点数值(如3.14
) 默认为double
类型。当然,也可以在浮点数值后面添加后缀 D 或 d (3.14D
)
浮点数值不适用于金融计算
浮点数值不适用于无法接受舍入误差的金融计算中,float和double主要是为了科学计算和工程计算而设计的,他们执行二进制浮点运算, 这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的,但是他们无法提供完全精准的结果,因为二进制系统中无法精确地表示分数 1/10
,这 就好像十进制无法精确地表示分数 1/3
—样;
例如,命令 System.out.println ( 2.0-1.1 )
将打印出 0.8999999999999999
, 而不是人们想象的 0.9
1.3 boolean
类型
整型值和布尔值之间 不能进行相互转换
2. 类型转换
简单类型数据间的转换,有两种方式:自动转换和强制转换
2.1 自动转换
当一个较"小"数据与一个较"大"的数据一起运算时,系统将自动将"小"数据转换成"大"数据,再进行运算
① 自定转换就是隐式转换,只能是小转大不能大转小
byte b;int i=b; long l=b; float f=b; double d=b;//可以通过
float a; int i = a;//不能通过,要强制转换
② 如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如
char c='c'; int i=c;
System.out.println("output:"+i);//输出:output:99;
③对于byte
,short
,char
三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换
short i=99 ;
char c=(char)i;
System.out.println("output:"+c);//输出:output:c;
2.2 强制转换
将"大"数据转换为"小"数据时,你可以使用强制类型转换。即你必须采用下面这种语句格式:
int n=(int)3.14159/2;
强制类型转换通过截断小数部分将浮点值转换为整型,这种转换肯定可能会导致溢出或精度的下降
如果想对浮点数进行舍人运算, 以便得到最接近的整数(在很多情况下, 这种操作更有 用),那就需要使用 Math_round 方法
double x z 9.997;
int nx = (int) Math.round(x);
现在, 变量 nx
的值为 10。 当调用 round
的时候, 仍然需要使用强制类型转换(int)
。其原因 是 round
方法返回的结果为 long
类型,由于存在信息丢失的可能性,所以只有使用显式的强 制类型转换才能够将 long
类型转换成 int
类型
如果试图将一个数值从一种类型强制转换为另一种类型, 而又超出了目标类型的 表示范围,结果就会截断成一个完全不同的值
例如,(byte) 300
的实际值为 44
对于结合赋值和运算符的情况
如果运算符得到一个值, 其类型与左侧操作数的类型不同, 就会发生强制类型转 换。 例如,如果 x 是一个 int
x += 3.5;
是合法的, 将把 x设置为(int)(x+ 3.5)。
2.3 包装类过渡类型转换
我们首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换
float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue();//F1.doubleValue()为Float类的返回double值型的方法
Double.V
2.4 String
与其他类型的转换
① 其他转String
//①调用类的串转换方法:
X.toString();
//②自动转换:
X+"";
//③使用String的方法:
String.volueOf(X);
② String
转其他
//① 先转换成相应的封装器实例,再调用对应的方法转换成其它类型
Double.valueOf("32.1").doubleValue()
//②静态parseXXX方法
String s = "1";
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );
//③Character的getNumericValue(char ch)方法
3. 自动拆装箱
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)
基本数据类型 | 包装类 |
---|---|
byte | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
在Java SE5之前,要进行装箱(基本类型转包装类),可以通过以下代码
Integer i = new Integer(10);
在Java SE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能
自动装箱: 就是将基本数据类型自动转换成对应的包装类
Integer i =10; //自动装箱
//实现原理是
Integer i=Integer.valueOf(10);
自动拆箱:就是将包装类自动转换成对应的基本数据类型
Integer i =10;
int i=integer; //拆箱
//实现原理是
int i=integer.intValue();
Java中整型的缓存机制
public static void main(String... strings) {
Integer integer1 = 3;//看字节码文件可以看到他调用Integer.valueOf()进行了装箱操作
Integer integer2 = 3;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 300;
Integer integer4 = 300;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}
我们普遍认为上面的两个判断的结果都是false。虽然比较的值是相等的,但是由于比较的是对象,而对象的引用不一样,所以会认为两个if判断都是false的,但是真正的输出结果是
integer1 == integer2
integer3 != integer4
原因就和Integer中的缓存机制有关。在Java 5中,在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用
但是这有两个前提
① 适用于整数值区间-128 至 +127。
② 只适用于自动装箱。使用构造函数创建对象不适用。
所以如果数字在-128至127之间时,自动装箱会直接使用缓存中的对象,而不是重新创建一个对象。
后来在Java 6中,可以通过java.lang.Integer.IntegerCache.high
设置最大值。
这种缓存行为不仅适用于Integer对象。我们针对所有的整数类型的类都有类似的缓存机制
Byte, Short, Long有固定范围: -128 到 127。对于Character, 范围是 0 到 127。除了Integer以外,这个范围都不能改变