文章目录
String
String为什么要不可变?是如何实现不可变的?
(1)String是放在常量池的,这意味这会被多个变量引用,如果可变被修改其他引用者也会跟着变,这不符合我们缓存复用的初衷的;
(2)如何实现的:
首先String 类是final修饰的,不能被继承,并且没有修改String的方法;
底层为数组final,引用不可变;
(3)常见场景
Sting进行+运算时候会重新new 对象放到字符串常量池;
String如何实现缓存的?
应该是=赋值的时候,编译器进行解析的;
new String()的是不放进常量池的;
String的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进StringPool的String非常多, 就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String. intern时性能会大幅下降
常用api(TODO)
String.format()
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
Object… args代表什么呢? 相当于Object [] args,这是java中的varargs机制,可变数量的参数;
参考链接:http://t.csdn.cn/3v98A
StringBuffer
支持可变,可以插入、拼接、删除等;
初始数组大小为16,支持扩容
俩buffer相+呢?
StringBuilder(线程安全)
sychronized关键字