对于面经我的答案:
一道斐波那契相关,一道数据库行列转置,一道实现一个栈,还有一道是百万计的MySQL优化
答案:
- 作用:
都是java应用中用来处理字符串的类- 源码实现:
String和StringBuilder和StringBuffer都实现了CharSequence接口。
String是字符串的数组形式,不可变被final修饰,长度也不可变。
StringBuilder和StringBuffer都继承了AbstractStringBuilder,AbstractStringBuilder实现了Appendable接口,长度可变。- 安全性:
StringBuilder未加关键字sychronized修饰,StringBuffer修饰了,由于有锁的限制,并发场景下,StringBuffer安全,同理StringBuilder没有锁的开销,所以性能比较快,具体根据场景使用。- 性能对比:
String类型和StringBuffer类型的主要性能区别:String是不可变的对象,因此每次在对String类进行改变的时候都会生成一个新的string对象,然后将指针指向新的string对象,所以经常要改变字符串长度的话不要使用string,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低;
2、String为什么设计成不可变的,这样的原因是什么?
- String不可变:String值储存在常量池中。一个已有字符串"abcd",如果改变值成"abcedl",不是在原内存地址上修改数据,而是在常量池中查找或生成这个新值,再把引用指向新值的地址,如图:
- 为什么不可变
String 类本身是final的,不可以被继承
String类内部通过private final char value[]实现,从而保证了引用的不可变和对外的不可见
String内部通过良好的封装,不去改变value数组的值
为什么要设计成不可变- 1. 安全性
线程安全,不可变天生线程安全
String常被用作HashMap的key,如果可变会引有安全问题,如两个key相同
String常被用作数据库或接口的参数,可变的话也会有安全问题- 2. 效率
通过字符串池可以节省很多空间
每个String对应一个hashcode,再次使用的话不用重新计算- 扩展
可以用反射来改变String中value的值,所以严格意义上说不一定不可变
3、hashmap,如果key没有实现comparable接口,红黑树根据什么插入?
资料
4/5参考我之前的文章
6、spring框架