本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正
1. 关于java中常用数据类型的长度
byte/1,char/2(因为java用的是Unicode编码,固定为2字节),short/2,
int/4(当时大多数系统为32位系统,涉及到组原和操作系统相关知识,4字节有助于加快计算速度),
float/4,long/8.double/8
2. 关于Integer以及缓存池
有以下样例(==未重写情况下自动判断两边是否为同一个对象)
首先,引用类型Integer的初始化方法有2种,
(1)调用构造函数,会创建新的Integer对象
(2)valueOf函数
这里我们可以看到一个很有趣的地方,当i的范围在low和high之间,会直接返回一个
IntegerCache.cache数组中的元素,即已存在对象而不是重新创建一个对象,否则的话就重新创建。
我们把low,high之间的数组元素称作缓存池,当自动装箱的值在这个范围内时,返回的是同一个对象。
范围外则重新创建,因此不是同一个对象,所以z=k,g!=h
从上图的IntegerCache源码中,我们可以看到缓存池的上下限默认为(low)-128,(high)127
low是固定的,但hign是可以修改的,(下面这段是百度到的,仅作参考* : Differences between new Integer(123), Integer.valueOf(123) and just 123)
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 -
128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax=
<size> 来指定这个缓冲池的.大.小,该选项在 JVM 初始化的时候会设定.一个名为
java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上
界。
2. String
(1)变与不变
String是final修饰的char数组,因此不可变,所以是线程安全的
SringBuilder、StringBuffer可变,前者线程不安全,后者相反
(2)关于字符串常量池
String源码中有一个方法public native String intern();(native意思大致为底层代码由C编写)
String的2种初始化方法因这个会产生差异。intern会向字符串常量池中创建元素。
第二种初始化方法会自动插入常量池,第一种则不会