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

 

posted @ 2020-01-12 19:30  牧云文仔  阅读(125)  评论(0编辑  收藏  举报