Java基础篇八股(第一章节)

简介: 本简介涵盖Java核心基础要点:final修饰符的不可继承/重写/赋值特性;重载(同名异参)与重写(子类覆写父类同签名方法)的区别;==比较地址/值,equals比较内容;反射机制的动态获取与调用能力及性能权衡;String不可变性与StringBuffer/StringBuilder的线程安全/性能差异;主流集合类结构及线程安全实现(如ConcurrentHashMap);ArrayList与LinkedList数据结构与操作效率对比;HashMap JDK1.8+红黑树优化、put流程与2次幂扩容机制。(239字)
  1. Final 有什么用?
    被final修饰的类不可以被继承
    被final修饰的方法不可以被重写
    被final修饰的变量不可以被改变,
    被final修饰不可变的是变量的引用,而不是引用指向的内容, 引用指向的内容是可以改变的
  2. 什么是重载(Overload)和重写(Override) ?
    重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与 方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于 父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中 就不能重写。
  3. 重载的方法能否根据返回类型进行区分?
    方法重载不可以根据返回类型区分
  4. == 和 equals 的区别是什么
    == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数 据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
    equals() : 它的作用也是判断两个对象是否相等。
  5. 什么是反射机制?
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法 的功能称为java语言的反射机制。
  6. 反射机制优缺点
    优点: 运行期类型的判断,动态加载类,提高代码灵活度。
    缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要 慢很多
  7. 在你进行项目开发的过程中有没有用到过反射
    在我们的项目中经常会使用反射 + 自定义注解的方式去实现一些功能 , 例如 :
    在前后端交互的时候, 后端Long类型返回前端后会产生精度丢失 , 我们的处理方式就是在服务端, 通过配置修改Jackson的序列化规则, 将一些Long类型字段转化为字符串返回给前端, 这个时候我们自定义了一个@IdEncrpt注解 , 通过反射获取类的属性, 判断属性上是否添加了@IdEncrpt注解, 如果添加了 , 就会通过反射获取属性值, 转化为字符串
    在整合EMQ的时候 , 为了能够方便的接收订阅消息, 我们自定义了一个@Topic注解 , 作用在类上 , 之后我们通过反射获取类的字节码, 并且获取类上的@Topic注解, 读取到里面定义的主题 , 通过策略模式将不同主题的消息分发到不同的处理器中
    除了上述之外, 在我们项目开发中经常使用的一些框架, 例如 : Mybatis , Spring , SpringMVC 等, 以及一些常用的工具库 common-utils , hutool工具库等都大量使用到了反射机制
  8. String和StringBuffer、StringBuilder的区别是什么?
    可变性 : String类中使用字符数组保存字符串,所以string对象是不可变 的。
    StringBuilder与StringBuffer这两种对象都是可变的。
    线程安全性 : String中的对象是不可变的,也就可以理解为常量,线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同 步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
    性能 : 每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对 象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引 用。
    StirngBuilder 相比使用StringBuffer而言效率更高
  9. java常见的集合类有哪些
    Map接口和Collection接口是所有集合框架的父接口:
    Collection接口的子接口包括:Set接口和List接口
    Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等
    Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
    List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
  10. 常用的线程安全的类有哪些 ?
    ```1. Vector:就比Arraylist多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使 用。

    1. hashTable:就比hashMap多了个synchronized (线程安全),不建议使用。

    2. ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现
      ```

  11. ArrayList 和 LinkedList 的区别是什么?

  12. 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实 现。
  13. 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数 据存储方式,所以需要移动指针从前往后依次查找。
  14. 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
  15. 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储 了两个引用,一个指向前一个元素,一个指向后一个元素。
  16. 线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
  17. 说一下HashMap的实现原理?
    HashMap的数据结构: HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
    HashMap 基于 Hash 算法实现的
  18. 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数 组中的下标
  19. 存储时,如果出现hash值相同的key,此时有两种情况。
    a. 如果key相同,则覆盖原始值;
    b. 如果key不同(出现冲突),则将当前的key-value放入链表中
  20. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
    HashMap JDK1.8之前
    JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
    HashMap JDK1.8之后
    相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8) 时,将链表转化为红黑树,以减少搜索时间。扩容 resize( ) 时,红黑树拆分成的 树的结点数小于等于临界值6个,则退化成链表。
  21. HashMap的put方法的具体流程?
  22. 判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
  23. 根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向 ⑥,如果table[i]不为空,转向③;
  24. 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的 是hashCode以及equals;
  25. 判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值 对,否则转向5;
  26. 遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操 作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
  27. 插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩 容。
  28. 讲一讲HashMap的扩容机制
  29. 在jdk1.8中,resize方法是在hashmap中的键值对大于阀值(0.75)时或者初始化时,就调用resize方法进 行扩容;
  30. 每次扩展的时候,都是扩展2倍;
  31. 扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。
    在putVal()中,我们看到在这个函数里面使用到了2次resize()方法,resize()方法表示的在进行第一 次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值值(第一次为12) , 这个时候在扩 容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,在1.7 中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8版本中,则是根据 在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置 要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上
