Java面试(常考基础知识点)总结

1. 面向对象三大特性相关

1.1 三大特性
  • 封装:对抽象的事物抽象化成一个对象,并对其对象的属性私有化,同时提供一些能被外界访问属性的方法;
  • 继承:子类扩展新的数据域或功能,并复用父类的属性与功能,单继承,多实现;
  • 多态:通过继承(多个⼦类对同⼀⽅法的重写)、也可以通过接⼝(实现接⼝并覆盖接⼝);
1.2 Java与C++区别
  • c++支持多继承,并且有指针的概念,由程序员自己管理内存;
  • Java是单继承,可以用接口实现多继承,Java不提供指针来直接访问内存,程序内存更加安全,并且Java有JVM⾃动内存管理机制,不需要程序员⼿动释放⽆⽤内存。
1.3 多态实现原理

多态的底层实现是动态绑定,即在运行时才把方法调用与方法实现关联起来。

静态绑定与动态绑定:

  • 一种是在编译期确定,被称为静态分派,比如方法的重载;
  • 一种是在运行时确定,被称为动态分派,比如方法的覆盖(重写)和接口的实现。

多态的实现: 虚拟机栈中会存放当前方法调用的栈帧(局部变量表、操作栈、动态连接、返回地址)。多态的实现过程,就是方法调用动态分派的过程,如果子类覆盖了父类的方法,则在多态调用中,动态绑定过程会首先确定实际类型是子类,从而先搜索到子类中的方法。这个过程便是方法覆盖的本质。

1.4 static和final关键字
  • static:可以修饰属性、方法

    • 修饰属性: 类级别属性,所有对象共享一份,随着类的加载而加载(只加载一次),先于对象的创建;可以使用类名直接调用。
    • 修饰方法: 随着类的加载而加载;可以使用类名直接调用;静态方法中,只能调用静态的成员,不可用this;
  • final: 主要⽤在三个地⽅:变量、⽅法、类。

    • 修饰变量: 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引⽤类型的变量,则在对其初始化之后便不能再让其指向另⼀个对象。
    • 修饰方法: 把⽅法锁定,以防任何继承类修改它的含义(重写);类中所有的private⽅法都隐式地指定为final。
    • 修饰类: final修饰类时,表明这个类不能被继承。final类中的所有成员⽅法都会被隐式地指定为final⽅法。

注:想要让一个类不能被继承的两种方式:

  • 使用final关键字修饰;
  • 私有化构造器,但对内部类无效;
1.5 抽象类和接口

抽象类: 包含抽象方法的类,即使用abstract修饰的类;抽象类只能被继承,所以不能使用final修饰,抽象类不能被实例化;

接口: 接口是一个抽象类型,是抽象方法的集合,接口支持多继承,接口中定义的方法,默认是public abstract修饰的抽象方法;

相同点:

  1. 都不能被实例化;

  2. 都可以定义抽象方法,子类/实现类必须覆写这些抽象方法;

不同点:

抽象类接口
构造方法没有
普通方法可以包含只能是public abstract修饰抽象方法(Java8之后可以)
成员变量可以定义各种类型只能是public static final修饰的静态常量
继承单继承多继承

使用场景:

抽象类:既想约束子类具有共同的行为(但不在乎其如何实现),又想拥有缺省的方法,又能拥有实例变量;

接口:约束多个实现类具有统一的行为,但是不在乎每个实现类如何具体实现;实现类中各个功能之间可能没有任何联系;

1.6 反射原理以及使用场景

Java反射: 是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且都能够调用它的任意一个方法;

反射原理: 反射首先是能够获取到Java中的反射类的字节码,然后将字节码中的方法,变量,构造函数等映射成相应的Method、Filed、Constructor等类。

// 如何得到Class的实例?
YourClassName.class //本质是一份字节码

使用场景:

  1. 开发通用框架: 反射最重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过XML文件配置JavaBean、Filter等),为了保证框架的通用性,需要根据配置文件运行时动态加载不同的对象或类,调用不同的方法。
  2. 动态代理: 在切面编程(AOP)中,需要拦截特定的方法,通常,会选择动态代理方式。这时,就需要反射技术来实现了。
    JDK:spring默认动态代理,需要实现接口;
    CGLIB:通过asm框架序列化字节流,可配置,性能差;
  3. 自定义注解: 注解本身仅仅是起到标记作用,它需要利用反射机制,根据注解标记去调用注解解释器,执行行为。

2. 数据结构

图片
2.1 ArrayList
  • 底层基于数组实现,支持对元素进行快速随机访问,适合随机查找和遍历,不适合插入和删除(因为从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制和移动,代价比较高)。
  • 默认初始大小为10,当数组容量不够时,会触发扩容机制(扩大到当前的1.5倍),需要将原来数组的数据复制到新的数组中。
