Java数据类型的零碎知识
1. a=a+b 和 a+=b的区别
+=会有隐式的强制转换,编译不会报错
但a=a+b,如果两个byte相加,会将加数提升到int,编译会报错
2. String不可变(immutable)的原因
a. JVM内存中的常量池:保存在编译期间被确定并且在.class文件中(磁盘文件)的数据,包含8种基本类型、String机器数组的常量值、符号等
b. 字符串池是一个方法区里的特殊存储区域,当创建一个String,如果它已经在pool中存在,则会返回一个存在的String引用,所以多个String变量会使用同一个引用
c. 当多个String变量使用同一个引用,如果字符串不是immutable的,改变其中一个变量的引用会导致另一个变量指向错误的值
3. 拼接字符串
a. 运算符“+”:内部实现是StringBuilder的append()方法,每次都要new一个新的StringBuilder,效率低
b. 如果在一行代码里连续使用“+”,会直接生成String
c. concat()方法:拷贝字符串并new出String对象,效率低
d. 所以使用StringBuilder,只需要new一个StringBuilder对象,提高了效率
4. StringBuilder/StringBuffer:
a. 内部使用字符数组,最后new一个String对象
b. 扩容的时候有性能损耗,所以尽量可以在构造函数里指定长度
c. StringBuffer对所有方法都做了同步,是线程安全的,但是性能有损耗
d. StringBuilder不是线程安全的,但性能好,在方法内部作为局部变量,不涉及多线程,所以应该使用StringBuilder