八大数据类型:
- 字节型
- byte(Byte)/8
- 浮点型
- float(Float)/32
- double(Double)/64
- 布尔型
- boolean(Boolean)/~
- 字符型
- char(Character)/16
- 整型
- short(Short)/16
- int/(Integer)32
- long(Long)/64
- boolean 只有两个值:true,false。可以使用1bit来存储。但是具体大小没有明确规定。
- JVM会在编译时期把boolean类型转换为int,true=1,false=0,java支持boolean数组但是是通过byte数组来实现的。
包装类型:
-
- Integer x=2;自动装箱:Integer.valueOf(2)
- int y=x;自动拆箱:X.intValue()
缓存池:
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象;
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
IntegerCache缓存池默认是-128-127
也可以在JVM中修改上限 XX:AutoBoxCacheMax=<size>来指定上限大小。
String:
- java8中String是由final修饰,char数组
- java9中用byte数组并使用coder标识使用了哪种编码
- value数组被声明成final,这意味着value初始化以后就不能被修改了,因此保证了不可变性。
String用final修饰的好处:
- 可以缓存哈希值
- 因为String的hash经常被使用,比如HashMap中的key,不可变特性保证了只计算一次和hash值不变。
- StringPool的需要
- 如果一个String对象被创建过了,那么就会从StringPool中取得引用,只有String是不可变的,才可能使用StringPool。
- 安全性
- String 经常作为参数,String的不可变性保证了参数的不可变性。
- 线程安全
- 不可变性,天生具备线程安全。
String,StringBuffer,StringBuilder区别
- 可变性
- String不可变
- StringBuffer和StringBuilder可变
- 线程安全
- String线程安全
- StringBuffer线程安全(内部使用了Synchronized同步)
- StringBuilder线程不安全
StringPool
- 字符串常量池(StringPool), 保存着所有字符串字面量,这些字面量在编译时期就确定,不仅如此还能使用String的intern()方法在运行过程中向StringPool中插入新的字符串。
- 当一个字符串调用intern()方法时,如果StringPool中已经存在一个字符串通过equals比较相等。那么就会返回StringPool中的引用,否则创建一个新的,返回新的引用。
- 简而言之String中的intern方法就是StringPool中如果有这个字符串就返回这个字符串的引用,如果没有,就新建一个然后返回新的引用。
- java7之前中StringPool被放到常量池中也就是永久代,java7之后放到堆中,因为永久代空间有限,大量字符串被创建容易出现OOM。
new String(“ABC”)
- 使用这种方式一共会创建两个对象(前提是Stringpool中没有ABC的对象)
- “AB