Java后端开发-面试总结(集结版)

第一个问题,在 Java 集合框架中,ArrayListLinkedList有什么区别?在实际应用场景中,应该如何选择使用它们?

ArrayList 基于数组,LinkedList 基于双向链表。

在查询方面 ArrayList 效率高,添加和删除频繁场景下 LinkedList 更具优势, ArrayList 需要连续内存空间,LinkedList 不需要。

为什么基于数组的 ArrayList 查询效率高,是因为可以通过索引直接定位元素,时间复杂度为 O (1);

而 LinkedList 查询需要从头或尾遍历链表,时间复杂度为 O (n)。

在添加和删除操作上,LinkedList 只需修改前后节点的指针,时间复杂度为 O (1),而 ArrayList 在中间位置添加或删除元素时,可能需要移动大量元素,时间复杂度为 O (n) 。

举一些实际业务场景例子,比如在报表数据展示,需要频繁查询数据,适合用 ArrayList;在实现一个消息队列,频繁进行消息的入队和出队(添加和删除操作),LinkedList 更合适。

第二个问题,谈谈你对 Java 内存模型(JMM)的理解,它在多线程编程中有什么作用?

 Java 内存模型(Java Memory Model,简称 JMM) 。并且对 JMM 的理解不够全面准确。JMM 不仅仅是保证变量操作对其他线程可见,它定义了线程和主内存之间的抽象关系,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步访问共享变量。它主要解决了多线程编程中的原子性、可见性和有序性问题。例如,通过 volatile 关键字修饰的变量,能保证其修改对其他线程的可见性,同时禁止指令重排序,体现了 JMM 在保证可见性和有序性方面的作用;而 synchronized 关键字则既保证了原子性,又保证了可见性。

第三个问题,在 Spring 框架中,依赖注入(DI)有哪些方式?它们各自的优缺点是什么?

常见的依赖注入方式是构造器注入、setter 方法注入和接口注入(不过接口注入在实际开发中较少使用) 。

构造器注入通过类的构造函数来传递依赖对象,优点是依赖关系在对象创建时就确定,对象创建后即处于可用状态,并且可以确保所有依赖都被初始化,缺点是如果依赖过多,构造函数参数列表会很长,可读性变差。

Setter 方法注入通过对象的 setter 方法来设置依赖,优点是灵活性高,可在对象创建后动态设置依赖,缺点是可能会出现依赖未初始化的情况。

接口注入需要实现特定接口来接受依赖,由于其侵入性较强,实际使用相对较少。

说一下集合,比如集合有哪些

在 Java 中,集合框架提供了一组用于存储和操作对象的类和接口,主要分为以下几类:

1. List(列表)

  • ArrayList:基于动态数组实现,允许元素重复且有序。它支持随机访问,查询效率高,时间复杂度为 O (1),因为可以通过索引直接定位元素。但在中间位置插入和删除元素时,可能需要移动大量元素,时间复杂度为 O (n)。例如:

import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("banana");System.out.println(list.get(0)); }
}

  • LinkedList:基于双向链表实现,同样允许元素重复且有序。它在插入和删除元素时效率高,只需修改前后节点的指针,时间复杂度为 O (1),但查询效率相对较低,需要从头或尾遍历链表,时间复杂度为 O (n)。例如:

import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("cherry");list.add("date");list.addFirst("apricot");System.out.println(list.removeLast()); }
}

  • Vector:与 ArrayList 类似,也是基于数组实现,但它是线程安全的。不过,由于线程安全机制带来的开销,性能相对 ArrayList 较低。现在在多线程环境下,更推荐使用CopyOnWriteArrayList 替代。例如:

import java.util.Vector;public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("grape");vector.add("kiwi");}
}

2. Set(集合)

  • HashSet:基于哈希表实现,不允许元素重复,元素无序。它通过计算元素的哈希码来确定元素在集合中的存储位置,因此添加、删除和查找操作的平均时间复杂度为 O (1)。例如:

