说明
java的Object是所有的对象的基类,它也有自己的基本类型。这些基本类型存储在栈中,运行速度更快。对于这些基本类型java都有对应的包装类,对应的占用空间也更大,尽量使用基本类型处理。
java的基本类型主要有boolean,char,byte,short,int,long,float,double,void这几个,其中String属于包装类,并不属于基本类型。
boolean
- 包装类:Boolean
- 大小:依赖于java虚拟机,一般是占用1byte。详细可见:stackOverflow上面做的实验。
- 数值:true false
char
- 包装类:Character
- 大小:16 bit (2字节)
- 数值:char采用Unicode编码方式,故最大值和最小值都是采用的Unicode形式,可见java的Character源码。
/**
* The constant value of this field is the smallest value of type
* {@code char}, {@code '\u005Cu0000'}.
*
* @since 1.0.2
*/
public static final char MIN_VALUE = '\u0000';
/**
* The constant value of this field is the largest value of type
* {@code char}, {@code '\u005CuFFFF'}.
*
* @since 1.0.2
*/
public static final char MAX_VALUE = '\uFFFF';
注:char是采用Unicode编码,占用2个字节的,表示一个字符。故可以表示一个英文或者一个汉字。
不同的编码对不同的汉字占用的字节是不同的,例如:GBK中,一个英文字符占用1个字节,1个汉字占用2个字节;UTF-8中,一个英文字符占用1个字节,一个汉字占用3~4个字节。等等还有其他类似的编码。
byte
- 包装类:Byte
- 大小:8 bits
- 数值:-128 ~ 127
short
- 包装类:Short
- 大小:16 bits
- 数值:-2^15 ~ 2^15-1
int
- 包装类:Integer
- 大小:32 bits
- 数值:-2^31 ~ 2^31-1
long
- 包装类:Long
- 大小:64 bits
- 数值:-2^63 ~ 2^63-1
float
- 包装类:Float
- 大小:32 bits
- 数值:可采取查看–Float.MIN_VALUES Float.MAX_VALUE
double
- 包装类:Double
- 大小:64 bits
- 数值:可采取查看–Double.MIN_VALUES Double.MAX_VALUE
void
- 包装类:Void
- 数值:–
- 大小:–
注:此类型仅仅存在,没有过多使用,它含有自己的包装类。可见djk源码。
package java.lang;
/**
* The {@code Void} class is an uninstantiable placeholder class to hold a
* reference to the {@code Class} object representing the Java keyword
* void.
*
* @author unascribed
* @since JDK1.1
*/
public final
class Void {
/**
* The {@code Class} object representing the pseudo-type corresponding to
* the keyword {@code void}.
*/
@SuppressWarnings("unchecked")
public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");
/*
* The Void class cannot be instantiated.
*/
private Void() {}
}
基本类型转换
java 的基本类型在使用中,会发生自动转换现象。例如: int 数值和double数值相加,结果就是double数值的。这些都是自动发生的类型提升。它有几个原则:
1.自动类型转化
2.取值窄的向取值宽的转化,反之需要强制类型转换。
等还有其他规则,可参考其他文档。
float和double的使用
java的float和double主要为了提供数值上的精确快速近似计算而设计的,它尤其不擅长用户货币计算 。此处需要注意下,当我们使用他们进行计算时,结果往往不如意。
System.out.println(1.00 - 9*0.1);
0.09999999999999998
对于此类计算,一般采用BigDecimal进行精确计算即可,可选择8中舍入方式,十分方便于计算。
如果要求不高,可以采用int或者long进行计算,例如:1块钱的计算,直接采用100,而不是采用0.20等计算方式。
基本类型和包装类型
java 5提供了基本类型和包装类型的自动转换,这使得他们之间的使用十分方便,但是需要合理使用。java 的基本类型都是存储于栈中的,运算速度十分快,而java包装类型都是对象占用很大的空间,再进行循环计算时,最好精确使用基本类型。
区别
区别主要有3点:
1. 基本类型只含有值;包装类型含有其他方法。比较大小时,需要注意。
2. 包装类型属于对象,会有null存在。使用时,考虑是否为null。
3. 基本类型节省空间和计算。循环使用时,注意考虑基本类型。
合理的使用
以下情况多考虑使用包装类型:
1. 集合的处理,例如:List Set 等。
2. 泛型时,参数化类型使用包装类型。
3. 反射方法的使用,考虑包装类型。
参考:
effective java书籍
博客参考:java基本类型转化原则 http://magina.blog.51cto.com/5235631/1325415