2.2 LinkedList:
  • 底层基于双向链表实现,适合数据的动态插入和删除;
  • 内部提供了List接口中没有定义的方法,用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。(JDK官方推荐使用基于linkedList的Deque进行堆栈操作)。

ArrayList与LinkedList区别:

都是线程不安全的,ArrayList适用于查找的场景,LinkedList适用于增加、删除多的场景。

怎么实现线程安全?
可以使用Collections.synchronizedList(List list)函数返回一个线程安全的ArrayList集合(比如:CopyOnWriteArrayList)。

2.3 List快速遍历和安全失败
  1. 遍历元素的3种方式(以删除元素为例)
// 1. 普通for循环遍历
for(int i=0; i < list.size(); i++) {   if(list.get(i) == 5)        list.remove(i);
}// 2. 迭代遍历
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {    Integer value = it.next();    if(value == 5) {        list.remove(value);    }
}// 3. foreach遍历
for(Integer i:list) {    if(i==3) list.remove(i);
}
  1. 遍历过程中的失败处理方式
  • fail—fast(快速失败): 当异常产生时,直接抛出异常,程序终止。fail-fast主要是体现在当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构(modCount)被改变的话,就会抛出异常ConcurrentModificationException,防止继续遍历。这就是所谓的快速失败机制。
  • fail—safe(安全失败): 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。由于在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException。java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

    缺点:基于拷贝内容的优点是避免了ConcurrentModificationException,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

2.4 HashMap

可以看这篇文章,基本涵盖所有常见面试考点

  • 底层数据结构:
    • JDK1.7 : 数组和链表 结合在⼀起使⽤,也就是链表散列。如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。扩容翻转时顺序不一致使用头插法会产生死循环,导致cpu100%
    • JDK1.8 :采用了数组+链表+红黑树;当链表⻓度⼤于阈值(默认为 8-泊松分布),数组的⻓度大于 64时,链表将转化为红⿊树,以减少搜索时间。(解决了tomcat臭名昭著的url参数dos攻击问题)
  • 扩容情况:默认的负载因子是0.75,如果数组中已经存储的元素个数大于数组长度的75%,将会引发扩容操作。
  • put操作流程
    在这里插入图片描述
  • 哈希函数:通过hash函数(优质因子31循环累加)先拿到key的hashcode,是一个32位的值,然后让hashcode的高16位和低16位进行异或操作。该函数也称为扰动函数,做到尽可能降低hash碰撞,通过尾插法进行插入。
  • 容量为什么始终都是2^N: 先做对数组的⻓度取模运算,得到的余数才能⽤来要存放的位置也就是对应的数组下标。这个数组下标的计算⽅法是“ (n - 1) & hash ”。(n代表数组⻓度)。方便数组的扩容和增删改时的取模。
2.5 ConcurrentHashMap

可以通过ConcurrentHashMapHashtable来实现线程安全;Hashtable 是原始API类,通过synchronize同步修饰,效率低下;ConcurrentHashMap通过分段锁实现,效率较比Hashtable要好。
ConcurrentHashMap的底层实现:

  • JDK1.7的ConcurrentHashMap 底层采⽤ 分段的数组+链表 实现;采用 分段锁(Sagment) 对整个桶数组进⾏了分割分段(Segment默认16个),每⼀把锁只锁容器其中⼀部分数据,多线程访问容器⾥不同数据段的数据,就不会存在锁竞争,提⾼并发访问率
  • JDK1.8的 ConcurrentHashMap采⽤的数据结构跟HashMap1.8的结构⼀样,数组+链表/红⿊树;摒弃了Segment的概念,⽽是直接⽤ Node 数组+链表+红⿊树的数据结构来实现,通过并发控制synchronizedCAS来操作保证线程的安全。
2.6 序列化和反序列化

序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。
序列化: 将java对象转化为字节序列的过程。
反序列化: 将字节序列转化为java对象的过程。
优点:

  1. 实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里)Redis的RDB
  2. 利用序列化实现远程通信,即在网络上传送对象的字节序列。Google的protoBuf。
    反序列化失败的场景: 序列化ID:serialVersionUID不一致的时候,导致反序列化失败。
2.7 String

String使用数组存储内容,数组使用final修饰,因此String定义的字符串的值也是不可变的。
StringBuffer对方法加了同步锁,线程安全,效率略低于StringBuilder。

3. Java异常体系

在这里插入图片描述

Throwable是Java语言中所有错误或异常的超类。下一层分为Error 和Exception。

3.1 Error

是指java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。

3.2 Exception