import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("mango");set.add("orange");set.add("mango"); System.out.println(set.size()); }
}

  • TreeSet:基于红黑树实现,不允许元素重复,元素按自然顺序(或自定义顺序)排序。它的添加、删除和查找操作时间复杂度为 O (log n),适用于需要对元素进行排序的场景。例如:

import java.util.Set;
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {Set<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set); }
}

  • LinkedHashSet:继承自 HashSet,基于哈希表和链表实现,既具有 HashSet 的快速查找特性,又能保持元素插入顺序。例如:

import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetExample {public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.add("peach");set.add("plum");set.add("pear");System.out.println(set); }
}

3. Map(映射)

  • HashMap:基于哈希表实现,存储键值对(key - value),键不允许重复,值可以重复,键值对无序。它通过计算键的哈希码来确定存储位置,对于非哈希冲突情况下,查找、插入和删除操作的平均时间复杂度为 O (1)。例如:

import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("one", 1);map.put("two", 2);System.out.println(map.get("one")); }
}

  • TreeMap:基于红黑树实现,键值对按键的自然顺序(或自定义顺序)排序。它的添加、删除和查找操作时间复杂度为 O (log n),适用于需要按键排序的场景。例如:

import java.util.Map;
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {Map<Integer, String> map = new TreeMap<>();map.put(3, "apple");map.put(1, "banana");map.put(2, "cherry");System.out.println(map); }
}

  • LinkedHashMap:继承自 HashMap,基于哈希表和链表实现,能保持键值对的插入顺序或访问顺序。例如:

import java.util.LinkedHashMap;
import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>();map.put("one", 1);map.put("two", 2);map.get("one"); System.out.println(map); }
}

  • ConcurrentHashMap:线程安全的哈希表,允许多个线程同时读,部分线程写。它在 JDK 1.7 中采用分段锁机制,JDK 1.8 中采用 CAS(Compare - And - Swap)和 synchronized 关键字实现,提高了并发性能。例如:

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();map.put("one", 1);map.put("two", 2);System.out.println(map.get("one")); }
}

webfilter是springboot的吗

WebFilter 不是 Spring Boot 特有的。它是 Java Servlet 规范中的一部分,从 Servlet 3.0 开始引入 。

1. 在 Java Servlet 规范中的角色

