面试系列之基础篇

2023-11-03

强引用 、软引用、 弱引用、虚引用?

一般面试官会这样问:你知道Java中对象的引用类型有哪几种吗?分别讲讲这几种之间的区别?

强引用:只要强引用还存在,垃圾收集器永远不会回收被引用的对象;

软引用:描述一些还有用但是并非必需的对象,将要发生内存溢出之前,会被列进回收范围之中进行第二次回收,如果在此次回收中还是没有足够的内存,就会抛出内存溢出异常(SoftReference);

弱引用:只能存活到下一次垃圾回收之前,当垃圾收集器回收时,无论当前内存是否足够,被弱引用关联的对象都会被回收掉;

虚引用:最弱的一个引用类型,完全不会影响其生存时间,可以理解为没有引用一样,但是又有点区别,区别在于,弱引用关联的对象在被收集器回收的时候能收到一个系统回收通知;

 

浅拷贝和深拷贝的区别?

浅拷贝:源对象和副本对象是同一个对象,源对象(副本对象)引用计数器+1,只是拷贝了源对象的引用;

深拷贝:源对象和副本对象是不同的两个对象,源对象引用计数不变,副本对象计数器为1,相当于重新开辟一块内存生成一个新的对象;

 

Java中的值传递和引用传递?

值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象;

引用传递,意味着传递的并不是实际的对象,而是对象的引用;

 

Java中覆盖和重载的理解?

覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小;

重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同;

那么构成重载的条件有哪些?

参数类型不同、参数个数不同、参数顺序不同;

函数的返回值不同可以构成重载吗?

不可以,Java中调用函数并不需要强制赋值,根据方法的返回值是无法来区分重载方法的;

 

HashMap和Hashtable的区别?

HashMap没有同步,是线程不安全的,Hashtable通过使用synchronized关键字来保证了线程安全;

HashMap允许null作为key,而Hashtable是不允许的;

 

List 和 Set 的区别?

List:可以允许重复的对象、可以插入多个null元素

  • 有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的 顺序
  • 常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适

Set:不允许重复对象、只允许一个 null 元素

  • 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序
  • Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器

 

HashSet 是如何保证不重复的?

在向hashSet中add()元素时,判断元素是否存在的依据,不仅仅是hash码值就能够确定的,同时还要结合equles方法:

  • 如果hash码值不相同,说明是一个新元素,存

  • 如果hash码值相同,且equles判断相等,说明元素已经存在,不存

  • 如果hash码值相同,且equles判断不相等,说明元素不存在,存

 

ArrayList、LinkedList和HashMap默认空间是多少?什么时候会扩容?如何扩容?

ArrayList:默认大小为10;新增元素时发现容量不够就会去扩容,扩容后的大小= 原始大小+原始大小/2 + 1;

LinkedList:双向链表,没有默认大小也没有扩容机制;

HashMap:默认空间大小为16,扩容因子为0.75;当当前大小和当前容量 的比例超过了扩容因子,就会扩容,也就是说不会等到空间全部用完就会扩容,扩容后大小为1倍即32,但是HashMap的扩容机制不是很友好,它是在存入数据之后进行判断是否需要扩容,如果下次不会再有元素被存入,就会进行一次无效的扩容;

 

HashMap的底层原理了解吗?

JDK1.8之前HashMap底层结构是数组+链表实现的,当hash碰撞严重的时候就会导致个别位置链表长度过长,从而影响性能;所以JDK1.8开始HashMap底层结构改为数组+链表+红黑树实现,这样也能避免多线程下HashMap死锁的问题;

多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环,那么Entry的next节点永远不为空,Hash就会陷入死循环获取Entry的场景,从而发生HashMap死锁;

 

ConcurrentHashMap和Hashtable的区别?

ConcurrentHashMap和Hashtable虽然都是线程安全的,但是有一些区别,Hashtable每次执行同步都是锁住整个数据结构,而ConcurrentHashMap将Hash表分成16个段(segment),每次执行同步所影响的都是当前数据所在的段,不会导致整个hash全部锁住,这种锁的细粒度更小,效率更高;

那么你知道ConcurrentHashMap底层具体是怎么实现的吗?