包含:RuntimeException、CheckedException。

  • 编程错误

    • 语法错误(也称编译错误)是在编译过程中出现的错误,由编译器检查发现语法错误。
    • 逻辑错误指程序的执行结果与预期不符,可以通过调试定位并发现错误的原因。
    • 运行错误是引起程序非正常终端的错误,需要通过异常处理的方式处理运行错误。
  • **RuntimeException:**运行时异常,程序应该从逻辑角度尽可能避免这类异常的发生。如NullPointerException、ClassCastException ;

  • **CheckedException:**受检异常,程序使用trycatch进行捕捉处理;如IOException、SQLException、NotFoundException;

4. 其他

4.1 构造方法
  • 可以被重载,只有当类中没有显性声明任何构造方法时,才会有默认构造方法。
  • 没有返回值,构造方法的作用是创建新对象。
4.2 初始化块
  • 静态初始化块的优先级最高,会最先执行,在非静态初始化块之前执行。
  • 静态初始化块会在类第一次被加载时最先执行,因此在main方法之前。
4.3 This
  • 代表当前对象的引用。当前对象指的是调用类中的属性或方法的对象。
  • 不可以在静态方法中使用。静态方法不依赖于类的具体对象的引用。
4.4 重写和重载的区别
  • 重载:指在同一个类中定义多个方法,这些方法名称相同,签名不同。
  • 重写:指在子类中的方法的名称和签名都和父类相同,使用override注解。
4.5 Object类方法**
  • toString默认是个指针,一般需要重写;
  • equals比较对象是否相同,默认和==功能一致;
  • hashCode散列码,equals则hashCode相同,所以重写equals必须重写hashCode;
  • finalize用于垃圾回收之前做的遗嘱,默认空,子类需重写;
  • clone深拷贝,类需实现cloneable的接口;
  • getClass反射获取对象元数据,包括类名、方法;
  • notify、wait用于线程通知和唤醒;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Shell编程] 零基础入门 Shell 编程:从概念到第一个脚本

目录 一、什么是 Shell&#xff1f;—— 连接用户与系统的 "桥梁" 二、常见的 Shell 类型 —— 不同系统的 "操作面板" 三、Shell 能做什么&#xff1f;—— 不止于 "输入命令" 1️⃣命令行操作&#xff1a;这是最基础的功能。通过ls&#x…

【数据结构】排序(sort) -- 插入排序

目录 一、插入排序 二、直接插入排序&#xff08;straight insertion sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 三、希尔排序&#xff08;Shell sort&#xff09; 1. 思路介绍 2. 代码实现 3. 特性总结 四、总结 一、插入排序 常见的排序算法有&…

水面垃圾清扫船cad【6张】三维图+设计说明书

海洋吸尘器结构设计 摘 要 近年来&#xff0c;随着经济的快速发展&#xff0c;海洋产业及海上活动的增加&#xff0c;导致海洋漂浮垃圾越来越多&#xff0c;对沿岸的居民和海洋的生物的生命安全造成了很大的威胁&#xff0c;严重破坏海洋生态平衡。针对海洋垃圾污染这一主要问…

03-List列表数据类型

1.特点&#xff1a; 原属是字符串类型 列表头尾增删块&#xff0c;中间慢&#xff0c;增删元素是常态 元素可重复 最多包含2^32-1个元素 索引通python列表2.常用命令 ------增------ 1.从列表头部压入数据LPUSH key value1 value22.从列表尾部压入数据RPUSH key value1 value23…

防火墙认证用户部署

文章目录1、配置vlan2、防火墙配置&#xff08;1&#xff09;配置安全区域&#xff08;2&#xff09;接口加入安全区域(3)fw配置DHCP(4)地址组&#xff08;5&#xff09;管理员(6)用户认证1、配置vlan vlan batch 10 20 [Huawei-GigabitEthernet0/0/2]port link-type access …

Vue.js之监听器

watch侦听器&#xff1a;作用:监视数据变化&#xff0c;执行一些 业务逻辑 或 异步操作。 语法:简单写法→简单类型数据&#xff0c;直接监视完整写法 → 添加额外配置项 (1)deep:true 对复杂类型深度监视(2)immediate:true 初始化立刻执行一次handler方法//1.简单写法 data: {…

25电赛e题杂乱环境稳定识别矩形框(附源码)

​ 识别并跟踪矩形目标 识别视频中符合矩形轮廓的目标区域&#xff0c;并标记中心点位置。 实现思路 **图像预处理&#xff1a;灰度 二值化**闭运算消除孔洞二值化处理查找并筛选矩形轮廓解算中心点目标筛选结果绘制 环境 使用 OpenCV 和 python&#xff1a; 图像预处理…

