java基础面试题系列(71 - 80)

2023-11-11

20200714 by 1z

  1. 请你说明HashMap 和 HashTable的区别
1.是否同步 
	*HashMap是非同步的,HashTable是同步的

2.继承体系 
	*HashTable继承自Dictionary,HashMap继承自AbstractMap类,HashMap允许使用null值(key value都行)

3.内部是否容纳null值
	*HashTable不允许key or value为null,HashMap允许使用null值(key中只能有一个null值,value中可以有多个)

4.遍历方式
	*HashTable使用Enumeration进行遍历,HashMap使用iterator进行遍历

5.HashTable 和 HashMap的扩容方式有所不同
	* HashTable初始化容量为11,每次扩充之后变成原来的2 * n + 1
	* HashMap会动态调整容量为2的幂次方,初始容量为16,之后的每次扩容,容量变为原来的两倍
	
6.HashTable 和 HashMap的计算hash值方式不同
	* HashTable直接使用hash方法,计算的hash值,然后计算index的时候采用除留余数法
		int hash = key.hashCode();
		int index = (hash & 0X7FFFFFFF) % tab.length;
		
	* HashMap实现计算hash值的时候,首先根据元素的key计算hash值,然后通过位移异或操作得到最终结果
		int h;
		return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

  1. 请说明快速失败(fail-fast) 和 安全失败(fail-safe)的区别?
一、快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。

原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCount 变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛出异常,终止遍历。

注意:这里异常的抛出条件是检测到 modCount != expectedmodCount 这个条件。如果集合发生变化时修改 modCount 值刚好又设置为了 expectedmodCount 值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的 bug。

场景:java.util 包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
---------------------------------------------------------------------------------------
二、安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发 Concurrent Modification Exception。

>缺点:基于拷贝内容的优点是避免了 Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent 包下的容器都是安全失败,可以在多线程下并发使用,并发修改。


参考链接 : http://www.cnblogs.com/ygj0930/p/6543350.html
  1. 请你说说Iterator 和 ListIterator的区别?
1.Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。
但ListIterator是一个功能更加强大的, 它继承于Iterator接口,只能用于各种List类型的访问。

2.ListIterator有add方法,可以向list中添加对象,Iterator不行

3.ListIterator可以实现双向遍历(next(),previous()),而Iterator只能进行单向遍历(next()4.ListIterator可以定位当前的索引位置,通过nextIndex 和 previousIndex实现,Iterator不行

5.ListIterator可以实现对当前list中对象的修改(set()),iterator只能单纯的遍历,不能修改

demo
package com.basic_knowledge;

import java.util.*;

public class TestListIterator {

    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<String>();
        a.add("aaa");
        a.add("bbb");
        a.add("ccc");
        System.out.println("Before iterate : " + a);
        ListIterator<String> it = a.listIterator();
        while (it.hasNext()) {
            System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
        }
        while (it.hasPrevious()) {
            System.out.print(it.previous() + " ");
        }
        System.out.println();
        it = a.listIterator(1);//调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
        while (it.hasNext()) {
            String t = it.next();
            System.out.println(t);
            //修改集合内元素
            if ("ccc".equals(t)) {
                it.set("nnn");
            } else {
                it.add("kkk");
            }
        }
        System.out.println("After iterate : " + a);
    }
}

  1. 请简单说明一下什么是迭代器?
迭代器就是提供了一种访问一个集合对象各个元素的途径,同时不会暴露元素的内部细节。

具体在java中使用Iterator 和 Iterable两个接口用来实现集合类的可迭代性

通俗用法: 使用hasNext() 作为循环条件,再用next拿到集合内部元素进行操作
  1. 请解释为什么集合类中没有实现Cloneable 和 Serializable接口
先谈一下Cloneable 和 Serializable的作用
*Cloneable的作用
	实现了Cloneable接口,可以调用clone 从而实现深浅拷贝
*Serializable的作用
	如果某个类有需要持久化的需求(存到磁盘中),或者进行远程的对象调用,可以使用序列化实现这些作用
	
上述可以看出,这两个接口的作用主要是针对对象的,而集合类只是为了管理对象而存在的,所以应该在集合类中的具体对象中实现接口,而不是在集合类中体现。
  1. 请说明java集合类框架的基本接口有哪些
