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问题)。适用于读操作多的应用,提升系统吞吐量。