相关文章
|
1月前
|
开发框架 安全 .NET
【全网最详细】.NET Framework 3.5下载安装图文教程 | .NET3.5环境搭建使用指南
.NET Framework 3.5是2007年发布的经典版本,支持LINQ、WPF、WCF等关键技术,至今仍是许多老软件运行所必需。Windows 11中需通过“启用Windows功能”单独安装。该版本已终止支持,存在安全风险,建议新项目选用.NET 4.8或.NET 8。
|
2月前
|
人工智能 运维 API
OpenClaw阿里云+本地三系统部署与商业变现完整指南:大模型配置+避坑指南
OpenClaw(曾用名:Clawdbot)作为一款开源、本地优先、可长期稳定运行的AI智能体执行网关,凭借自动化任务处理、多模型兼容、技能扩展与24小时无人值守能力,成为个人低成本启动商业变现的首选工具。无需大额资金投入,无需组建团队,个人可通过技术服务、数字产品、自动化代运营、技能开发、内容付费、跨境接单、企业定制等多元路径,将AI能力转化为持续收益。
384 5
|
2月前
|
安全 PHP
PHP 技巧:5 个提升代码质量的实用写法
PHP 技巧:5 个提升代码质量的实用写法
259 144
|
1月前
|
人工智能 弹性计算 数据可视化
OpenClaw一键部署保姆级教程,新手小白也能轻松“养龙虾”!
OpenClaw(“龙虾”)是一款开源AI智能体,因红色小龙虾图标得名,部署过程被戏称“养龙虾”。本文提供阿里云一键部署保姆级教程:两步搞定——购买预装镜像服务器+可视化配置API密钥,新手零代码即可拥有专属AI助理!
280 11
|
1月前
|
云安全 存储 弹性计算
阿里云优惠券领取指南:个人、学生、企业全覆盖
本文详解2026年优惠券领取与使用指南:覆盖新老用户、学生(300元无门槛)、企业(最高1728元),含代金券/满减券/折扣券三类,支持通用及指定商品,附权益中心、活动页等官方入口及避坑要点。
280 7
|
1月前
|
人工智能 安全 API
Hermes Agent 部署踩坑无数?阿里云一站式落地教程,全程10分钟
继OpenClaw爆火后,Nous Research推出的Hermes Agent成为开源Agent新顶流:自进化闭环学习、跨会话持久记忆、支持Telegram/WhatsApp/钉钉等15+平台,开箱即用。
508 15
|
1月前
|
人工智能 自然语言处理 数据可视化
超详细!OpenClaw(小龙虾AI)一键部署实操教程
OpenClaw(小龙虾AI)是一款开源本地AI智能体,定位“数字员工”,不只聊天,更能听懂自然语言指令,自动完成文件整理、浏览器操作、邮件处理等真实任务,零代码一键部署,隐私安全、开箱即用。
1100 2
|
1月前
|
安全 前端开发 Java
【SpringSecurity新手村系列】(1)初识安全框架
本文从零开始引入 Spring Security,演示默认登录页与接口保护效果,并解释认证、授权与过滤器链的基础机制,帮助你快速建立安全开发的整体认知。
160 1
|
1月前
|
Java 数据库连接 数据库
【SpringSecurity新手村系列】(2)整合 MyBatis 实现数据库认证
本文讲解如何将 MySQL 与 MyBatis 接入 Spring Security,通过自定义 UserDetailsService 实现数据库认证,并说明 PasswordEncoder、Mapper/XML 与登录流程的关键实现点。
136 1
|
2月前
|
弹性计算
阿里云服务器ECS的「文件备份」是什么?超出100GB如何收费?
阿里云ECS「文件备份」是免配置、自动化的文件级数据保护服务,支持按需恢复误删文件,30天内可找回。每账号享100GiB免费额度,超量部分按0.037元/GiB/月计费,按日结算。
152 13

热门文章

最新文章