面试经历【数之联】

set为什么没法保证入序跟出序一致

有序与否分为两种情况讨论;

其一:插入顺序能否保证

           set底层采用hash算法计算后进行存储,所以经过hash算法后无法保证计算结果跟插入顺序一致,所以set无法保证插入顺序

其二:自然顺序能否保证

           set在特殊情况下可以保证自然顺序一致(自然数插入),这是由于Integer对象的hashcode返还是其本身,所以恰好会按照升序排列;然后hashmap.hash(object)会进一步进行混淆(保证均匀,避免冲突)。JDK8以后得混淆程度比JDK7的低,在[0,2^32-1]的范围内恰好还是自己,故此数字插入可以保证按大小输出。

 

StringBuffer和StringBiulder性能差多少,能否都采用Stringbuffer进行编码

首先区别异同:

相同处:

都继承于 AbstractStringBuilder

底层都是用字符数组进行实现,字符串都是可变的

将大部分委托交给父类

初始容量都是16,扩容机制都是*2+2

不同处:

StringBuffer是线程安全的,StringBuilder是线程不安全的

StringBuffer是JDK1.0就有了,StringBuilder是JDK1.5以后加入的

StringBuffer比StringBuilder多了一个toStringCache的字段,用来在toString方法中进行缓存,重复调用toString时提升效率

在单线程环境下,StringBiulder性能优于StringBuffer

测试代码:https://blog.csdn.net/kaka_buka/article/details/78296217

StringBuffer的花费时间大概是StringBiulder的2-3倍(随字符串长度增加两者性能趋近相同)

 

vi怎么全局替换

单个替换:s/old/new/

全局替换:s/old/new/g

确认替换:s/old/new/gc(c:confirm)

 

idea怎么连接服务器代码进行联调

参考文档:https://blog.csdn.net/qq_40074764/article/details/79965268

 

Linux怎么查找匹配文件个数

find / -name '**' | wc -l

 

hbase的get和scan有什么区别

参考文档:http://www.cnblogs.com/liupengpengg/p/9197157.html

 

memcached怎么实现session共享

参考文档:https://www.cnblogs.com/kevingrace/p/6398672.html

 

redis怎么实现的hash存储

参考文档:https://www.cnblogs.com/ourroad/p/4891648.html

创建hash表(调用dictCreate函数)--->>> 添加元素

 

redis和memcached的区别

参考文档:https://www.cnblogs.com/kevingrace/p/6398672.html

 

hashmap和hashtable的区别

基本区别:线程安全与否,初始大小,扩容机制,性能,能否null键值,迭代器机制(fast-fail与否)

 

hashmap为什么线程不安全

put方法,当hash冲突的时候,多线程同时进行节点添加,只能添加上一个,导致数据丢失

扩容安全,

1、当多线程触发扩容时,从老数组复制数据到新数组,多线程同时添加的时候会导致数据丢失(同put)

2、由于扩容时需要复制数组,当其他线程已经完成数组复制后进行数据添加,但最后一个线程才完成数组复制,导致新添加的数据丢失

3、JDK1.7以前由于使用指针进行数据复制,可能会导致死循环(JDK1.8更新后不会出现死循环,但是会导致数据丢失(同put))

 

悲观锁和乐观锁的区别

悲观锁:悲观的认为每个线程都会修改数据,所以当一个线程持有的时候会加锁,造成其他线程阻塞(关系型数据库:行锁,表锁,读锁,写锁),synchronized,reentrantLock是悲观锁;

乐观锁:乐观的认为每个线程都不会修改数据,但在更新数据的时候会判断在此期间是否有人已经更改了数据,可以使用版本号机制和CAS算法实现(CAS算法应避免ABA问题)。适用于读操作多的应用,提升系统吞吐量。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章