【八股文】Java基础篇
1. == 和 equals的区别是什么?
- == 判断两个变量或者实例是否都指向同一内存空间的值(不仅值相同,地址也要相同)
- equals是判断两个变量执行的内存空间的值是否相同(值相同,地址可以不同),所以一般class要做equals判断时,要重写equals方法。重写equals方法就要重写hashCode方法,例如下面这个例子,当str,name和str都相同时,才会相同
@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;NN nn = (NN) o;return val == nn.val && Objects.equals(name, nn.name) && Objects.equals(str, nn.str);}@Overridepublic int hashCode() {return Objects.hash(name, val, str);}
2.两个对象的hashCode()相同,则equals()也一定为true吗?
不一定,因为我们通过hash散列出来的值会产生冲突,也就是不同的值,散列出来相同的值。反之,如果equals为true,则两个对象的hashCode一定相同
3.final在Java中有什么作用?
final 是一个修饰符,可以用于类、方法或变量。当final修饰变量时,如果这个变量是基础类型,那么该变量不能被修改,如果是引用类型,那么该变量不能指向另外一个对象,但内部的状态可以修改;当final修饰类时(例如String类),这个类不能被继承;当final修饰方法时,该方法不能被子类重写。追问
- 3.1 final,finally和finalize有什么区别
- final:上面回答
- finally:一般与异常相关,用于try-catch-finally语句块中。不管有没有发生异常,在finally代码块中用于释放资源,因为finally块中的代码一定会被执行。
- finalize:
- finalize是Object方法,因此,所有类都隐式继承了这个方法
- 它是垃圾回收机制的一部分,当垃圾回收器决定回收一个对象之前,会调用该对象的finalize方法。
- 我们可以覆盖finalize方法来执行一些类似于释放系统资源操作,但Java 9开始该方法就不被推荐使用了,因为它的执行时间和确定性无法保证。
- 现在Java更推荐其他资源管理机制,如try-with-resources语句或显式的资源管理策略。
- 总结:final关注的是不变性,而finally关注的是确保代码执行,而finalize关注的是对象被销毁前的清理工作,但现在都使用try-with-resources语句。使用技巧如下:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class MultipleResourcesExample {public static void main(String[] args) {String filePath = "data.txt";String url = "jdbc:mysql://localhost:3306/mydb";String user = "root";String password = "password";try (BufferedReader reader = new BufferedReader(new FileReader(filePath));Connection conn = DriverManager.getConnection(url, user, password);Statement stmt = conn.createStatement()) {String line;while ((line = reader.readLine()) != null) {// 假设每行包含一条SQL命令stmt.execute(line);}} catch (IOException | SQLException e) {System.err.println("Error processing resources: " + e.getMessage());}}
}
4.面向对象的三大特性
- 封装(提高代码安全性低):将对象的属性和方法封装到一起,只暴露有限的接口供外部访问。这样防止外部程序随意修改对象的属性和调用其方法
- 继承(提高代码复用性):新类可以继承现有的类,允许资料复用父类的代码,同时还可以添加和覆盖一些行为。
- 多态(提高代码灵活性和可扩展性):多态是指同一个接口可以有多种不同的实现,或者一个类实例可以拥有多个类型。多态可以通过方法重载和重写来实现。
5.多态的实现原理
- 多态的实现原理是动态绑定,即在运行时才把方法调用和方法实现关联起来。
- 一种是编译时多态,被称为静态分派,比如方法的重载
- 一种是运行时多态,被称为动态分派,比如方法的重写和接口的实现
- 多态的实现:多态的实现过程,就是方法调用动态分派的过程,如果子类覆盖了父类的方法,则在多态调用中,动态绑定过程首先确定实际类型是子类,从而先搜索到子类中的方法。这个过程便是方法覆盖的本质。
6.静态变量和成员变量的区别
特性 | 成员变量 | 静态变量 |
---|---|---|
存储位置 | 存储在堆内存的对象实例中 | 存储在方法区(如元空间) |
生存周期 | 与对象的生命周期相同 | 与应用程序的生命周期相同 |
实例数量 | 每个对象实例有一份副本 | 所有对象实例共享同一份 |
访问方式 | 必须通过对象实例访问 | 可以通过类名直接访问,也可以通过对象实例访问 |
作用域 | 局限于单个对象实例 | 对所有对象实例可见 |
初始化 | 每次创建对象时初始化 | 类加载时初始化一次 |
7.是否可以从一个静态方法内部发出对非静态方法调用
不可以直接从静态方法内部调用非静态方法。这是因为静态方法属于类级别,而非静态方法属于对象实例级别。静态方法在没有创建类的任何实例下就可以被调用,而调用非静态方法则需要先创建类的实例。然而,我们可以在静态方法内部间接调用非静态方法,通过创建类的实例并使用该实例来调用非静态方法。静态方法内部也不能直接使用成员变量,也需要创建类的实例才行。
8.深拷贝和浅拷贝区别是什么
- 浅拷贝:创建一个新的对象,复制基本类型字段,引用类型字段仅复制引用,导致原始对象和拷贝对象共享相同的引用类型数据
- 深拷贝:递归地复制所有字段,包括引用类型字段所指向的对象,确保原始对象和拷贝对象完全独立。
- (追问)深拷贝有哪些实现方式
- 序列化:将对象转换为字节流,然后再从字节流中重构出一个新对象。这种方式适用于实现了Serializable接口的引用类型字段也需要支持深拷贝
- 克隆:利用Cloneable接口和clone()方法实现对象的拷贝。需要注意的是,clone()方法必须在子类中重写,并且引用类型字段也需要支持深拷贝
- 手动实现,在类中手动编写代码,递归地复制所有引用类型字段所指向的对象。
9.HashMap相关考点
HashMap相关考点
10.Java中的初始化
先初始化静态代码块和静态变量,因为静态代码块和静态变量是在该类被第一次调用时就初始化了,以后不在初始化,而成员变量和构造方法这些只有对象被实例化过后才被初始化。如果有父类则执行顺序是这样的父类静态变量和静态代码块-》子类静态变量和非静态代码块-》父类非静态变量和静态代码块-》父类构造器-》子类非静态变量非静态代码块-》子类构造器
11.String、StringBuilder、StringBuffer的区别
特性 | String | StringBuilder | StringBuffer |
---|---|---|---|
可变性 | 不可变 | 可变 | 可变 |
线程安全性 | 内置线程安全(由于不可变性) | 非线程安全 | 线程安全 |
性能 | 修改操作效率低(每次修改创建新对象) | 修改效率高(无需创建新对象) | 修改效率较高(因为加了锁) |
内部存储 | 私有且最终的字符数组 | 可修改的字符数组 | 同StringBuilder |
典型使用场景 | 常量字符串或不需要修改的字符串 | 单线程下频繁修改的字符串构建 | 多线程下频繁修改的字符串构建 |
12.什么是反射
- 反射允许运行时检查和修改程序的行为。通过反射,程序可以在运行时获取类、接口、方法和字段的信息,并可以动态地创建和操作对象。
- 反射功能(优点)
- 获取到类信息(类中所有方法,类名,包名等等)
- 可以通过反射实例化对象
- 可以调用对象的任意方法,包括私有的
- 可以读取和修改对象的任意字段
- 能够获取和调用类的构造器。
- 反射的缺点
- 性能开销大:反射操作通常比直接Java代码慢得多,因为涉及到类信息的查询和解析方法调用
- 安全性低:反射可以访问和修改私有成员,可能破坏类的封装性。
- 代码可读性低:使用反射的代码比较难以阅读和调试。
- 反射的场景
- 动态加载和实例化类:插件架构中
- 动态配置和调用方法:在配置驱动的框架中
- 自动化测试:模拟对象和调用私有方法
- 实现框架和库:序列化、注解和AOP等。
13.重载和重写的区别
- 重写是在父类和子类直接实现的,而重载是在同一个类中实现的
- 重写的形参和返回值要一样,而重载可以不一样
- 都是多态的特性
- 重载发生在编译时,由编译器根据传递给方法的参数类型和数量来决定调用哪个方法,而重写发生在运行时,当调用方法时,JVM会检查对象的实际类型,并调用相应的重写方法,这就是动态绑定。
(追问)为什么不能根据不同返回值类型来区别重载- 编译时解析:Java编译器在编译阶段就需要确定调用哪个方法。如果允许根据返回类型来区分重载,那么编译器就无法在编译时确定正确的方法,因为此时可能还不知道实际的返回类型,这会导致编译失败。
- 类型系统:Java是一种静态类型语言,这意味着在编译时就需要确定所有类型信息。如果方法的调用依赖于运行时的返回类型来决定调用哪个方法,这将违背Java的静态类型规则。
14.抽象类和接口的区别
特性 | 抽象类 | 接口 |
---|---|---|
实例化 | 不能直接实例化,但可以有非抽象的子类实例化 | 不能实例化,也没有子类的概念,类通过实现接口来使用它 |
抽象方法 | 可以有抽象方法(没有方法体),也可以有具体方法 | 默认所有方法都是抽象的,除非使用default或static修饰 |
多重继承 | 不支持 | 支持多重继承的思想,一个类实现多个接口 |
实例变量 | 可以有实例变量,用于保存状态 | 不能有实例变量,可以有静态常量 |
构造函数 | 可以有 | 没有,因此不能被实例化 |
访问修饰 | 方法和变量都可以有任意的访问修饰符 | 方法默认是public的,常量默认是public static final的 |
使用场景 | 用于提供共享行为和状态,以及强制子类实现特定方法 | 用于定义行为规范,多个不相关的类可以实现同一个接口 |
15.Error和Exception的区别
特性 | Error | Exception |
---|---|---|
类型 | 表示严重的系统级问题或程序无法处理的错误 | 表示程序可以尝试处理的问题或异常情况 |
处理 | 一般不应被捕获或处理,因为程序必须终止 | 应该被捕获并处理,以避免程序崩溃并提供恢复的可能性 |
实例 | StackOverflowError、OutOfMemoryError | NullPointerException、IOException |
继承体系 | Throwable | Throwable |
抛出异常 | 在资源耗尽或JVM遇到无法恢复的错误时抛出 | 在程序逻辑错误或运行时资源不可用时抛出 |
可捕获性 | 通常不可捕获 | 可以通过try-catch捕获 |
使用场景 | 用于标识系统错误,如JVM内部错误或资源耗尽 | 用于处理程序级别的异常,如空指针异常等 |
16.为什么Java中只有值传递
值传递模型增加了代码的安全性,因为方法不能意外地修改外部变量的状态。这对于维护多线程和并发程序尤其重要,因为它减少了共享状态的副作用。
17.ArrayList、Vector和LinkedList的区别
特性 | ArrayList | Vector | LinkedList |
---|---|---|---|
底层数据结构 | 基于动态数组 | 基于动态数组 | 基于双向链表 |
元素访问 | 使用索引访问 O(1) | 也是O(1) | O(n),需要变量链表指定位置 |
元素插入或删除 | 都是O(n),可能会移动元素 | 也只是O(n) | 都是O(1),因为是链起的 |
线程安全性 | 非线程安全 | 线程安全 | 非线程安全,但提供 addFirst和addLast等线程安全的栈和队列操作 |
扩容策略 | 当容量不足时,按照1.5倍扩容 | 同ArrayList | 无需扩容,动态创建 |
元素顺序 | 保持插入顺序,支持随机访问 | 同ArrayList | 保持插入顺序,但是不能随机访问 |
内存占用 | 基于数组,所以相对紧凑 | 同ArrayList | 每个元素需要额外的内存用于存储前后节点的饮用,pre和next |
常见使用场景 | 需要随机访问,插入和删除较少的场景 | 需要多线程环境中使用集合的场景 | 需要频繁插入和删除元素的场景 |
相关文章:

【八股文】Java基础篇
1. 和 equals的区别是什么? 判断两个变量或者实例是否都指向同一内存空间的值(不仅值相同,地址也要相同)equals是判断两个变量执行的内存空间的值是否相同(值相同,地址可以不同),所…...

python rsa如何安装
Python中的一些模块是用一个包管理器来发布的,RSA模块就是,所以首先需要安装setup tools工具。 1、下载文件:ez_setup.py 2、安装: sudo python ez_setup.py 3、下载RSA安装包:rsa-3.1.1-py2.7.egg 4、安装RSA&…...

P10289 [GESP样题 八级] 小杨的旅游
Description 给定一棵 n n n 个点的树,每条边权值均为 1 1 1,树上有 k k k 个关键点,关键点们在 0 0 0 的时间内相互可达, q q q 次询问,求 s → t s\to t s→t 的最短路。 Analysis 考虑暴力建图,…...

网络编程 ----------- 4、组播与广播
1、广播 broadcast 广播是指向同一个网络中所有的主机传输数据只有传输层协议为 UDP协议时,才支持广播 TCP是端对端,广播是一对多 ,所以无法符合其要求。 1)广播地址 广播地址的计算: 子网掩码…...

最短路径算法:Bellman-Ford算法
引言 在图论中,Bellman-Ford算法是一种用于计算单源最短路径的算法。与Dijkstra算法不同,Bellman-Ford算法可以处理带有负权边的图,并且可以检测图中是否存在负权环。本文将详细介绍Bellman-Ford算法的定义、步骤及其实现。 Bellman-Ford算…...

爬虫:xpath模块及昵图网实例
xpath模块 from lxml import etreestr1 """ <div><ul><li class"item-0"><a href"link1.html">first item</a></li><li class"item-1"><a href"link2.html">second…...

高级java每日一道面试题-2024年8月03日-web篇-forward和redirect有什么区别?
如果有遗漏,评论区告诉我进行补充 面试官: forward和redirect有什么区别? 我回答: 在Java Web开发中,forward和redirect是Servlet容器提供的两种用于页面跳转的技术。它们的主要区别在于客户端感知的方式、URL地址的变化、请求对象的共享等方面。下面详细介绍两…...

如何让你的网站拥有更好的体验
在HTML中,属性是用于提供关于HTML元素的额外信息。接下来我们将讲解13个可以让用户拥有更好体验的HTML属性。 Accept 属性 我们可以在<input>元素(仅适用于文件类型)中使用accept属性来指定服务器可以接受的文件类型。 <input ty…...

opencascade AIS_TypeFilter AIS_XRTrackedDevice源码学习
opencascade AIS_TypeFilter 前言 通过它们的类型选择交互对象。该过滤器会对本地上下文中的每个交互对象提出问题, 以确定它是否具有非空的所有者,并且如果是,则检查它是否是所需类型。 如果对象在每种情况下都返回 true,则保留…...

使用Spring AOP监控指定方法执行时间
文章目录 一、加入pom依赖二、切面类和注解三、执行方法 一、加入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>二、切面类和注解 import java.lang.…...

最新CSS3纵向菜单的实现
纵向菜单 通过下面例子,你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击,真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…...

GooLeNet模型搭建
一、model import torch from torch import nn from torchsummary import summaryclass Inception(nn.Module):def __init__(self, in_channels, c1, c2 , c3 , c4):super(Inception, self).__init__()self.ReLU nn.ReLU()#路线1:1x1卷积self.p1_1 nn.Conv2d(in_channels i…...

使用ThreadLocal来存取单线程内的数据
一.什么是ThreadLocal? ThreadLocal,即线程本地变量。如果你创建了一个 ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是在操作自己本地内存里面的变量&…...

elasticsearch教程
1. 单点部署(rpm): #提前关闭firewalld,否则无法组建集群 #1. 下载ES rpm包 ]# https://www.elastic.co/cn/downloads #2. 安装es ]# rpm -ivh elasticsearch-7.17.5-x86_64.rpm #3. 调整内核参数(太低的话es会启动报错) echo "vm.max_map_count655360 fs.file-max 655…...

Arrays、Lambda表达式、Collection集合
1. Arrays 1.1 操作数组的工具类 方法名说明public static String toString(数组)把数组拼接成一个字符串public static int binarySearch(数组,查找的元素)二分查找法查找元素public static int[] copyOf(原数组,新数组长度)拷贝数组public static int[] copyOfRange(原数组…...

2024年前端趋势:全栈或许是不容错过的选择!
近年来,前端开发的技术不断推陈出新,2024年也不例外。在这个变化迅速的领域,全栈开发逐渐成为一股不容忽视的趋势。无论你是经验丰富的开发者,还是刚刚入门的新手,掌握全栈技术都能让你在竞争中脱颖而出。而在这个过程…...

MySQL 实战 45 讲(01-05)
本文为笔者学习林晓斌老师《MySQL 实战 45 讲》课程的学习笔记,并进行了一定的知识扩充。 sql 查询语句的执行流程 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器和执行器。 连接器负责接收客…...

仓颉编程语言入门 -- Array数组详解
仓颉编程语言入门 – Array数组详解 一. 如何创建Array数组 我们可以使用 Array 类型来构造单一元素类型,有序序列的数据。 1.仓颉使用 Array 来表示 Array 类型。T 表示 Array 的元素类型,T 可以是任意类型 , 类似于泛型的概念 var arr:Array<St…...

C#初级——简单单例模式使用
单例模式 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例,通过单例模式防止私有成员被多次引用,防止数据被随意纂改。本文使用的是线程不安全的懒汉式单例。 创建单例模式 首…...

2024.07.29 校招 实习 内推 面经
地/球🌍 : neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招 | 美/团// 快驴、小象、优/选/事/业/部2024年校/园/招聘(内推) 校招 | 美团快驴、小象、优选事业部2024年校园招聘(内推ÿ…...

速盾:爬虫攻击和cc攻击的区别是什么?
爬虫攻击和CC(Distributed Denial of Service)攻击是网络安全领域两种不同类型的攻击方式。尽管它们都涉及对目标网站或服务器的非法访问,但它们的目的、方法和影响各不相同。在接下来的文章中,我们将详细介绍这两种攻击方式的区别…...

Tomcat与Nginx的区别详解
目录 引言Tomcat概述 Tomcat的历史Tomcat的架构Tomcat的功能Nginx概述 Nginx的历史Nginx的架构Nginx的功能Tomcat与Nginx的区别 架构上的区别...

【大模型从入门到精通5】openAI API高级内容审核-1
这里写目录标题 高级内容审核利用 OpenAI 内容审核 API 的高级内容审核技术整合与实施使用自定义规则增强审核综合示例防止提示注入的策略使用分隔符隔离命令理解分隔符使用分隔符实现命令隔离 高级内容审核 利用 OpenAI 内容审核 API 的高级内容审核技术 OpenAI 内容审核 AP…...

JVM系列 | 对象的消亡3——垃圾收集器的对比与实现细节
垃圾收集器 文章目录 各收集器简单对比收集器启动参数各收集器详细说明JDK 1.3 之前JDK 1.3 | SerialJDK 1.4 | ParNewJDK 1.4 | Parallel ScavengeJDK 5 | CMS 收集器JDK 7 | G1 各收集器简单对比 收集器名称出现时间淘汰时间目标采用技术线程数STW分代备注无名JDK 1.3之前JD…...

C# Unity 面向对象补全计划 七大原则 之 开闭原则(OCP) 难度:☆ 总结:已经写好的就别动它了,多用继承
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺 1.开闭原则(OC…...

微信防封指南请收好
一、新号与老号的添加限制 建议新注册的微信号主动添加好友的数量不宜过多,推荐每日添加不超过5个好友;对于老号,建议每日添加不超过20个好友。保持适度的添加速度,避免被系统判定为异常操作。 二、避免使用营销性词汇 在发送消…...

选择排序算法改进思路和算法实现
选择排序 在未排序的数组中,用第一个数去和后面的数比较,找出最小的数,和第一个数交换。第一个数已为已排序的数。 相当于0~7 从0~7中找到最小的数放在0 从1~7中找到最小的数放在1 从2~7中找到最小的数放在2 ...以此类推 从6~7中找到最…...

【文件解析漏洞复现】
一.IIS解析漏洞复现 1.IIS6.X 方式一:目录解析 搭建IIS环境 在网站下建立文件夹的名字为.asp/.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 访问成功被解析 方式一:目录解析 在IIS 6处理文件解…...

【STL】 vector的底层实现
1.vector的模拟代码完整实现(后面会拆分开一个一个细讲) #pragma once #include<assert.h>// 抓重点namespace bit {/*template<class T>class vector{public:typedef T* iterator;private:T* _a;size_t _size;size_t _capacity;};*/templa…...

责任链模式:解耦职责,优化请求处理
在软件设计中,如何有效地处理复杂的请求是一个重要的课题。 责任链模式(Chain of Responsibility Pattern)提供了一种解耦请求发送者和接收者的方法,使得多个对象都有机会处理请求,从而达到灵活和可扩展的设计。 什么…...