第二次面试总结 - 宏汉科技 - Java后端开发

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;)

博主首页,更多redis、java等优质好文以及各种保姆级教程等您挖掘!

 

目录

总结 (非详细)

面试内容(提问内容) - 带答案

1、字符串相关的函数

2、抽象类和接口的区别

3、Java有几种创建线程池的方式,分别是什么,有什么不同

4、什么是回调函数

5、什么是函数式接口,函数式接口与普通接口的区别

6、 什么是反射

7、Java中的集合

详细总结(注意事项)


总结 (非详细)

  • 面试结果:非常不好
  • 面试内容:Java基础八股
  • 原因:Java基础相关八股文太差

面试内容(提问内容) - 带答案

  1. 字符串相关的函数
  2. 抽象类和接口的区别
  3. Java有几种创建线程池的方式,分别是什么,有什么不同
  4. 什么是回调函数
  5. 什么是函数式接口,函数式接口与普通接口的区别
  6. 什么是反射
  7. Java中的集合

1、字符串相关的函数

  • 创建字符串

String str = "hello"     // 直接赋值创建字符串

String str = new String("Hello")   // 使用构造函数创建字符串对象

  • 获取字符串长度

int length = str.length()      // 获取字符串长度

  • 获取指定位置的字符

char ch = str.charAt(index)          // 获取指定位置的字符

  • 查找子字符串的位置

int index = str.indexOf("hello world")        // 查找子字符串的位置

  • 判断是否包含子字符串

boolean contains = str.contains("substring")         // 判断是否包含子字符串

  • 替换字符串中的内容

String replaced = str.replace("old", "new")           // 替换字符串中的内容

  • 截取子字符串

Strin sub = str.substring(startIndex, endIndex)       // 截取子字符串

  • 字符串拼接

String concat = str.concat(" World")                      // 字符串拼接

  • 使用指定分隔符连接多个字符串

String joined = String.join("-", "Hello", "World")           // 使用指定分隔符连接多个字符串

  • 根据指定分隔符拆分字符串为数组

String[] parts = str.split("delimiter")        // 根据指定分隔符拆分字符串为数组

  • 去除字符串首尾空白字符

String trimmed = str.trim()          // 去除字符串首尾空白字符

  • 字符串大小写转换

String upper = str.toUpperCase()       // 转换为大写

String lower = str.toLowerCase()        // 转换为小写

  • 判断字符串是否为空

boolean isEmpty = str.isEmpty()         // 判断字符串是否为空(更常用)

boolean isBlank = str.isBlank()           // 判断字符串是否为空(Java11 新增)

  • 将其他类型转换为字符串

基本上的万能方法:   String.valueOf(需要转换的变量名)  

以及 toString 方法,只不过什么.toString ,   .toString的前缀各有不同

int num = 10;
String str = String.valueOf(num);        // 将整数类型(int、long)转换为字符串
// 或者
String str = Integer.toString(num);      // 将整数类型(int、long)转换为字符串

double num = 10.5;
String str = String.valueOf(num);        // 将浮点数类型(float、double)转换为字符串
// 或者
String str = Double.toString(num);     // 将浮点数类型(float、double)转换为字符串

boolean flag = true;
String str = String.valueOf(flag);        // 将Boolean类型转换为字符串

char ch = 'A';
String str = String.valueOf(ch);          // 将字符类型转换为字符串

// 除基本数据类型外,其他类型可以使用对象的toString()方法

Object obj = new Object();
String str = obj.toString();                  // 将其他类型转换为字符串

  • 将字符串转换为其他类型

String str = "123";
int intValue = Integer.parseInt(str);        // 字符串转换为整数

String str = "1234567890";
long longValue = Long.parseLong(str);    // 字符串转换为长整数

字符串转换为浮点数

String str = "3.14";
float floatValue = Float.parseFloat(str);                      // 字符串转换为 float
double doubleValue = Double.parseDouble(str);       // 字符串转换为 double