WebFilter 用于对 Servlet 容器处理的请求和响应进行过滤操作。通过实现 WebFilter 接口,可以在请求到达 Servlet 之前或者在 Servlet 生成响应之后执行一些通用的逻辑,比如日志记录、权限检查、字符编码设置等。例如:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/example/*")
public class MyFilter implements WebFilter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 在请求到达Servlet之前执行的逻辑System.out.println("Before Servlet");chain.doFilter(request, response);// 在Servlet处理请求之后执行的逻辑System.out.println("After Servlet");}// 其他接口方法的默认实现@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

在上述代码中,@WebFilter("/example/*") 注解指定了该过滤器将应用于以 /example/ 开头的所有 URL 路径。doFilter 方法包含了过滤逻辑,FilterChain 的 doFilter 方法用于将请求传递给下一个过滤器或 Servlet 。

2. 在 Spring Boot 中的使用

Spring Boot 作为一个基于 Spring 框架的快速开发框架,很好地支持了 Servlet 规范中的 WebFilter 。在 Spring Boot 项目中,可以很方便地创建和注册自定义的过滤器。

  • 基于注解方式:和普通 Servlet 项目类似,通过 @WebFilter 注解定义过滤器,并使用 @ServletComponentScan 注解扫描包含 @WebFilter 等 Servlet 组件的包,从而使过滤器生效。例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan(basePackages = "com.example.demo.filter")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

  • 通过配置类注册:也可以通过创建一个配置类,使用 @Bean 方法注册 FilterRegistrationBean 来注册过滤器。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.servlet.Filter;@Configuration
public class FilterConfig implements WebMvcConfigurer {@Beanpublic Filter characterEncodingFilter() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF - 8");filter.setForceEncoding(true);return filter;}
}

在这个例子中,通过 @Bean 方法创建了一个 CharacterEncodingFilter 实例,并将其注册为一个过滤器,用于设置请求和响应的字符编码为 UTF - 8 。

所以,虽然 Spring Boot 对 WebFilter 有很好的支持,但 WebFilter 本身源自 Java Servlet 规范,并非 Spring Boot 所特有。

近日总结:

最近很忙......但是早上又赖床......

但是又不得不起。

昨晚上误入一个大三前端学妹面试,嗯......有个问题,是什么原因让你们不在自己小组的实验室面试,去到其他小组的实验室面试的,这个实验室每天晚上都有人用,你们不用提前看一下吗?

的亏那天晚上没有老师过来讲东西

还有你旁边那个不面试的男生在那里是起了个什么作用,我进去后,小声背东西,那个男生不行动起来和我说,你自己终止面试和我说,我以为我声音已经够小了,我还专门离你远远的坐着,人家面试官啥也没听到,结果你来一句你听到了,就这,还是肯定句,陈述句。

就是无论多大的声音,只要你听到了,就不准人家留在这里是吧,可你们也没问这是其他小组的实验室啊。

就鸠占鹊巢呗,然后人家来了还要赶人家走......

66666666666666666666666666666666666666666666666666666666

而且你面试的确还有很大的进步空间,老给自己挖坑是个什么事儿,没听懂人面试官说的话直接大声 “ 啊?”

人家面试官都否定你了,你还要末尾了小声的来句,“我觉得.....就应该......”

语速也是时快时慢,时大时小,急急躁躁的,就很抽象。

最后受不了了,我去楼道了......

好无语......

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

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

相关文章

nslookup、dig、traceroute、ping 这些工具在解析域名时是否查询 DNS 服务器 或 本地 hosts 文件 的详细对比

host配置解析 127.0.0.1 example.comdig 测试&#xff0c;查询 DNS 服务器 nslookup测试&#xff0c;查询 DNS 服务器 traceroute测试&#xff0c;先读取本地 hosts 文件&#xff0c;再查询 DNS 服务器 ping测试&#xff0c;先读取本地 hosts 文件&#xff0c;再查询 DNS 服务…

文件上传、读取与包含漏洞解析及防御实战

一、漏洞概述 文件上传、读取和包含漏洞是Web安全中常见的高危风险点&#xff0c;攻击者可通过此类漏洞执行恶意代码、窃取敏感数据或直接控制服务器。其核心成因在于开发者未对用户输入内容进行充分验证或过滤&#xff0c;导致攻击者能够绕过安全机制&#xff0c;上传或执行…

STM32 的编程方式总结

&#x1f9f1; 按照“是否可独立工作”来分&#xff1a; 库/方式是否可独立使用是否依赖其他库说明寄存器裸写✅ 是❌ 无完全自主控制&#xff0c;无库依赖标准库&#xff08;StdPeriph&#xff09;✅ 是❌ 只依赖 CMSIS自成体系&#xff08;F1专属&#xff09;&#xff0c;只…

Flutter命令行打包打不出ipa报错

Flutter打包ipa报错解决方案 在Flutter开发中&#xff0c;打包iOS应用时可能会遇到以下错误&#xff1a; error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…

SQL Server常见问题的分类解析(一)

以下是SQL Server常见问题的分类解析,涵盖安装配置、性能优化、备份恢复、高可用性等核心场景,结合微软官方文档和社区实践整理而成(编号对应搜索结果来源): 一、安装与配置问题 安装失败:.NET Framework缺失解决方案:手动安装所需版本.NET Framework,以管理员身份运行…

Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结

以下是 Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解&#xff0c;结合用户描述的关键点展开说明&#xff0c;并以表格总结&#xff1a; 1. Spring Security 核心原理 Spring Security 通过 Filter 链 实现安全控制&#xff0c;其核心流程如下&#xff1a…

Vue:路由切换表格塌陷

目录 一、 出现场景二、 解决方案 一、 出现场景 当路由切换时&#xff0c;表格操作栏会出现行错乱、塌陷的问题 二、 解决方案 在组件重新被激活的时候刷新表格 <el-table ref"table"></el-table>activated(){this.$nextTick(() > {this.$refs[t…

文件上传漏洞原理学习

什么是文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xff0c;服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全&#…

leetcode_数组 189. 轮转数组

189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输出: [5,6,7,1,2,3,4] 示例 2: 输入&#xff1a;nums [-1,-100,3,99], k 2输出&#xff1a;[3,99,-1,-100] 思…

天元证券|空仓一个月 这批新基金冲进去了!

多只一个月都按兵不动的次新基金&#xff0c;终于在4月7日冲进去了。 券商中国记者注意到&#xff0c;多只在3月初成立的新基金产品&#xff0c;在保持一个月净值零波动之后&#xff0c;终于在4月7日建仓了。多只新基金产品当日净值出现约1%至2%的波动幅度&#xff0c;参考4月7…

centos7系统搭建nagios监控

~监控节点安装 1. 系统准备 1.1 更新系统并安装依赖 sudo yum install -y httpd php php-cli gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel wget unzip sudo yum install -y epel-release # 安装 EPEL 仓库 sudo yum install -y automake autoconf lib…

3. git config

文章目录 基本概述配置级别基本用法设置配置项查看配置项删除配置项 常用配置项 基本概述 git config 的作用是&#xff1a;设置用户信息、编辑器、别名、仓库行为等。 配置级别 级别作用范围配置文件路径命令选项仓库级别&#xff08;Local&#xff09;当前仓库.git/config…

WHAT - React 组件的 props.children 属性

目录 一、什么是 children二、基本用法三、类型定义&#xff08;TypeScript&#xff09;四、一些高级用法1. 条件渲染 children2. 多个 children 插槽&#xff08;命名插槽&#xff09; 五、children 的优势总结 在 React 中&#xff0c;children 是一个非常重要且特殊的 内置属…

Spring Boot开发三板斧:高效构建企业级应用的核心技法

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

实战篇-梳理时钟树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 这是B站傅里叶的猫视频的笔记 一、建立工程 以Vivado的wave_gen为例子。为了引入异…

图灵逆向——题六-倚天剑

从第六题开始就要有个先看看请求头的习惯了[doge]。 别问博主为什么要你养成这个习惯&#xff0c;问就是博主被坑过。。。 headers里面有一个加密参数S&#xff0c;然后你就去逆向这个S对吧。 然后一看响应&#xff1a; 好家伙返回的还是个密文&#xff0c;所以要两次逆向咯。…

ubuntu自动更新--unattended-upgrades

ubuntu自动更新--unattended-upgrades 1 介绍2 发展历程3 配置与使用4 disable Auto update服务命令 参考 1 介绍 Unattended-Upgrades 是一个用于自动更新 Debian 及其衍生系统&#xff08;如 Ubuntu&#xff09;的工具。它的主要功能是自动检查、下载并安装系统更新&#xf…

从 Excel 到你的表格应用:条件格式功能的嵌入实践指南

一、引言 在日常工作中&#xff0c;面对海量数据时&#xff0c;如何快速识别关键信息、发现数据趋势或异常值&#xff0c;是每个数据分析师面临的挑战。Excel的条件格式功能通过自动化的视觉标记&#xff0c;帮助用户轻松应对这一难题。 本文将详细介绍条件格式的应用场景&am…

【HarmonyOS Next之旅】DevEco Studio使用指南(十一)

目录 1 -> 代码实时检查 2 -> 代码快速修复 3 -> C快速修复使用演示 3.1 -> 填充switch语句 3.2 -> 使用auto替换类型 3.3 -> 用&#xff1f;&#xff1a;三元操作符替换if-else 3.4 -> 从使用处生成构造函数 3.5 -> 将变量拆分为声明和赋值 1…

win10离线环境下配置wsl2和vscode远程开发环境

win10离线环境下配置wsl2和vscode远程开发环境 环境文件准备wsl文件准备vscode文件准备 内网环境部署wsl环境部署vscode环境部署 迁移后Ubuntu中的程序无法启动 环境 内网机&#xff1a;win10、wsl1 文件准备 wsl文件准备 在外网机上的wsl安装Ubuntu24.04&#xff0c;直接在…