ConcurrentHashMap包含了两个静态内部类HashEntry和Segment,一个用来封装映射表的键值对,另一个用来充当锁的角色,Segment是一种可重入的锁,每个Segment守护一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须先获得对应的Segment锁;

 

HashMap的长度为什么是2的幂次方?

HashMap是通过将Key的hash值与length-1进行&运算来实现Key的定位的,而2的幂次方可以减少hash冲突(碰撞)的次数,提高hashmap查询效率,源码如下:

// 返回key的坐标,通过hash值以length-1做&运算
static int indexFor(int h, int length) {
       return h & (length-1);
   }

当length=2时的幂次方时,length-1转化的二进制必定为1111...(2的n次方实际就是1后面n个0,2的n次方-1  实际就是n个1)这种形式,在于hash值做&运算时效率会非常快,同时运算后的结果也是随机分布的,越随机分布hash冲突就越少;

当length!=2时的幂次方时,length-1和hash值做&运算,就会出现尾数永远为0的情况,这样就会造成很多其他值永远不会被entry占用,增加了hash冲突的概率,也造成空间的浪费;

 

IO和NIO的区别?

IO面向流,NIO面向缓冲

IO阻塞,NIO非阻塞

IO无选择器,NIO有选择器(多路复用器)

两种都是同步的,异步的IO为AIO

 

什么是队列、栈、链表?

队列:双向管道,一边进另一边出,所以支持FIFO先进先出原则

栈:单向管道,那边进那边出,所以不支持FIFO,跟队列相反,先进后出原则

链表:是一种线性表,由一系列结点组成,结点可以在运行时动态生成。每个节点包含一个存储数据元素的数据域和一个指向下个节点的指针,通过指针形成链表,所以节点是可以空间上不连续的;

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

面试系列之基础篇 的相关文章

  • 只有技术人才能看懂的幽默

    面试官 请写出一段体现你水平的代码 我 sudo rm rf 面试官 这体现了你哪方面能力 我 我大学田径队的 1 程序有问题时不要担心 如果所有东西都没问题 你就失业了 2 计算机系的男同学追班里一女同学 结果此女总是躲躲闪闪 男的看没戏
  • swagger3.0访问后台地址

    swagger3 0访问后台地址 最近在学SpringBoot 其中swagger部分 发现后台地址不能访问了 当时导入的坐标为 这个是Gradle坐标 和Maven差不多 compile group io springfox name s
  • 计算机视觉基础7

    语义分割 从像素 pixel level 水平上 理解识别图片的内容 根据语义信息分割 输入 图片 输出 同尺寸的分割标记 每个像素会被识别为一个类别 FCN全卷积网络 所有层都是卷积层 相对位置保持不变 解决降采样后的低分辨率问题 全卷积
  • input类型

    下面通过设置input元素的type属性来演示不同类型的文本框的用法 效果图 当输入不正确的邮箱号 点击提交时 如下图 当输入不正确的网址 点击提交时 如下图 当输入不正确的手机号 点击提交时 如下图 代码如下
  • 不同的人每天工作有什么不同

    Author Skatexg Time 2020 07 17 不同的人每天工作有什么不同 有的人在为完成任务付出劳动 有的人在为有意义的成果付出劳动 为完成任务而付出的劳动是无意义的 只有产生成果的劳动才是有意义的 公司花钱买的是劳动成果
  • UPF learing2:set_level_shifter

    set level shifter 设置level shifter strategy在实现的过程中 level shifter name domain domain name elements list exclude elements l
  • python:10个小孩围成一圈分糖果

    10个小孩围成一圈分糖果 老师顺次分给每个人的糖果数为12 2 8 22 16 4 10 6 14 20 然后按以下规则调整 所有小孩同时把自己的糖果分一半给右边的小孩 糖果数如果变为奇数的人 再向老师补要一块 那多少次调整后 大家的糖果数
  • JavaScript——插入排序、堆排序

    一 插入排序 插入排序是一种简单直观的排序算法 它比冒泡排序 选择排序都更有效率 基本思路 插入排序的工作原理是通过构建有序序列 对于未排序元素 在已排序序列中从后向前扫描 找到对应的位置并插入 插入排序将数组分成 已排序 和 未排序 两部
  • 华为OD机试--路灯覆盖问题

    一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间的距离是100m 每个路灯都有自己的照明半径 请计算第一个路灯和最后一个路灯之间 未照明区间的长度和 输入描述 第一行为一个数N 表示灯的个数 1 100000 第二行为N个空格分隔
  • 请问如何用nodejs通过post发送multipart/form-data类型的http请求?

    请问如何用nodejs通过post发送multipart form data类型的http请求 发布于 4 年前 作者 xuhaijinsky2008 24777 次浏览 请问如果用nodejs通过post发送multipart form
  • Selenium成长之路-11简单对象定位之XPATH方法

    XPath是一种在HTML文档中定位元素的语言 因为 HTML 可以看做 XML 的一种实现 所以 selenium 用 户可是使用这种强大语言在 web 应用中定位元素 XPath基于XML的树状结构 提供在数据结构树中找寻节点的能力 X
  • static的用法

    1 static修饰普通变量 static修饰全局变量 1 作用域 改变链接属性 只在本文件有效 即使extern外部声明也不行 其他文件可定义相同名字的变量 2 初始化 只能被初始化一次 如果是整型不初始化就会自动赋值为0 字符型初始化为
  • 【Spring】aop的底层原理

    欢迎来到 边境矢梦 的csdn博文 本文主要梳理 Spring 中的切面编程aop的底层原理和重点注意的地方 我是边境矢梦 一个正在为秋招和算法竞赛做准备的学生 喜欢的朋友可以关注一下 下次更新不迷路 Ps 月亮越亮说明知识点越重要 重要性
  • 群晖nas怎么上传整个文件夹_处理群晖NAS中的烦人@eaDir文件夹

    今天发现NAS文件夹里面有很多 eaDir文件夹 和Mac OS X里的 DS Store类似 很烦人 找了解决方法 0 0 ssh登录群晖 控制面板里面打开SSH 0 1 Windows或者Mac 用 ssh 用户名 NAS IP地址登录
  • 1.进程与线程

    Java多线程文章目录 目录 1 进程与线程 Java程序启动至少会有两个线程启动 2 创建Java线程三种方式 run 与start 区别 第一种 继承Thread类 第二种 实现Runnable接口 两种方式区别 练习项目 第三种 实现