【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序

【前端安全】聊聊浏览器解析顺序和 HTML 闭合优先级 最近在研究 XSS 的时候&#xff0c;发现一个特别容易被忽略的问题 —— 浏览器到底是怎么解析 HTML 的&#xff1f;为什么有些 payload 成功了&#xff0c;有些却怎么试都不行&#xff1f;其实这跟标签的闭合优先级还有解析顺…

PHP-分支语句、while循环、for循环

分支语句 无论在何种编程语言中&#xff0c;流程控制都是很重要的内容。由于 PHP 的大部分语法都继承了C语言的特点&#xff0c; 因此在流程控制方面&#xff0c;PHP 有着和C语言类似的流程控制。 if else 语句是流程控制中根据条件判断执行的一种。该语句执行时先对条件进行判…

并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用

在并发编程中&#xff0c;除了CountDownLatch和Semaphore&#xff0c;CyclicBarrier和Phaser也是实现多线程协作的重要工具。它们在处理多阶段任务同步、动态调整参与线程等场景中展现出独特价值。本文作为并发工具类系列的第二篇&#xff0c;将深入解析CyclicBarrier和Phaser的…

机器人焊接节气装置

在摩托车制造过程中&#xff0c;精密部件的焊接质量直接影响整车的安全性和操控性能。以发动机缸体焊接为例&#xff0c;传统手工焊接容易出现焊缝不均匀的问题&#xff0c;而采用六轴弧焊机器人后&#xff0c;焊接精度能控制在0.1毫米以内。日本川崎重工的生产数据显示&#x…

使用yolo11训练食物浪费检测数据集VOC+YOLO格式6734张32类别步骤和流程

【数据集介绍】数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;6734标注数量(xml文件个数)&#xff1a;6734标注数量(txt文件个数)&#xff1…

掌握PowerPC架构与编程技巧:技术资料详解

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;PowerPC是一种高性能的RISC架构&#xff0c;最初由IBM、Motorola和Apple联合开发&#xff0c;被设计用于高端工作站和服务器&#xff0c;同时广泛应用于嵌入式系统、航空电子设备、游戏主机和超级计算机等领域。…

VR 企业展厅:开启数字化展示新时代

在当今数字化浪潮席卷各行各业的时代&#xff0c;企业的展示与宣传方式也在不断革新。VR&#xff08;虚拟现实&#xff09;技术的出现&#xff0c;为企业展厅带来了全新的变革&#xff0c;使其从传统的实体展示空间&#xff0c;转变为具有无限可能的数字化虚拟空间。一、VR 企业…

测试用例颗粒度全解析

引言&#xff1a;为什么颗粒度是测试团队的“隐形门槛”&#xff1f;在软件测试领域&#xff0c;测试用例颗粒度&#xff08;即测试用例的详细程度&#xff09;看似是一个基础问题&#xff0c;却常常成为团队协作的“隐形门槛”。某电商平台测试团队曾出现过这样的窘境&#xf…

分布式锁的基本原理和基于lua脚本的实现(Redisson)

为了确保分布式锁可用&#xff0c;我们要确保锁的实现同时满足以下四个条件&#xff1a;- 互斥性。在任意时刻&#xff0c;只有一个客户端能持有锁。- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁&#xff0c;也能保证后续其他客户端能加锁。- 解铃还须系…

智慧园区数字孪生全生命周期交付体系:从虚拟建模到全域智联的快速交付新常态

在数字经济与绿色低碳转型的双重驱动下&#xff0c;智慧园区建设正经历从“物理空间堆砌”到“数据智能驱动”的范式革命。数字孪生技术作为核心引擎&#xff0c;通过构建物理园区的虚拟镜像&#xff0c;实现虚实空间的毫秒级同步与智能协同&#xff0c;推动园区管理向全要素感…

电脑忘记开机密码怎么办?【图文详解】5种方法重置/更改/取消/设置开机密码?

一、问题背景谁都有马虎的时候&#xff0c;要是突然忘了电脑开机密码&#xff0c;就只能对着登录界面干着急&#xff0c;没法打开电脑处理工作、查看文件&#xff0c;太影响效率了。别慌&#xff0c;其实有不少简单实用的办法能解除或重置密码&#xff0c;下面就来一一介绍&…

Go语言select

select是什么select是Go语言层面提供的一种多路复用机制&#xff0c;用于检测当前goroutine连接的多个channel是否有数据准备完毕&#xff0c;可用于读或写。Go语言的select语句&#xff0c;是用来起一个goroutine监听多个Channel的读写事件&#xff0c;提高从多个Channel获取信…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-整体示例

一、注册、登录、密码找回二、VUE前台系统三、VUE后台系统