电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

2021年面试常问的JAVA基础知识点包含容器、多线程、垃圾回收机制、反射JVM等

14页
  • 卖家[上传人]:孙盼
  • 文档编号:195122140
  • 上传时间:2021-09-04
  • 文档格式:DOCX
  • 文档大小:211.51KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、JAVA基础知识1 容器1.1 容器有哪些?JAVA的容器主要分为两大类:Collection和Map。Java中的容器集合分为两大阵营,一个是Collection,一个是MapCollection下分为Set,List,QueueSet的常用实现类有HashSet,TreeSet等List的常用实现类有ArrayList,LinkedList等Queue的常用实现类有LinkedList,ArrayBlockingQueue等Map下没有进一步分类,它的常用实现类有HashMap,ConcurrentHashMap等1.2 Collection 和 Collections 有什么区别?Collection是一个集合接口,提供了一系列对集合对象进行基本操作的通用方法,所有集合都是他的子类。Collections是一个工具类,它服务于Collection框架,它用于对集合对象进行排序、搜索等操作。1.3 List、Set和Map的区别?区别:元素是否可以重复、元素是否有序。1.4 HashMap和HashTable的区别?1) HashMap不是线程安全的,HashTable是线程安全的

      2、,因此HashMap的效率略高。2) HashMap允许键值为空,HashTable不允许。3) HashTable是同步的,HashMap不是同步的。4) HashMap的底层数组默认是16,一定是2的指数;hashtable默认是11,每次扩充2+15) 一般不建议使用Hashtable(1)HashTable是遗留类,内部实现很多没优化和冗余。(2)即使在多线程环境下,现在也有同步的ConcurrentHashMap替代,没有必要因为是多线程而用HashTable。HashMap和TreeMap的区别:TreeMap在可以实现按照键值排序。LinkedHashMap:输入和输出的顺序相同。Weakhashmap:key采用弱引用,key不再被外部引用时就会被GC回收,而hashmap是强引用,只有key从hashmap删除才会被GC回收。1.5 HashMap的原理:HashMap 基于 Hash 算法实现的,我们一般用HashMap存储key-value类型的数据,它的底层是一个数组,当我们调用put(key,value)方法的时候,首先会对key进行计算得出一个hash值,然

      3、后根据hash值计算出(key,value)存放在数组上的位置这个时候我们会遇到两种情况:一是数组上该位置为空,可以直接放入数据;还有一种情况是该位置已经存放值了,这就发生了哈希冲突。在现在使用较为普遍的JDK1.8中是这样处理哈希冲突的:先用链表把冲突的元素串起来,如果链表的长度达到了8,并且哈希表的长度大于64,则把链表转为红黑树。(在JDK1.7中没有转化为红黑树这一步,只用链表解决冲突)细节:HashMap如何确定Key存放在数组的位置?Key的hashcode()得到hash值(4字节),然后把hash值的高16位和低16位异或的结果与数组的长度-1的值进行按位与操作得到的结果就是key在数组里存放的下标。为什么不直接用key的hashcode而要把高16位和低16位异或?通常数组的长度不会超过216,如果不异或的话高16位就不会起作用了。所以把高16位和低16位异或,使得高位的影响稀释到低位中,使得计算key位置的操作能够充分散列均匀。为什么要把链表转为红黑树?阈值为啥是8?在极端情况下,比如说key的hashCode()返回的值不合理,或者多个密钥共享一个hashCode

      4、,很有可能会在同一个位置产生严重的哈希冲突。这种情况下,如果我们仍然使用链表把多个冲突的元素串起来,这些元素的查询效率就会从O(1)下降为O(N)。为了能够在这种极端情况下仍保证较为高效的查询效率,HashMap选择把链表转换为红黑树,红黑树是一种常用的平衡二叉搜索树,添加,删除,查找元素等操作的时间复杂度均为O(logN)至于阈值为什么是8,这是HashMap的作者根据概率论的知识得到的。当key的哈希码分布均匀时,数组同一个位置上的元素数量是成泊松分布的,同一个位置上出现8个元素的概率已经接近千分之一了,这侧面说明如果链表的长度达到了8,key的hashCode()肯定是出了大问题,这个时候需要红黑树来保证性能,所以选择8作为阈值。HashMap的扩容原理?Hashmap里面维护了一个容量值和一个加载因子,当数组里的元素个数超过容量值*加载因子后就会触发扩容机制。,默认每次扩充为原来的二倍。首先得到新的容量值和新的扩容阈值,默认都是原来大小的两倍。然后根据新容量创建新的数组最后把元素从旧数组中迁移到新数组中在JDK1.7中,迁移数据的时候所有元素都重新计算了hash,并根据新的ha

      5、sh重新计算数组中的位置。在JDK1.8中,这个过程进行了优化:如果当前节点是单独节点(后面没有接着链表),则根据该节点的hash值与新容量减一的值按位与得到新的地址。如果当前节点后面带有链表,则根据每个节点的hash值与旧数组容量进行按位与的结果进行划分。如果得到的值为0,这些元素会被分配回原来的位置;如果得到的结果不为0,则分配到新位置,新位置的下标为当前位置下标加上旧数组容量。如果被除数是2的幂次方,对数组长度取余的方法就等价于对数组长度减一的值进行按位与操作。计算机中位运算的效率远高于取模运算。1.6 ArrayList 和 LinkedList 的区别是什么?数据结构实现(本质区别:底层实现不同):ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 Array

      6、List 增删操作要影响数组内的其他数据的下标。综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。1.7 如何实现数组和 List 之间的转换?数组转list:Arrays.asList(array)List转数组:list.toArray()1.8 ArrayList和Vector线程:Vector是线程安全的,Arraylist不是线程安全的。Vector对外提供的方法都是synchronized修饰的。性能:ArrayList的性能略高于Vector。都可以根据需要扩容,vector每次扩大一倍,arraylist每次扩大50%1.9 Queue中的poll和remove有何区别?相同点:都是返回第一个元素,并在队列中删除返回的对象。不同点:如果没有元素poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常1.10 迭代器 Iterator 是什么?怎么用?有何特点?Iterator 接口提供遍历任何 Collection 的接口。Itera

      7、tor 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。1.11 Iterator 和 ListIterator 有什么区别?Iterator可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。1.12 Java集合的fail-fast和fail-safe机制?fail-fast是一种错误检测机制,Java在适合单线程使用的集合容器中很好地实现了fail-fast机制,举一个简单的例子:在多线程并发环境下,A线程在通过迭代器遍历一个ArrayList集合,B线程同时对该集合进行增删元素操作,这个时候线程A就会抛出并发修改异常,中断正常执行的逻辑。fail-safe机制更像是一种对fail-fast机制的补充,它被广泛地

      8、实现在各种并发容器集合中。回头看上面的例子,如果线程A遍历的不是一个ArrayList,而是一个CopyOnWriteArrayList,则符合fail-safe机制,线程B可以同时对该集合的元素进行增删操作,线程A不会抛出任何异常。要理解这两种机制的表象,我们得了解这两种机制背后的实现原理:我们同样用ArrayList解释fail-fast背后的原理:首先ArrayList自身会维护一个modCount变量,每当进行增删元素等操作时,modCount变量都会进行自增。当使用迭代器遍历ArrayList时,迭代器会新维护一个初始值等于modCount的expectedModCount变量,每次获取下一个元素的时候都会去检查expectModCount和modCount是否相等。在上面举的例子中,由于B线程增删元素会导致modCount自增,当A线程遍历元素时就会发现两个变量不等,从而抛出异常。CopyOnWriteArrayList所实现的fail-safe在上述情况下没有抛出异常,它的原理是:当使用迭代器遍历集合时,会基于原数组拷贝出一个新的数组(ArrayList的底层是数组),后

      9、续的遍历行为在新数组上进行。所以线程B同时进行增删操作不会影响到线程A的遍历行为。1.13 如何一边遍历一边删除Collection的元素?2 多线程2.1 什么是线程、守护线程?线程是操作系统进行独立运算调度的最小单元,被包含在进程中,是进程中的实际运作单位。线程和进程的区别:进程是资源分配的最小单元,线程是程序执行的最小单元。进程拥有自己的资源空间,线程共享进程中的资源。一个进程中包括多个线程,线程是轻量级的进程。守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。2.2 创建线程的方式?创建线程有三种方式:继承 Thread 重写 run 方法;实现 Runnable 接口,重写run方法;实现 Callable 接口,重写call方法。Callable oneCallable = new Tickets();FutureTask oneTask = new FutureTask(oneCallable); Thread t = new Thread(oneTask);t.start();runable和callable的区别:callable有返回值、call方法可以抛出异常,可以拿到一个future对象。2.3 start和run的区别?系统调用一个线程类的start方法之后,这个线程处于就绪状态,而非运行状态,调度过程中,JVM调用run方法完成实际的操作。如果直接调用run方法,这个方法就会被当做一个普通的方法被调用,程序中仍然只有主线程这一个线程。也就是说start()方法能够异步的调用run方法。也就是说只有通过调用线程的start方法才能真正达到多线程的目的。2.4 sleep和wait和y

      《2021年面试常问的JAVA基础知识点包含容器、多线程、垃圾回收机制、反射JVM等》由会员孙盼分享,可在线阅读,更多相关《2021年面试常问的JAVA基础知识点包含容器、多线程、垃圾回收机制、反射JVM等》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.