随机推荐

  • 通俗理解条件概率、条件期望、条件方差

    写在前面 求 条件XX 时 对 条件 的理解可以是 把 XX条件 作为新的基本事件空间 总体看待 而忽略除这个条件以外的 类似于用摄像机照相时 一开始是整个画面 当得到 XX条件 的约束后 镜头聚焦 画面缩小至代表那个条件的小空间上 一 条
  • Python-爬虫(期末报告)

    爬取的是房价网的数据 然后进行展示 初学爬虫 和同组的小伙伴 其实一个组就俩人 一起写的 我写的爬取 只用了正则表达式拿到网页源码里我想要的数据 还有个AJAX请求直接抓取相应对象然后拿到其中有用的数据即可 注释没写完 另一个小伙伴拿我爬取
  • Fully Convolutional Adaptation Networks for Semantic Segmentation

    参考 论文解析之 Fully Convolutional Adaptation Networks for Semantic Segmentation 云 社区 腾讯云 论文网址 Fully Convolutional Adaptation
  • C语言二维数组作为函数参数

    设有整型二维数组a 3 4 如下 0 1 2 34 5 6 78 9 10 11 它的定义为 int a 3 4 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000 各下标变量的首地址及其值如图所示 前面介绍过
  • Android sdk 收集信息,采集SDK-Android 报错

    采集SDK Android 报错 small detect model 找不到 这是说明文档 https ai baidu com docs Face Android SDK top 文档里完全没提到这个文件 我想知道这个文件在哪下载 有什
  • QList中的removeAt()

    QList removeAt removeAt后其他元素的索引值会相应的减小 QList
  • 图像生成质量fid、inception score、KID计算

    FID 简介 fid是一个非常常用的评估图像生成质量的指标 图像生成的论文中经常会用到 fid是一种度量两个图片数据集相似度的方法 我们生成的图片与真实图片越相似越好 相似度高对应的是fid值小 安装 想进一步学的的伙伴可以从理论出发 然后
  • 封装自己的SDK

    我们在开发Spring项目时常常会引入各种xxx spring boot starter的依赖包 然后在配置文件中填入必要的信息 就可以使用依赖提供好的容器 这里是在鱼皮新项目直播中学习到的 特此记录一下 可在未来封装自己的SDK进行封装与
  • openswan安装部署

    Lclient gt Lserver Rserver lt Rclient 172 16 10 16 10 86 10 17 10 86 10 18 192 168 10 16 首先要保证 lclient ping通lserver和rser
  • mysql中的mvcc机制

    MVCC全称是 Multi Version ConCurrency Control 即多版本控制协议 MVCC的主要是靠在每行记录上增加隐藏列和使用undo log来实现的 隐藏列主要包括 改行数据创建的版本号 递增的 删除时间 指向und
  • sql手工注入练习拿flag

    sql手工注入练习拿flag 记录一下自己重新开始学习web安全之路 1 找注入点 url 搜索框 登录框 2 找交互点 用单引号判断是否存在交互点 发现回显不正常 说明url存在有交互点 3 判断类型 char类型 利用and 1 1 和
  • hdu 6127 Hard challenge

    Problem acm hdu edu cn showproblem php pid 6127 Meaning 平面上有 n 个不重合的点 任意三点不共线 任意两点所在直线不经原点 每个点有个 value 任意两个点连出的线段的 value
  • Java 输出数组中指定元素的下标

    输出数组指定元素的下标 public static void main String args 定义一个数组 int array new int 123 456 789 321 654 987 int index printArray ar
  • Chisel入门(三)------Chisel的基本语法2

    概述 继续介绍Chisel的基本语法 3 组件 3 1 Chisel中的组件是模块 Chisel中的每个模块都拓展了class 并包含了接口的io字段 接口是由封装为IO 的Bundle所定义的 Bundle包含的字段表示模块的输入输出端口
  • 用Python3实现文本转语音

    本文首次在公众号 零妖阁 上发表 为了方便阅读和分享 我们将在其他平台进行自动同步 由于不同平台的排版格式可能存在差异 为了避免影响阅读体验 建议如有排版问题 可前往公众号查看原文 感谢您的阅读和支持 利用文本朗读库pyttsx3实现文字转
  • Linux环境rpm yum与dnf详解

    目录 一 rpm工具 1 1 简介 1 2 参数介绍 1 3 常用情景命令 二 yum工具 2 1简介 2 2 常用命令 三 dnf工具 3 1简介 3 2常用命令 本篇文章主要从使用的角度来介绍Linux下rpm yum与dnf三种工具
  • 搭建docker+sonarqube并使用scanner、maven分析项目

    一 搭建docker sonarqube 步骤1 进入服务器 创建一个文件夹sonarqube ssh root ip mkdir sonarqube cd sonarqube 可以选用临时或者正式部署方案 临时部署方案 通用部署 dock
  • 厂房效果图制作

    关于厂房 工厂园区规划 及钢结构类项目效果图制作过程中所经常遇到的一些问题 在这里予以汇总整理 并对场景搭建的流程给予简述 三维场景创建 首先需要把CAD平面规划图纸 或是PDF电子版文档 或是手绘稿等弄清楚 场地占地多少亩 有多少厂房 办
  • 1.1 初识基准测试(Benchmark)

    基准测试 Benchmark 是Go语言中用于衡量代码性能的重要工具 通过编写基准测试函数 并使用testing B提供的方法来记录执行时间和其他指标 我们可以准确地评估代码的性能表现 在开发过程中 合理使用基准测试可以帮助我们优化代码 提
  • 面试系列之基础篇

    强引用 软引用 弱引用 虚引用 一般面试官会这样问 你知道Java中对象的引用类型有哪几种吗 分别讲讲这几种之间的区别 强引用 只要强引用还存在 垃圾收集器永远不会回收被引用的对象 软引用 描述一些还有用但是并非必需的对象 将要发生内存溢出