String str = "true";
boolean boolValue = Boolean.parseBoolean(str);       // 字符串转换为布尔值
 

字符串转换为自定义对象

引入Jackson 或 FastJson依赖,使用这其中的内置函数,需要注意的是这个被转换的字符串本身就要是JSON格式的字符串,要和对象中的属性对应,具体操作此处不再展示,用时查询即可

2、抽象类和接口的区别

抽象类

特点:

  • 可以包含抽象方法和非抽象方法
  • 可以有成员变量
  • 可以有构造方法
  • 通过 “extends” 关键字被子类继承
  • 不能被实例化,只能作为其他类的父类,子类必须实现(覆盖)其抽象方法

用法:

  • 适合用于需要某些默认实现的情况
  • 用于定义类的层次结构,提供一些通用行为

接口:

特点:

  • 只能包含抽象方法(Java8+可以有默认方法和静态方法)
  • 不能有成员变量(Java8+可以有静态常量)
  • 不能有构造方法
  • 通过 “implements” 关键字被类发现
  • 可以多继承,一个类可以实现多个接口

用法:

  • 用于定义一组相关的方法,而不包含实现
  • 用于实现多继承,使类具有多种类型特征
  • 用于实现不同类之间的通用协议
  • 可以多继承,一个类可以实现多个接口

如何选择使用抽象类还是接口

如果你需要提供一些默认实现,或者需要在未来扩展更多的方法,可以使用抽象类

如果你需要定义一组方法的契约,而不关心具体实现,并且需要支持多继承特性,可以使用接口

有时候也可以将抽象类和接口结合使用,使用接口定义契约,使用抽象类提供默认实现

3、Java有几种创建线程池的方式,分别是什么,有什么不同

有好多种,甚至我感觉应该没有明确的数字来确定Java有几种创建线程池的方式,因为有些是JavaJDK提供的,有些是某些框架提供的

下面说一下我了解的常见的五种方式

3.1、“Executors” 工厂类(常用)  -  精简

“newFixedThreadPool(int    nThreads)” :创建一个固定大小的线程池,线程数量固定不变

代码举例:(private是权限修饰符,可更改)

private ExecutorService executorService = Executors.newFixedThreadPool(8);

“newCachedThreadPool()”:创建一个根据需要自动扩展的线程池,线程数量可以根据任务的多少来进行动态调整

“newSingleThreadExecutor()”:创建一个单线程的线程池,保证任务按顺序执行,这些方法返回“ExecutorService”接口的实例,可以用于提交任务、关闭线程池等操作

3.2、“ThreadPoolExecutor类”(常用)   -   细节

“ThreadPoolExecutor” 类提供了更灵活的线程池创建方式,可以自定义线程池的配置

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 线程空闲时间TimeUnit.MILLISECONDS, // 时间单位new LinkedBlockingQueue<Runnable>() // 任务队列
);

通过 “ThreadPoolExecutor” 类,可以灵活地配置核心线程数、最大线程数、线程空闲时间、任务队列等

3.3、Spring框架提供的线程池(光Spring创建线程的方式就有好几种,虽然都与TaskExecutor接口有关系)

Spring 框架提供了 TaskExecutor 接口来管理线程池,以及一些实现了这个接口的具体线程池实现,例如使用 “ThreadPoolTaskExecutor”进行线程池的管理和配置

示例代码如下:

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;// 创建 ThreadPoolTaskExecutor 对象
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();// 设置线程池属性
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);// 设置其他属性...// 初始化线程池
taskExecutor.initialize();// 提交任务给线程池执行
taskExecutor.execute(() -> {// 执行的任务逻辑
});

3.4、“ScheduledExecutorService” 接口

用于执行延迟任务或定期任务

“newScheduledThreadPool(int  corePoolSize)”:创建一个可调度的线程池,可以执行定时或延迟任务

3.5、ForkJoinPool

用于执行 Fork-Join 任务,通过拆分任务并行执行来提高性能

