一、基本数据类型
八个基本类型:
boolean
(1位) byte
(8位) char
(16位) short
(16位) int
(32位) float
(32位) long
(64位) double
(64位)
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
Integer x = 1; // 装箱
int y = x; // 拆箱
二、new Integer(123) 与 Integer.valueOf(123) 的区别
new Interger(123)会重新开辟内存区域,新建一个对象。Integer.valueOf(123)会使用常量池中的123。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
在 Java 8 中,Integer 缓存池的大小默认为 -128~127。
基本类型对应的缓冲池如下:
- boolean :true and false
- all byte values
- short : -128 ~ 127
- int: -128 ~ 127
- char : \u0000 ~ \u007F
三、String类
String
类被 final
修饰,不可被继承。 内部使用 char
数组存储数据,该数组被声明为 final
,这意味着 value
数组初始化之后就不能再引用其它数组。并且 String
内部没有改变 value
数组的方法,因此可以保证 String
不可变,有如下好处:
- 可以缓存 hash 值 ,因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
- String Pool 的需要 ,如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
- 安全性
String
经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。 - 线程安全
String
不可变性天生具备线程安全,可以在多个线程中安全地使用。
String
, StringBuffer
和StringBuilder
- 可变性:
String
不可变,StringBuffer
和StringBuilder
可变 - 线程安全:
String
不可变,因此是线程安全的,StringBuilder
不是线程安全的StringBuffer
是线程安全的,内部使用synchronized
进行同步
四、重写与重载
- 重写(
Override
) 存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。 为了满足里式替换原则,重写有以下两个限制: 子类方法的访问权限必须大于等于父类方法; 子类方法的返回类型必须是父类方法返回类型或为其子类型。 使用@Override
注解,可以让编译器帮忙检查是否满足上面的两个限制条件。 - 重载(
Overload
) 存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。 应该注意的是,返回值不同,其它都相同不算是重载。
五、Java 中应该使用什么数据类型来代表价格?
如果不是特别关心内存和性能的话,使用BigDecimal
,否则使用预定义精度的double
类型。