一种有两大接口: Collection 和 Map,Collection内部又有Set 和 List子接口
* Collection:代表一组对象,每一个对象都是它的子元素。
* Set:不包含重复元素的Collection。 
* List:有顺序的collection,并且可以包含重复元素。 
* Map:可以把键(key)映射到值(value)的对象,键不能重复。

简单架构图:

java.util.Collection [I]

|—java.util.List [I]

    |—java.util.ArrayList [C]

    |—java.util.LinkedList [C]

    |—java.util.Vector [C]

        |—java.util.Stack [C]

|—java.util.Set [I]

    |—java.util.HashSet [C]

    |—java.util.SortedSet [I]

        |—java.util.TreeSet [C]
java.util.Map [I]

|—java.util.SortedMap [I]

    |—java.util.TreeMap [C]

|—java.util.Hashtable [C]

|—java.util.HashMap [C]

    |—java.util.LinkedHashMap [C]

|—java.util.WeakHashMap [C]
  1. 请说明一下ConcurrentHashMap的原理
ConcurrentHashMap内部使用了分段锁的操作,内部存在着两个类HashEntry 和 Segment,HashEntry用来封装map的键值对,Segment用来充当锁的角色。每个Segment对象守护者整个散列表的若干个HashBacket,每个HashBacket是由若干个HashEntry组成的链表或者红黑树。

HashEntry结构
static final class HashEntry<K,V> {
       final K key;                       // 声明 key 为 final 型
       final int hash;                   // 声明 hash 值为 final 型
       volatile V value;                 // 声明 value 为 volatile 型
       final HashEntry<K,V> next;      // 声明 next 为 final 型
  
       HashEntry(K key, int hash, HashEntry<K,V> next, V value) {
           this.key = key;
           this.hash = hash;
           this.next = next;
           this.value = value;
       }
}

ConcurrentHashMap和HashMap在处理数据的过程类似,使用链地址法解决哈希冲突
Segment 继承自 ReentrantLock 实现了并发控制 

static class Segment<K,V> extends ReentrantLock implements Serializable {
        private static final long serialVersionUID = 2249069246763182397L;
        final float loadFactor;
        Segment(float lf) { this.loadFactor = lf; }
    }

详细分析: https://blog.csdn.net/dingjianmin/article/details/79776646?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

img

  1. 请解释一下TreeMap
TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。

TreeMap的特性:

1)根节点是黑色 

2)每个节点都只能是红色或者黑色

3)每个叶节点(NIL节点,空节点)是黑色的。 

4)如果一个节点是红色的,则它两个子节点都是黑色的,也就是说在一条路径上不能出现两个红色的节点。

5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

      TreeMap tMap = new TreeMap((o1,o2)->{
      		//指定排序规则
            return (int)o1 - (int)o2;
        });
  1. 请说明一下ArrayList是否会越界?
ArrayList的底层是基于数组操作的,可能在并发情况下发生越界
  1. 请你说明ConcurrentHashMap有什么优势,1.7和1.8有什么区别

