ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大厂面试解析

2021-07-22 10:30:02  阅读:151  来源: 互联网

标签:userInfo 链表 面试 gc 大厂 key myUserInfoSoftReference2 解析 引用


ArryaList和 LinkedList

ArrayList 是数组结构  内存在一块  遍历查找很容易,但是删除添加效率低,添加删除需要在添加的index后面arraycpoy  

LinkedList  是节点结构 node , node内部是有pre next和item    添加删除效率高  但是查找效率不高 需要遍历

提高ArrayList的效率 可以用标记,比如删除的时候。。不arraycpoy  只把元素删除 。标记为null

HashMap<key, value>  数据结构 table数组+链表 (Java8是 table数组+链表 /红黑树

hashmap初始长度是16   并且长度只可能是2的幂  大小  因为key的hashcode求模的时候是用与运算的   这样每一位都是1    hashcode|(length-1)    

key-> 其实用到的是key的 hashcode  能快速定位到下标

key->hashcode 求模运算计算得到   int   的值是0-(length-1)  length 是table数组的长度   即把key转成了数组的下标

元素用头插法 不是从尾部添加

第一层根据key的hashcode  直接找到数组的index,无需遍历

第二层根据index  再遍历对应的链表 就找到了

 但是可能所有的元素都在一个链表上。那效率就很低了

但是java8为了解决hash碰撞  也就是很多元素都在一个链表上  效率低   不用链表保存相同的index元素 而用了效率更高的红黑树treenode  (每个节点左边的数据都小于这个节点,右边都大于这个节点)

 但是红黑树创建相对浮在需要排序旋转

所以java中hashmap中的数组中并不是每一个数据结构都是红黑树,而是index这个链表的长度超过8个的时候才转成红黑树

HashMap线程不安全 所以有HashTable线程安全

HashTable比HashMap结构差不多,但是就是方法加了同步锁  sychronized

put和get不能同时进行会阻塞,效率低

ConcurrentHashMap 是基于 hashmap或者hashtable的优化

可能get和put不是同一个链表 ,那就不需要所有的方法都上锁

是在方法内部上锁,锁一段代码,锁住链表。。另外的链表你照样可以访问

强引用:不手动释放,不会回收

软引用:gc扫描到时不一定回收,只有内存不足时才回收

弱引用:gc扫描到的时候才回收

虚引用:取不到对象,取的时候为空,但是gc的时候可以拿到,能打印hashcode 作用就是gc的时候能收到一个通知

//强引用 不手动释放不会回收
MyUserInfo userInfo = new MyUserInfo();

//强引用 内存不足才会释放
SoftReference<MyUserInfo> myUserInfoSoftReference = new SoftReference<MyUserInfo>(userInfo);
MyUserInfo userInfo1 = myUserInfoSoftReference.get();//软引用

//弱引用 gc扫描到的时候就是释放
WeakReference<MyUserInfo> myUserInfoSoftReference1 = new  WeakReference<MyUserInfo>(userInfo);
MyUserInfo userInfo2 = myUserInfoSoftReference.get();//弱引用

//虚引用 使用的时候引用不到,gc的时候能引用到,也就是gc的时候能通知程序员
ReferenceQueue<MyUserInfo> referenceQueue = new ReferenceQueue<>();
PhantomReference<MyUserInfo> myUserInfoSoftReference2 = new  PhantomReference<MyUserInfo>(userInfo, referenceQueue);//必须联合referenceQueue一起用
userInfo = null;
System.out.print("userInfo:" + userInfo);//打印为:myUserInfoSoftReference2:null
System.out.print("myUserInfoSoftReference2:" + referenceQueue.poll());//打印为:myUserInfoSoftReference2:null
System.gc();
try {
    Thread.sleep(2000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.print("myUserInfoSoftReference2:" + referenceQueue.poll());//打印为:myUserInfoSoftReference2:myUserInfoSoftReference2的hash地址
//也就是gc的时候能获取这个对象

参考:https://www.bilibili.com/video/BV18f4y1L772?p=9&spm_id_from=pageDriver

标签:userInfo,链表,面试,gc,大厂,key,myUserInfoSoftReference2,解析,引用
来源: https://blog.csdn.net/shuangrenlong/article/details/118968757

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有