Java常考面试题(五)

简介: 好好努力。

      序言

         好好努力。

                                                                        ---WZY

一、Iterator和ListIterator的区别是什么?

      自我解答:

            Iterator是针对所有collection来使用的,而看名字ListIterator,顾名思义,就是给list集合特有的,增加了其他专有的方法吧。

      参考答案:

            下面列出了他们的区别:
              Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
              Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
              ListIterator继承了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

      自我评价:

            首先第一映像,我只看过Iterator,第二个ListIterator我是没听过的,但是通过这么久的学习,我可以看出,ListIterator就是只能给list集合用,而不是给其他集合,

            1、Iterator:是接口,能给所有的集合使用

            2、ListIterator:也是接口,继承了Iterator接口,同时肯定对Iterator接口中的方法进行了增强

                ·ListIterator只能对list集合迭代,

                ·ListIterator不仅能向后迭代,也能想前迭代

                ·ListIterator还能增加元素和删除元素,并且还能获得前一个元素和后一个元素

             

        注意:使用Iterator迭代的时候需要注意几个问题

           1、xx.next(); 每次使用这个,就会往后面推一位,也就是索引会往后移一位,

           2、xx.hasNext(); 当检测到后面没有值了,返回false,但是指向器还是会往后面移一位。指向最后一位的后一位,这也是在ListIterator发现的,使用Iterator没有这个考虑,无所谓,因为只有ListIterator才有往前迭代的方法,所以才有前面这一大堆话。

           3、ListIterator使用xx.add();在当前索引的后面增加,不是替代当前索引的值

           4、ListIterator使用xx.set(E);将当前索引的值给替换成我们给定的值

二、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

      自我解答:

            这个没接触过。。。

      参考答案:

            Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

            java.util包下面的所有的集合类都是快速失败的,快速失败的迭代器会抛出ConcurrentModificationException异常

            java.util.concurrent包下面的所有的类都是安全失败的。,而安全失败的迭代器永远不会抛出这样的异常。

      自我评价:

            先说一下,这个题目花了我两个多小时,才彻底弄明白,但是还是很有效果的,比如,我查看了Iterator实现的源码,和之前看ArrayList源码时不懂得地方都弄清楚了,Iterator实现的原理和ArrayList源码分析我会在别的文章中写出来,到时候可以看看。现在来解决这个问题

            1、fail-fast 和 fail-safe 这两个针对的是Iterator,

            2、fail-fast:快速失败,在那些不是线程安全的集合使用Iterator时发生的问题,因为在迭代的时候,有别的线程对集合内部的构造进行了改变,比如,add、delete这类操作,都会使之发生快速失败。

            3、fail-safe:安全失败,在线程安全的集合中发生上面的问题,就会出现该fail-safe了。

              因为我明白了其中到底发生了什么,所以,写上面的文字,我知道意思,可能大家有点不理解,可以先了解一下fail-fast是什么,推荐博文:http://blog.csdn.net/chenssy/article/details/38151189 这里面就详细讲解了fail-fast是什么, 建议先观看arrayList源码,在其中重点了解Iterator的实现,还有modCount是什么,知道了这些,结合这篇博文和我说的,差不多就了解啦。

3、Java中的HashMap的工作原理是什么?

    自我解答:

         使用数组存储键值数据,每个数组中的位置又是一个链表。

    参考答案:

        HashMap的底层是用hash数组和单向链表实现的 ,当调用put方法是,首先计算key的hashcode,定位到合适的数组索引,然后再在该索引上的单向链表进行循环遍历用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有则在链头保存该值。HashMap的两个重要属性是容量capacity和加载因子loadfactor,默认值分布为16和0.75,当容器中的元素个数大于 capacity*loadfactor时,容器会进行扩容resize 为2n,在初始化Hashmap时可以对着两个值进行修改,负载因子0.75被证明为是性能比较好的取值,通常不会修改,那么只有初始容量capacity会导致频繁的扩容行为,这是非常耗费资源的操作,所以,如果事先能估算出容器所要存储的元素数量,最好在初始化时修改默认容量capacity,以防止频繁的resize操作影响性能。

    自我评价:

         1、没搞清楚hashMap的存储结构,虽然看了源码,但还是模模糊糊,现在差不多知道了

         2、hashMap是用hash表和单向链表来实现存储数据的,具体模型如下,并且在hashmap中有一个内部类entry,它有四个属性V、K、next、hash,我们放入的key和value会分别放入entry的K、V中,所以存放的都市entry对象。

                    

        3、首先将key通过hash算法算出hashcode值,

        4、通过hashcode值找到在hash数组中对应的位置,然后通过equals方法,遍历单向链表,看有没有相同的key值,如果有,则替换key所对应的value值,如果没有,将该数据插入链表的开始。

四、hashCode()和equals()方法的重要性体现在什么地方?

    自我解答:

        这个问题可以看我那边hashcode详解的文章,因为有hashCode()和equals()两个方法,使对数据的查询的效率变得很高,比如set集合中,就用到了这两个方法,不可以存放相同的值,这里就得到了体现

    

    参考答案:

        Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。  

    自我评价:

        差不多就是这样,就解释一下大概的情况,举个例子,差不多了。

五、HashMap和Hashtable有什么区别?

    自我解答:

        hashMap是Hashtable的父类,hashtable是线程安全的,而hashmap不是。

    参考答案:

        HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
        HashMap允许键和值是null,而Hashtable不允许键或者值是null。
        Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
        HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
        一般认为Hashtable是一个遗留的类。

    自我评价:

        map的各种继承关系模糊了,

        1、hashMap的子类是linkedHashMap

        2、hashTable和hashMap的关系就好像arrayList和Vector的关系差不多

        3、hashTable是同步的,而hashMap是异步的,也就是一个线程安全一个线程不安全

        4、hashMap的key值可以为null 而hashTable不可以

        5、具体的可以去看collections集合的那篇总结文章

相关文章
|
1月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
4月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
261 0
|
4月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
274 3
|
12天前
|
设计模式 缓存 安全
提供一些准备Java八股文面试的建议
准备Java八股文面试需系统梳理核心知识点,涵盖Java基础、集合、多线程、JVM、设计模式及主流框架。重在理解原理而非死记硬背,结合源码与实际场景深化认知。通过思维导图构建知识体系,分模块刷题并模拟面试表达,关联项目经验,体现应用能力。关注Java新特性与技术演进,避免知识过时。最终实现从“背答案”到“懂原理、能实战”的转变,提升综合竞争力。(238字)
113 7
|
3月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
369 0
|
3月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
161 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
1月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
4月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
2357 48
|
4月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
136 5
|
4月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
205 5