参考链接: https://www.cnblogs.com/like-minded/p/6805301.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础面试题系列(71 - 80) 的相关文章

  • Java集成第三方OCR识别——文档篇

    Java快速集成OCR文字识别 相关文章 简介 官方文档 Web 配置操作 第一步 成为百度AI开放平台的开发者 第二步 开通文字识别服务 1 领取免费测试资源 2 创建应用 第三步 使用文字识别服务 1 添加OCR依赖 2 下载相关工具包
  • C++中换行endl和\n的区别

    转载自 http www sjyhome com c endl n html 在C 中 在显示的形式上 cout lt
  • .NET正则基础——.NET正则类及方法应用[转载]

    1 概述 初学正则时 对于Regex类不熟悉 遇到问题不知道该用哪种方法解决 本文结合一些正则应用的典型应用场景 介绍一下Regex类的基本应用 这里重点进行 NET类的介绍 对于正则的运用 不做深入探讨 正则的应用最终都是进行模式的匹配
  • python分析b站_用 Python 抓取 bilibili 弹幕并分析!

    时隔一年 嵩哥带来他的新作 雨幕 他依旧认真创作 追求高品质 作品在发表之前已听了五百遍以上 如此高品质的音乐 大家如何评价呢 通过哔哩哔哩上的视频弹幕 感受一下 01 实现思路 首先 利用哔哩哔哩的弹幕接口 把数据保存到本地 接着 对数据
  • HTML中下拉框的简单介绍<Select><option>

    1 下拉框的使用 在很多地方能见到下拉框的使用 最常用的就是在填写地址的时候 用户自己选择地址 2 效果演示 3 代码演示 下拉框主要用到
  • 浅谈cuda5.0新功能——warpshuffle

    warpshuffle 的具体定义可以在cuda C programming guide中被找到 但是这一功能只能被sm30或者更高的显卡支持 具体原因涉及到了kepler和fermi之间的差别 kepler在一个时钟周期内可以执行32个线
  • mybatis---设置typeAliasesPackage支持**通配符匹配

    设置typeAliasesPackage支持 通配符匹配 mybatis的typeAliasesPackage属性的作用是 搜索指定包别名 配置了以后xml文件中的resultType和parameterType就不需要指定全类名com e
  • 快速成长的秘诀|如何实现自我认知升级?

    一 写在开始 精英人数的增长速度持续加快后 很多人开始焦虑 我也焦虑 深知要走出焦虑不容易 我想把走出焦虑快速成长的认知和方法写成文章分享给更多人 做成PPT给更多人面对面分享 快速成长总共三篇 分别是 完成自己的认知升级 自我成长的方法
  • Network Password Recovery工具查看windows凭据隐藏密码

    查看windows凭据密码 方法一 使用重装系统工具里面自带的修改密码工具来修改或者清除密码 方法二 查看windows凭据密码 这里居然看不了 需要用到 nirsoft 公司做的免费工具 Network Password Recovery
  • switch_to

    理论部分请参考 深入理解Linux 内核 第三章 1 switch to 宏 define switch to prev next last do last switch to prev task thread info prev task
  • C/C++ --- 全局变量初始化总结

    注意 本文所说的全局变量指的是 variables with static storage 措词来自 c 的语言标准文档 什么时候初始化 根据 C 标准 全局变量的初始化要在 main 函数执行前完成 常识无疑 但是这个说法有点含糊 mai
  • 就业管理系统【软件建模与分析UML课设】

    觉得好记得点赞 关注我哦 界面设计如何不重要 重在画图 概 述 1 1系统目标 建设集就业管理办公自动化 毕业生与用人单位信息管理 就业部门形象化宣传为一体的综合性管理系统 组建一个具备人才管理 人才交流等功能的综合性信息系统 使整个人才交
  • mysql MHA集群安装

    一 主机规划 IP Hostname Master Slave Manager Node Data Node 10 22 83 42 node1 Master Data Node 10 22 83 26 node2 Slave Data N

