【面经】几轮面试题

面经地址

对于面经我的答案:
一道斐波那契相关,一道数据库行列转置,一道实现一个栈,还有一道是百万计的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框架
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了213 篇原创文章 · 获赞 258 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/wolf_love666/article/details/94589277