03-Java面试题八股文-----java基础——10题

41、HashMap 的长度为什么是 2 的 N 次方呢?

  1. 为了能让 HashMap 存数据和取数据的效率高,尽可能地减少 hash 值的碰撞,也就是说尽量把数据能均匀的分配,每个链表或者红黑树长度尽量相等
    • 我们首先可能会想到 % 取模的操作来实现。
    • 下面是回答的重点哟:
取余(%)操作中如果除数是 2 的幂次,则等价于 与其除数减一的与(&)操作(也就是说
hash % length == hash &(length - 1) 的前提是 length 是 2 的 n 次方)。
并且,采用二进制位操作 &,相对于 % 能够提高运算效率。

这就是为什么 HashMap 的长度需要 2 的 N 次方了。

42、HashMap 与 ConcurrentHashMap 的异同

  1. 都是 key-value 形式的存储数据;
  2. HashMap 是线程不安全的,ConcurrentHashMap 是 JUC 下的线程安全的;
  3. HashMap 底层数据结构是数组 + 链表(JDK 1.8 之前)。JDK 1.8 之后是数组 + 链表 + 红黑树。当链表中元素个数达到 8 的时候,链表的查询速度不如红黑树快,链表会转为红黑树,红黑树查询速度快;
  4. HashMap 初始数组大小为 16(默认),当出现扩容的时候,以 0.75 * 数组大小的方式进行扩容;
  5. ConcurrentHashMap 在 JDK 1.8 之前是采用分段锁来现实的 Segment + HashEntry,Segment 数组大小默认是 16,2 的 n 次方;JDK 1.8 之后,采用 Node + CAS + Synchronized 来保证并发安全进行实现。

43、红黑树有哪几个特征?

紧接上个问题,面试官很有可能会问红黑树,下面把红黑树的几个特征列出来:

在这里插入图片描述

44、说说你平时是怎么处理 Java 异常的

  1. try-catch-finally
    • try 块负责监控可能出现异常的代码
    • catch 块负责捕获可能出现的异常,并进行处理
    • finally 块负责清理各种资源,不管是否出现异常都会执行
    • 其中 try 块是必须的,catch 和 finally 至少存在一个标准异常处理流程
      在这里插入图片描述
      抛出异常→捕获异常→捕获成功(当 catch 的异常类型与抛出的异常类型匹配时,捕获成功) →异常被处理,程序继续运行 抛出异常→捕获异常→捕获失败(当 catch 的异常类型与抛出异 常类型不匹配时,捕获失败)→异常未被处理,程序中断运行
  2. 在开发过程中会使用到自定义异常,在通常情况下,程序很少会自己抛出异常,因为异常的类名通常也包含了该异常的有用信息,所以在选择抛出异常的时候,应该选择合适的异常类,从而可以明确地描述该异常情况,所以这时候往往都是自定义异常。
  3. 自定义异常通常是通过继承 java.lang.Exception 类,如果想自定义 Runtime 异常的话,可以继承
    java.lang.RuntimeException 类,实现一个无参构造和一个带字符串参数的有参构造方法。
  4. 在业务代码里,可以针对性的使用自定义异常。比如说:该用户不具备某某权限、余额不足等。

45、说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

46、说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

47、String、StringBuffer 和 StringBuilder 的区别是什么?

  1. String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。
private final char value[];
  1. String 的 每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。

  2. StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从
    AbstractStringBuilder抽象类中我们可以看到

/**
 * The value is used for character storage.
 */
 char[] value;
  1. StringBuffer和StringBuilder它们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。
    • 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
    • StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

48、 String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

49、Java中是值传递还是引用传递?

  1. 在Java中,参数传递是按值传递(Pass-by-Value)进行的。
  2. 无论是基本数据类型还是对象类型,实际参数的值都会被复制一份传递给方法中的形式参数。对于基本数据类型,传递的是值本身;对于对象类型,传递的是对象的引用(地址)。
  3. 当将一个基本数据类型作为参数传递给方法时,方法中对形式参数的修改不会影响到原始值,因为基本数据类型的值存储在栈内存中,每次传递都是将值复制一份。
  4. 当将一个对象作为参数传递给方法时,方法中对形式参数的修改会影响到原始对象,因为传递的是对象的引用(地址),指向的是同一个对象。
  5. 虽然在对象类型中传递的是对象的引用,看起来类似引用传递,但实际上仍然是值传递。这是因为对于对象的引用,传递的是引用的副本,而不是引用本身。对形式参数的修改只会影响到引用副本所指向的对象,但不会改变原始引用的指向。
  6. 总结:Java中的参数传递是值传递的,无论是基本数据类型还是对象类型。这种值传递的方式使得方法中对参数的修改不会影响到原始值(对于基本数据类型)或原始对象的引用(对于对象类型)。

