StringBuffer,StringBuilder 问题档次并不低,如果仔细思考的话,这是一个历史悠久,并且至今仍在困扰很多程序员的问题。
这是个字符串内存管理策略问题。
几十年前 在C和Pascal的时代,就有字符串存储形式 是 结尾还是 长度+内容的争论,这个问题严重影响了API的设计,内存的管理,甚至程序架构。
字符串是一种非常常用的 生命周期通常很短的对象,而且它的size是不固定的,长度为 1 或 1GB都有可能,导致内存管理非常麻烦复杂。
用长度+内容表示,每个串都要额外付出4个字节,用 结尾吧,算长度就很麻烦,万一结尾忘了 就要崩溃,选哪个好
字符串的长度放哪里,放到起始指针的位置,还是起始指针的前面
如果放前面,那么字符串起始指针和内存块起始不一致怎么解决
字符串拼接的时候把源串复制到目标串结尾,那么目标串剩余内存不够怎么办,重新分配要多一次赋值,频繁拼接性能有问题怎么办
函数返回值如果是字符串,那么这个串是调用者分配内存还是被调用者分配,谁来负责释放。
如果调用者分配,那么调用者怎么知道字符串将有多长。
频繁分配释放大小各异的字符串,会不会导致内存碎片化
对于小字符串是分配在堆上还是栈上
怎么把常量串和变量串分别处理
如果设计面向对象的字符串,字符串加法怎么定义,是在原来对象上加,还是生成一个新对象
如果每加一次都生成新对象会不会导致构造析构太频繁
如果是托管语言会不会太频繁GC
要不要设计单独的辅助类来解决字符串拼接问题
那这个辅助类怎么设计,要不要考虑线程安全
如果考虑线程安全的话,怎么兼顾性能
你把这些问题都思考透彻了,再遇到问此类问题的面试官,就给他上上课,保证他懵逼。
这么多赞,受宠若惊了。
大家可以关注我的公众号:Hollis,和我交流。关注后,在后台回复:成神导图,可以获得Java工程师进阶的整套思维导图哦。
这个问题只是开个场,热个身而已啊。
StringBuffer,StringBuilder区别是啥?
什么是线程安全?
如何保证线程安全?
什么是锁?死锁?
synchronized的实现原理是什么?
有了synchronized,还要volatile干什么?
synchronized的锁优化是怎么回事?(锁粗化?锁消除?自旋锁?偏向锁?轻量级锁?)
知道JMM吗?(原子性?可见性?有序性?)
Java并发包了解吗?
那什么是fail-fast?什么是fail-safe?
什么是CopyOnWrite?
那AQS呢?那CAS呢?
CAS都知道,那乐观锁一定知道了?
乐观锁悲观锁区别是什么?
数据库如何实现悲观锁和乐观锁?
数据库锁有了解么?行级锁?表级锁?共享锁?排他锁?gap锁?next-key lock?
数据库锁和隔离级别有什么关系?
数据库锁和索引有什么关系?
什么是聚簇索引?非聚簇索引?最左前缀是什么?B+树索引?联合索引?回表?
分布式锁有了解吗?
Redis怎么实现分布式锁?
为什么要用Redis?
Redis和memcache区别是什么?
Zookeeper怎么实现分布式锁?
什么是Zookeeper?
什么是CAP?
什么是BASE?和CAP什么区别?
CAP怎么推导?如何取舍?
分布式系统怎么保证数据一致性?
啥是分布式事务?分布式事务方案?
那么,最后了,来手写一个线程安全的单例吧?
不用synchronized和lock能实现线程安全的单例吗?
这你都能答上?那好吧,你给我解释下什么是Paxos算法吧?
卒~!
我回答过的其他问题:
这类问题,就算是我这样根本不懂java的,给我5分钟bing一下也能了解个大概了。问这样的问题,万一人家真的很厉害只是恰巧不知道这个知识点,那岂不是错过人才了。
我面试的时候,看中的是应聘者自身的资质而不是他是否知道某些技术点或者掌握某个特定技能。比方说虽然我们大部分时候都会用c#来开发,但你完全不会c#也没有任何关系,算法题写java都行,只要你能让我相信你可以在短时间内学会就行了。而事实上招进来的人,从完全不会开始,基本上1~2个月就能有实际产出了。
记得以前一个老板和我说过,我们公司招人看的是长期的培养前途,比如你觉得这个人以后有没有机会升到senior,能的话就招。
局限在某个具体的知识技能,就限制了你获取人才的范围。
被各种朋友嘲笑订阅太低,比如跳舞:哥均订比你高订高,比如香蕉:我有四五万均订,七万高订,比如某表姐:日订阅破十一万人民币,比如三少:我每个月订阅都有好几十万呢,都是零花钱,比如奥斯卡:断更涨订阅,真的涨订阅……
感觉特别屈辱。
最屈辱的是经常有些新人跑过来,兴高采烈的说:蛤蟆哥哥,我均订破万了。你嫉妒的恨不得掐死他……