不同的线程池创建方式适用于不同的场景和需求,可以根据具体的应用情况选择合适的方式创建线程池

4、什么是回调函数

回调函数是一种常见的编程概念,它在事件驱动编程异步编程等场景下非常常见,指的是在特定条件满足或事件发生时执行的函数。在编程中,回调函数通常作为参数传递给其他函数,以便在需要时被调用执行

举个最简单的示例,在图形化界面编程和前端中,就经常用到回调函数,比如当用户点击按钮时,可以将处理点击事件的函数作为回调函数传递给按钮的事件监听器。当按钮被点击时,事件监听器会调用这个回调函数

又比如我之前写过一个mq的项目,里面我专门定义了一个函数式接口来存放回调函数,因为函数式接口与普通接口不同,其中只可以有一个抽象方法,虽然定义接口时不可以直接写方法体,但可以有参数,而且后续使用时可以用Lambda表达式等方式实现函数式接口。我当时直接把这个接口当作参数,new出来后直接大括号,在里面把回调函数实现了,然后把这整个当作参数传递了,还挺方便的

5、什么是函数式接口,函数式接口与普通接口的区别

函数式接口是Java中的一个特殊类型的接口,它仅包含一个抽象方法(除了默认方法、静态方法或来自 “Object” 类的 “public” 方法)。函数式接口可以被Lambda表达式实现(口语化,不需要记:当然,也可以后续new接口的时候,在小括号内加个大括号,大括号内放重写的方法)

函数式接口特点:

  • 单一抽象方法:函数式接口只包含一个抽象方法。他的特点是只能有一个抽象方法,但可以包含多个默认方法,静态方法或来自 “Object” 类的 “public” 方法
  • @FunctionalInterface注解:函数式接口通常都会使用 “FunctionalInterface” 注解标识。这个注解可以让编译器帮助检查这个接口是否符合函数式接口的定义
  • Lamabda表达式支持:函数式接口可以被Lambda表达式所实现。Lambda表达式提供了一种简洁的方式来创建函数式接口的实例

注:也可以通过其他方式实现

普通接口特点:

  • 多个抽象方法:普通接口可以包含多个抽象方法
  • 没有 @FunctionalInterface 注解:普通接口没有 @FunctionalInterface 注解的限制,它可以包含多个抽象方法,并且不要求只有一个抽象方法

函数式接口和普通接口在设计和使用上有明显的差异,函数式接口更注重于函数式编程,鼓励使用 Lambda 表达式和函数式思维。而普通接口则更通用,可以包含多个方法,用于更广泛的场景。其实相对于两者的格式,往往是两者的使用场景不同而造成我们关注的真正意义上的 “不同”

6、 什么是反射

        反射是Java语言的特征之一,它允许运行中Java程序对自身进行检查,或者说 “自审”,并能直接操作程序的内部属性和方法(当然,反射并不是Java独有的,许多编程语言都提供了反射功能)

通俗地讲,一提到反射,我们就可以想到镜子。镜子可以明明白白地照出我是谁,还可以照出别人是谁。反映到程序中,反射就是用来让开发者知道这个类中有什么成员,以及别的类中有什么成员

其实反射的经典用处之一在于通过反射实现某些本不可能实现的功能,我们知道private修饰的属性是只能在类和对象内部访问的,但是有些时候我们需要获得这个“私有的”方法或属性,但是又不想破坏这个属性的修饰权限和范围,那我们就可以使用反射动态地获取到这个类的信息,并能够进行访问甚至修改

其实,我们常见的Spring托管对象的操作和JUnit框架的某些操作等本质也是利用了反射

可以说,反射无处不在,只是我们真正敲出明面上就是反射的代码少

注:反射是面试经常考的,而且相关的知识有特别多,真正想细致地去了解反射以及反射的用法等需要专门去搜寻

7、Java中的集合

Java集合分三种,分别是 List、Set、Map,这三种集合适用于不同的场景

  • List:适用于有序,可重复的集合
  • Set:适用于不可重复集合
  • Map:适用于键值对的存储