50、简述一下面向对象的六大原则?

  1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因。换句话说,一个类应该只有一个职责,这样可以使类更加聚焦,降低耦合性,并提高代码的可维护性

  2. 开放封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。意思是当需求发生变化时,应该通过扩展现有代码来适应新的需求,而不是修改已有的代码。这样可以保持代码的稳定性和可维护性

  3. 里氏替换原则(Liskov Substitution Principle,LSP):子类对象可以替换父类对象,而程序的行为不受影响。子类应该能够完全替代父类,并且在任何使用父类的地方都不会引起错误或异常

  4. 接口隔离原则(Interface Segregation Principle,ISP):应该为客户端提供尽可能小、精确的接口,而不应该提供大而全的接口。避免客户端依赖它们不需要的接口,这样可以降低耦合性,并提高系统的灵活性和可维护性

  5. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。这样可以降低模块之间的直接依赖关系,提高代码的可扩展性和可维护性

  6. 迪米特法则(Law of Demeter,LoD):一个对象应该尽量少地与其他对象发生相互作用。一个对象应该只与其直接的朋友进行通信,而不应该暴露太多的内部细节给外部。这样可以降低对象之间的耦合性,提高系统的可维护性和灵活性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479545.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6 修改主机名和HOSTS文件

后期我们会配置多台服务器,那么每台服务器我们都会给定一个主机名,方便后期通过主机名进行访问。主机名的修改我们可以在安装操作系统时对其修改,如果忘记了,就可以修改配置文件完成,像后期我们进行虚拟机克隆后&#…

Unity Toggle与Toggle Group的妙用

Toggle与Toggle Group结合使用,妙处多多。 因为在同一Toggle Group内只有一个Toggle可以被选中,那么对于我们要创建单选按钮组、游戏的一些开关、暗夜模式、筛选不同显示内容等功能都非常好用。 比如我要实现通过点击不同按钮,从而筛选显示不同内容&am…

基于springboot的“漫画之家”系统

目录 背景 技术简介 系统简介 界面浏览 背景 随着科技的不断进步,计算机已经变成了人们日常生活和工作不可或缺的工具。在这样的环境下,互联网技术被广泛运用于各个领域,以提升工作和生活的效率,推动了网络信息技术的迅猛发展…

物联网和工业物联网的区别——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网(IoT)和工业物联网(IIoT)作为现代科技的重要分支,正在逐渐渗透到我们的日常生活和工业生产中。它们的应用范围广泛,涵盖了从智能家居到自动化工厂的多个领域。…

基于SSM的土家风景文化管理平台(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的土家风景文化管理平台(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…

python_BeautifulSoup爬取汽车评论数据

爬取的网站: 完整代码在文章末尾 https://koubei.16888.com/57233/0-0-0-2 使用方法: from bs4 import BeautifulSoup 拿到html后使用find_all()拿到文本数据,下图可见,数据标签为: content_text soup.find_all…

微信群发技巧有哪几种?

群发是指通过微信平台对特定受众进行大规模信息发布的过程,如节日祝福、活动促销等。随着科技的不断发展,群发的定义已不再仅限于手机信息群发或短信群发。如今,微信内置的群发功能也被广泛应用。 一、微信群发的操作步骤 1. 进入微信&…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的疫情物资管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

Java项目:70 ssm小学生课外知识学习网站+vue

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员;首页、个人中心、医护人员管理、科室管理、病人管理、病房管理、病人信息管理、病历管理、医嘱管理、手术安排管理、药品信息管理、…

@MapperScan注解使用

要了解MapperScan注解得先去了解Mapper注解 1、Mapper注解: 作用:在接口类上添加了Mapper,在编译之后会生成相应的接口实现类 添加位置:接口类上面 如果想要每个接口都要变成实现类,那么需要在每个接口类上加上Mappe…

C++小白学力扣之977.有序数组的平方

题目介绍 思路分析 首先,我们拿到一个数组题,根据题目。我们就能确定我们要运用什么方法来解答它,一般有两种方法,第一种是大家都能想到的的,暴力求解法,本题,如果使用暴力法,就是将…

线性顺序表算法库

list.cpp 具体函数实现 #include <stdio.h> #include "list.h" #include <malloc.h>/************************************************** ①函数名: CreateList 功 能: 用数组构建顺序表 参 数: ①SqList *&L:传入的线性表 ②ElemType a[]:使用…

打造新质生产力,亚信科技2024年如何行稳致远?

引言&#xff1a;不冒进、不激进&#xff0c;稳扎稳打&#xff0c; 一个行业一个行业地深度拓展。 【全球云观察 &#xff5c; 科技热点关注】 基于以往“一巩固、三发展”的多年业务战略&#xff0c;亚信科技正在落实向非通信行业、标准产品、软硬一体产品和国际市场的“四…

CrossOver 23 用户可以免费升级到 CrossOver24吗?CrossOver用户如何升级呢?

也就是上个月&#xff08;2024年2月底&#xff09;左右&#xff0c;CrossOver 刚刚更新了 24 版本&#xff0c;CrossOver更新的内容有哪些&#xff0c;大家可以参考这篇文章&#xff1a;CrossOver24.0新功能介绍&#xff0c;这篇文章详细介绍了CrossOver24有哪些新特点&#xf…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

软考90-上午题-【操作系统】-死锁

一、同类资源分配不当引起死锁 系统中有m个资源&#xff0c;被n个进程共享&#xff0c;每个进程都要求k个资源。 当m < n*k时&#xff0c;即&#xff1a;资源数<进程所要求的总数时&#xff0c;可能会引起死锁。&#xff08;但是不一定&#xff01;&#xff09; 例如&…

Android - 深入浅出理解SeLinux

1. 概述 官方文档&#xff1a; https://source.android.com/docs/security/features/selinux https://source.android.com/docs/security/features/selinux/images/SELinux_Treble.pdf Your visual how-to guide for SELinux policy enforcement | Opensource.com SeLinux&…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…