随机推荐

  • 如何使用Egret制作游戏?

    好的 下面是使用Egret制作游戏的详细教程 一 前期准备 1 安装Egret Wing开发环境 可以在官网下载 https www egret com products wing html 2 安装Egret Engine 可以在官网下载
  • BES2300Z USB mode 讲解

    hello 在BES的蓝牙中有一些芯片是支持USB mode 在使用的过程中 在BT mode 和 USB mode 中只能有一种模式存在 排版会有点乱 请谅解 下面来讲解下BES2300Z 在USB mode 下打开的方法 遇到的一些问题
  • robotframework安装与详解

    Robot Framework 以下简称rf 是一款python编写的功能自动化测试框架 具备良好的可扩展性 支持关键字驱动 可以同时测试多种类型的客户端或者接口 可以进行分布式测试执行 主要用于轮次很多的验收测试和验收测试驱动开发 ATD
  • Python requests ip代理爬虫报错 HTTPSConnectionPool(host=‘xxxxx‘, port=443) Max retries exceed

    本人系统 macOS10 15 6 Catalina 场景 使用Python requests 包 ip代理池爬取网站数据 出现报错 HTTPSConnectionPool host xxxxx port 443 Max retries e
  • JDBC实现

    JDBC编程步骤如下 1 Load the Driver 加载驱动 1 注冊驱动有三种方式 1 Class forName com mysql jdbc Driver 推荐这样的方式 不会对详细的驱动类产生依赖 2 DriverManage
  • 菜鸟学习篇--Vuecli4.0 Vant ui组件样式无效果

    新建了个vue项目 按需引入vant组件的时候 发现页面不出样式效果 解决办法是 第一步 在bable config js文件中加入 plugins import libraryName vant libraryDirectory es s
  • git需要掌握的基础知识

    Git的简介 Git 是一款免费的 开源的 分布式的版本控制系统 旨在快速高效地处理无论规模大小的任何软件工程 每一个 Git克隆 都是一个完整的文件库 含有全部历史记录和修订追踪能力 不依赖于网络连接或中心服务器 其最大特色就是 分支 及
  • 7 个隐藏的 Blender 技巧将改善您的工作流程

    谁不喜欢秘密技巧 因为 Blender 是一个全面的 多功能的工具 所以有很多隐藏的复活节彩蛋 隐藏在可见表面之下的时尚工具和功能 对于今天的文章中 让我们来找出了最好的秘诀Blender技巧以提高您的工作流程与效率 1 轻松选择集合中的所
  • Spring + MyBatis

    MyBatis ORM 对象 关系映射 完成对象数据到关系型数据映射的机制称为对象 关系映射 1 MyBatis是一个ORM框架 也是一个持久层框架 MyBatis封装了JDBC 将数据库中的表数据自动封装到对象中 这样就可以以面向对象的方
  • 快手小店怎么引流?快手怎么做店铺引流?

    短视频的内容丰富 更能吸引广大用户 因为它可以让用户得到视觉的享受等等 就像快手平台 以短视频迅速攻占用户的心 尤其是三四线城市的用户 非常喜欢在快手上分享自己的生活和见闻 现在就连淘宝也想借助快手平台为自己的店铺进行引流 快速实现产品的变
  • IDEA常用插件之注解插件

    文章目录 注解插件 JavaDoc插件 安装 修改配置 生成文档加入自己信息 Easy JavaDoc 安装插件 在线安装 离线安装 中文名自动转英文 加注释 默认快捷键 可通过IDEA快捷键设置修改 注解插件 JavaDoc插件 安装 修
  • 数据库SQL语句期末总复习

    文章目录 SQL的分类 DDL数据定义语言 数据库的定义与撤销 基本表的定义与维护 索引的建立与删除 DQL数据查询语言 单表查询 查询结果排序 分组查询 连接查询 嵌套查询 集合查询 DML数据操作语言 插入数据 更新数据 删除数据 视图
  • 创建HttpPost和HttpGet请求

    1 创建工具类 HttpClient import com alibaba fastjson JSON import org apache http HttpStatus import org apache http client conf
  • react 函数组件父组件调用子组件方法

    react 函数组件父组件调用子组件方法 父组件利用ref对子组件做标记 通过调用子组件方法更改子组件状态 也可以调用子组件方法 首先在父组件中 使用useRef创建一个ref import LogModal from logModal i
  • vue单选框选中_vue radio单选框,获取当前项(每一项)的value值操作

    前言 本文使用了lable关联选中 实际使用中如果不需要 直接将循环语句 v for 写在 input标签上就可以 1 使用v for循环的radio单选框 01 需要注意的是 这是使用的是 change 事件 而不是 click 点击事件
  • NSSCTF刷题

    web NSSCTF 2022 Spring Recruit babyphp
  • UEFI基本概念

    TianoCore UEFI EDK2 UEFI Unified Extensible Firmware Interface 用来取代BIOS TianoCore 一个社区 支持UEFI的开源实现 EDK2 一种UEFI的开发环境 UEFI
  • AI大模型有哪些?国内的

    今年相信大家都被ChatGPT刷过屏 因为它太好用了 问它一个问题 它就能回答 可以帮助我们写各种文字 甚至写代码 对于我们的工作有着很大的帮助 国内这半年对于AI这个行业也出现了很多的公司以及产品概念 各家大厂也在抓紧研发 和GPT一样的
  • 读写锁 share_mutex

    实现一个Windows下的共享锁 读写锁 一 作者 tyc611 cublog cn 2008 11 18 在Windows Vista Server 2008之前 Windows没有提供共享锁 通俗称为读写锁 只能靠自己实现 但从Wind
  • java基础面试题系列(71 - 80)

    20200714 by 1z 请你说明HashMap 和 HashTable的区别 1 是否同步 HashMap是非同步的 HashTable是同步的 2 继承体系 HashTable继承自Dictionary HashMap继承自Abst