注:通常List与Map最为常用

  • List 常见的实现类:ArrayList(列表)  、 LinkedList(链表)
  • Set 常见的实现类:HashSet、LinkedHashSet和TreeSet
  • Map 常见的实现类:HashMap 、 TreeMap 与 HashTable

上面的实现类大多都是线程不安全的,因此,Java也提供了对应的线程安全版本:

  • 比如 List 中的 Victor、CopyOnWriteArrayList等
  • Set本身就用的少,所以线程安全的Set实体类用的更少,我确实没太记得住,个人感觉记这个不如到时候查询性价比高(面试可以这样说,一般不会让面试官感觉你不会)
  • 比如Map中的HashTable,当然这个太古老了,用的很少,但是另一个 ConcurrentHashMap 用的非常多,ConcurrentHashMap 也是线程安全的,当然,也有其他实现方式,看具体使用情况选择合适的实现类就好

详细总结(注意事项)

关于第一个问题 “字符串相关的函数” ,当时回答了几个经典的,比如 valueOf 等,下意识地忽略了简单的length、 contains等,平常使用的时候下意识就写出来了,有的写代码过程中没有想起来也直接查询后就使用了,所以答得并不好

关于第二个问题 “抽象类和接口的区别”,这个答得还可以,但是面试的时候,确实有些平常都知道的东西没想起来(这个问题其实真的属于纯八股了)

关于第三个问题 “Java有几种创建线程池的方式,分别是什么,有什么不同”,这个答得就非常不好了,真的平常光知道用了

关于第四个问题和第五个问题 “什么是回调函数”, “什么是函数式接口,函数式接口与普通接口的区别” 确实当场没想起来

关于第六个问题 “什么是反射”,我当时回答了反射怎么用,什么时候用,为什么要用,也都回答的可以,但面试官说这不是他想听到的,他想听到的只是反射的定义,好吧~ 这个怪我自己,平时确实没注意这些八股,只知道用了

关于第七个问题 “Java中的集合”,只能说回答的勉强凑合,忘记List、Set、Map都是集合了

面试官如果问Spring的八股,我还能答得不错;如果问我项目,我能答得非常优秀,但他直接就不问我项目,开场我自我介绍,就主要说了我项目能力比较好,然后他来了句 “好,那我既然看你一直在讲你的项目,那今天咱不提问项目,提问点Java基础”,然后 我就挂了~

个人情绪等无关重要的在此就不总结了,最后提一句话,即便简历不怎么样,也能搞几次大厂面试的机会,所以面试更重要的说白了就是八股,其次算法和项目,项目反而是最不重要的

加油背八股!

🧸正是时间好,过年发的此篇文章,在此祝大家新的一年 万事顺遂

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

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

相关文章

多文件上传

HTML中实现多文件上传是通过用<input type"file">元素的multiple属性&#xff0c;以下简单描述多文件上传的步骤 HTML表单准备&#xff0c;使用<input type"file">元素&#xff0c;并为其添加multiple属性&#xff0c;以允许用户选择多个文件…

管理系统-基于javaweb的图书管理系统

基于javaweb的图书管理系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 本项目采用eclipse工具开发&#xff0c;jspservlet技术编写&#xff0c;样式采用了layui…

2022年全国职业院校技能大赛软件测试赛题卷②—自动化测试解析报告(含术语)

2022年全国职业院校技能大赛软件测试任务四 自动化测试 目录 第一题:按照以下步骤在PyCharm中进行自动化测试脚本编写,并执行脚本。

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件&#xff1a;ca-config.json ② 创建 CA 证书签名请求文件&#xff…

Golang 结构体

前言 在 Go 语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种自定义的数据类型&#xff0c;将多个不同类型的字段&#xff08;fields&#xff09;组合在一起 结构体通常用于模拟真实世界对象的属性和行为 定义结构体 可以使用 type 关键字和 struct 关键字来定…

C++笔记之cout高亮输出以及纯C++实现一个彩色时钟

C笔记之cout高亮输出以及纯C实现一个彩色时钟 code review! 文章目录 C笔记之cout高亮输出以及纯C实现一个彩色时钟一.cout高亮输出1.1.运行1.2.代码一1.3.代码二1.4.重置终端的文本格式到默认设置说明 二.纯C实现一个彩色时钟2.1.运行2.2.main.cc2.3.cout带颜色打印输出技巧…

[ffmpeg系列 03] 文件、流地址(视频)解码为YUV

一 代码 ffmpeg版本5.1.2&#xff0c;dll是&#xff1a;ffmpeg-5.1.2-full_build-shared。x64的。 文件、流地址对使用者来说是一样。 流地址(RTMP、HTTP-FLV、RTSP等)&#xff1a;信令完成后&#xff0c;才进行音视频传输。信令包括音视频格式、参数等协商。 接流的在实际…

基于实时Linux+FPGA实现NI CompactRIO系统详解

利用集成的软件工具链&#xff0c;结合信号调理I/O模块&#xff0c;轻松构建和部署实时应用程序。 什么是CompactRIO&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提…

e2studio开发LPS28DFW气压计(1)----轮询获取气压计数据

e2studio开发LPS28DFW气压计.1--轮询获取气压计数据 概述视频教学样品申请完整代码下载产品特性通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

Leetcode 3701 · Find Nearest Right Node in Binary Tree (遍历和BFS好题)

3701 Find Nearest Right Node in Binary TreePRE Algorithms This topic is a pre-release topic. If you encounter any problems, please contact us via “Problem Correction”, and we will upgrade your account to VIP as a thank you. Description Given a binary t…

XDOJ175.窗口模拟

标题 窗口模拟 类别 综合 时间限制 2S 内存限制 256Kb 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。 窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶…

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考&#xff1a;VMware NAT 模式&#xff0c;网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

【第10讲】微信机器人 · 智能聊天

系列文章目录 第1讲:软件下载和安装第2讲:发消息第3讲:发文件第4讲:关键词回复第5讲:自定义功能第6讲:定时群发第7讲:获取群信息第8讲:自动加好友第9讲:桌面版第10讲:

网络安全学习资源

好久没写博客了&#xff0c;记录一些宝藏学习资源&#xff0c;不定时更新 Regex Learn - Step by step, from zero to advanced. 这是一个我认为最好的正则表达式学习网站&#xff0c;很多正则表达式学习资料都只提供了一个概念&#xff0c;但是正则表达式需要大量的练习&#…

MBTI职业性格测试 28题(免费版)

MBTI职业性格测试概述 MBTI是现在国际上最为流行的测试工具&#xff0c;利用MBTI职业性格测试&#xff0c;可以清楚地找到自己的性格特点以及兴趣爱好&#xff0c;方便于对职业进行规划、以及改善人际关系。其主要应用心理学常识对个性做出判断&#xff0c;提炼出动力、信息收…

关于图像分割任务中按照比例将数据集随机划分成训练集和测试集

1. 前言 之前写了分类和检测任务划分数据集的脚本&#xff0c;三大任务实现了俩&#xff0c;基于强迫症&#xff0c;也实现一下图像分割的划分脚本 分类划分数据&#xff1a;关于图像分类任务中划分数据集&#xff0c;并且生成分类类别的josn字典文件 检测划分数据&#xff…

2024.1.6力扣每日一题——在链表中插入最大公约数

2024.1.6 题目来源我的题解方法一 模拟数学 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2807 我的题解 方法一 模拟数学 正常模拟插入&#xff0c;通过辗转相除法计算出两个节点值之间的最大公约数&#xff0c;然后将其作为新节点插入到两个节点之间 时间复杂度&…

ArkTS - 数据持久化

一、概述 应用数据持久化&#xff0c;是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象&#xff0c;存储介质上的数据形态可能是文本、数据库、二进制文件等。 持久&#xff08;Persistence&#xff09;&#xff0…