【2024秋招】2023-10-9 同花顺后端笔试题
1 Hashmap mp = new hashmap(50)的大小扩充了几次
初时应该就给了这么多空间,在不考虑添加元素,所以扩容为0次
2 算数表达式的中缀为a+b*c-d/e,后缀为abc*+de/-,前缀是?
3 50M电信带宽,计算下带宽理论最快下载速度是多少
带宽通常以"比特/秒"(如Mbps,即百万比特每秒)为单位表示,而文件或数据的大小通常以"字节"为单位表示(如MB,即兆字节)。要注意,1字节等于8比特。
假设你的50M电信带宽是50Mbps(50兆比特每秒)。
理论最快下载速度 = 带宽 / 8
= 50 Mbps / 8
= 6.25 MB/s
因此,理论上,你的下载速度最快可以达到6.25 MB/s。
4 你的服务器被攻击了,黑客把他的程序伪装成服务器上正常的工具程序,如何找到这些程序,请说出你的思路
当服务器受到攻击并且恶意程序伪装成正常的工具程序时,检测和清除这些威胁是一项挑战。以下是一些检测恶意程序的常用方法和思路:
-
日志审查:
- 检查系统和应用日志以寻找异常活动或未授权的访问记录。
-
文件完整性检查器:
- 使用如Tripwire或AIDE这样的工具来检查系统文件的完整性。这些工具可以检测到文件的任何未授权更改。
-
进程监视:
- 使用
ps
,top
, 或htop
等工具来查看正在运行的进程,寻找异常或未知的进程。 netstat
或ss
可以用来查看当前的网络连接,以确定是否有异常的外部连接。
- 使用
-
系统基线:
- 如果你有一个系统基线(一个已知的干净、正常的系统状态快照),可以将当前状态与此基线进行比较,找出差异。
-
Rootkit检测工具:
- 使用如Rkhunter或Chkrootkit这样的工具来检测是否有rootkits存在。
-
外部扫描:
- 使用外部系统对你的服务器进行扫描,以确定是否有任何已知的恶意活动或开放的漏洞。
-
定期更新和打补丁:
- 确保系统和所有应用程序都是最新的,以减少已知漏洞。
-
网络流量分析:
- 使用网络监控工具(如Wireshark)来捕获和分析流量,寻找异常模式或恶意活动。
-
文件系统审计:
- 定期检查最近修改或新创建的文件,特别是在关键目录中。
-
反病毒和反恶意软件扫描:
- 使用反病毒软件来扫描可能的恶意文件或程序。
- 沙盒技术:
- 在隔离的环境中执行可疑的程序或文件,以观察其行为。
最后,如果你认为服务器已经被感染或渗透,最安全的做法是从已知的干净备份中恢复,并对系统进行全面审计,以确定攻击的来源和范围,并修复任何潜在的安全漏洞。
5 写一个匹配url的正则表达式
匹配URL的正则表达式可以有很多种,根据所需匹配的URL的类型和复杂性。下面是一个常用的,能匹配大部分常见URL的正则表达式:
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$
解释:
^
: 开始。(https?:\/\/)?
: 可选的匹配 http:// 或 https://。([\da-z\.-]+)
: 匹配域名标签(如 “google” 在 “google.com”)。\.([a-z\.]{2,6})
: 匹配顶级域名(如 “.com”, “.org.cn”)。([\/\w \.-]*)*\/?
: 匹配路径、文件名和查询参数。$$
: 结束。
请注意,这个正则表达式能匹配大部分常见的URL,但对于某些特定情况或特殊的URL可能需要调整或完善。正则表达式可以根据具体需求进行修改或扩展。
6 说一下对象锁和类锁的区别
在Java的多线程编程中,对象锁和类锁是两种常见的同步机制。它们的区别主要如下:
-
锁的对象不同:
- 对象锁:是对一个实例对象进行加锁。这通常是通过
synchronized
关键字在实例方法上实现的,或者通过synchronized(this)
在代码块上实现。 - 类锁:是对一个类的所有对象实例进行加锁。这通常是通过
synchronized
关键字在静态方法上实现的,或者通过synchronized(ClassName.class)
在代码块上实现。
- 对象锁:是对一个实例对象进行加锁。这通常是通过
-
作用范围不同:
- 对象锁:只影响对该对象实例的访问。即,同一时刻,其他线程仍然可以访问该类的其他实例对象。
- 类锁:影响对该类的所有对象实例的访问。即,同一时刻,其他线程不能访问该类的任何实例。
-
使用场景不同:
- 对象锁:当需要控制对单个对象实例的访问时使用。
- 类锁:当需要控制对类的所有实例的访问或对静态资源的访问时使用。
-
实现方式不同:
- 对象锁:通常通过以下方式实现:
synchronized
修饰非静态方法。synchronized(this)
修饰代码块。
- 类锁:通常通过以下方式实现:
synchronized
修饰静态方法。synchronized(ClassName.class)
修饰代码块。
- 对象锁:通常通过以下方式实现:
-
存储位置:
- 对象锁:存在于对象的头部。
- 类锁:存在于类的Class对象的头部。
总的来说,对象锁和类锁是Java中的两种同步机制,但它们的作用范围和使用场景是不同的。选择哪种类型的锁应该基于实际的同步需求来决定。
7 用java实现输出1到999中所有不包含5的整数
以下是一个简单的Java程序,用于输出1到999之间所有不包含数字5的整数:
public class NoFiveNumbers {public static void main(String[] args) {for (int i = 1; i <= 999; i++) {if (!Integer.toString(i).contains("5")) {System.out.println(i);}}}
}
此程序将每个整数转换为字符串,并检查它是否包含数字5。如果不包含5,它就会输出该整数。
8 如何理解aop,是否有编写自定义注解的经验,文字描述一下实现过程
理解AOP
AOP(面向切面编程 - Aspect Oriented Programming)是一个编程范式,其目标是解决软件设计中的交叉关注点,即那些分布在多个模块中的功能(如日志、事务管理、安全性等)。AOP使得这些功能可以被模块化,并能在不修改核心逻辑的情况下被应用到代码的不同部分。
关于编写自定义注解:
Java中的注解是一种元数据形式,它们不直接影响代码的逻辑,但可以通过反射被读取,并为工具和库提供额外的信息。
实现一个使用自定义注解和AOP的例子:
- 定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {
}
这是一个简单的注解,可以应用于方法上,以记录方法的执行时间。
- 编写切面:
使用Spring AOP,我们可以定义一个切面,当调用带有 @LogExecutionTime
注解的方法时,记录其执行时间。
@Aspect
@Component
public class LogExecutionAspect {@Around("@annotation(LogExecutionTime)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object proceed = joinPoint.proceed();long executionTime = System.currentTimeMillis() - start;System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");return proceed;}
}
- 使用注解:
应用 @LogExecutionTime
注解于任何你想记录执行时间的方法上:
@Service
public class SomeService {@LogExecutionTimepublic void serve() throws InterruptedException {Thread.sleep(2000);}
}
- 配置AOP:
如果你使用的是Spring Boot,只需在pom.xml
文件中添加Spring AOP的依赖,并在应用主类上使用@EnableAspectJAutoProxy
注解。
总结:
通过结合自定义注解和AOP,你可以轻松地为应用添加跨多个模块的功能,而无需修改核心业务逻辑。这增强了代码的可维护性和可重用性。
9 spring bean如何保持线程安全,为什么
在Spring框架中,Bean的线程安全性主要取决于其作用域和你如何使用这些Bean。下面是关于Spring Bean线程安全性的几点考虑:
-
默认的Bean作用域 - 单例(Singleton):
- 当Bean的作用域为单例时,Spring容器在启动时只为该Bean创建一个实例,并为所有对该Bean的请求返回相同的实例。这意味着,如果Bean的状态在多线程环境中被多个线程共享,那么这个Bean是线程不安全的。
- 为了确保单例Bean的线程安全性,你应该避免在Bean中使用任何共享状态(例如,成员变量)或确保对共享状态的访问是线程安全的(例如,通过同步)。
-
原型(Prototype)作用域:
- 当Bean的作用域为原型时,Spring容器每次请求时都会创建一个新的Bean实例。因此,Bean的状态不会被多个线程共享,但这并不保证Bean引用的其他对象是线程安全的。
-
请求(Request)和会话(Session)作用域:
- 这些是专为web应用设计的作用域。请求作用域为每个HTTP请求创建一个新的Bean,而会话作用域为每个HTTP会话创建一个Bean。
- 这些Bean本身不会被多个线程共享,但与单例Bean的交互可能仍需要线程安全性的考虑。
-
最佳实践:
- 无状态Bean:确保Bean是无状态的,即不包含任何会被多线程共享的成员变量,是保持线程安全性的最佳实践。
- 同步:如果必须使用有状态的单例Bean,确保对共享资源的访问是同步的。
- 使用线程局部变量:为每个线程存储其自己的状态。
-
为什么:
- Spring的设计选择,特别是默认的单例作用域,基于性能和内存使用的考虑。频繁地创建和销毁Bean实例会增加系统的开销。
- 线程安全性是一个复杂的问题,而Spring选择提供灵活性,让开发者决定如何处理它,而不是强制一种特定的方式。
总的来说,保持Spring Bean线程安全主要是开发者的责任。选择合适的Bean作用域,并遵循线程安全的最佳实践,是确保应用线程安全性的关键。
10 创建5个线程,内核线程做2w次累加,最终输出5个线程的累加和
10.1 方法一:使用线程池
为了创建5个线程,并使每个线程内核进行2万次累加,你可以使用Java的Thread
类或ExecutorService
。下面是一个简单的示例,展示了如何使用ExecutorService
来完成这个任务:
import java.util.concurrent.*;public class ThreadSum {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService executor = Executors.newFixedThreadPool(5);List<Future<Integer>> futures = new ArrayList<>();// 为每个线程提交一个任务for (int i = 0; i < 5; i++) {futures.add(executor.submit(new SumTask()));}// 获取每个线程的结果并累加int totalSum = 0;for (Future<Integer> future : futures) {totalSum += future.get();}System.out.println("Total sum: " + totalSum);executor.shutdown();}
}class SumTask implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 20000; i++) {sum += i;}return sum;}
}
此代码首先创建一个固定大小的线程池,然后提交5个任务到线程池。每个任务都会进行2万次的累加。最后,主线程等待所有任务完成,并累加每个任务的结果以得到最终总和。
注意:为了简化示例,这里直接使用了future.get()
来获取每个任务的结果。在实际应用中,你可能需要考虑其他方法来有效地处理这些结果,特别是在大规模并发环境下。
10.2 使用CompletableFuture
public static void main(String[] args) throws InterruptedException, ExecutionException{List<CompletableFuture<Integer>>list=new ArrayList<>();for (int i = 0; i < 5; i++) {list.add(CompletableFuture.supplyAsync(()->{Integer sum=0;for (int j = 0; j < 2000; j++) {sum+=1;}return sum;}));}int s=0;for (Future<Integer>f:list){s+=f.get();}System.out.println("s:"+s);}import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;public class CompletableFutureSum {public static void main(String[] args) {List<CompletableFuture<Integer>> futures = new ArrayList<>();// 为每个线程提交一个任务for (int i = 0; i < 5; i++) {futures.add(CompletableFuture.supplyAsync(() -> {int sum = 0;for (int j = 0; j < 20000; j++) {sum += j;}return sum;}));}// 获取每个线程的结果并累加int totalSum = futures.stream().map(CompletableFuture::join).mapToInt(Integer::intValue).sum();System.out.println("Total sum: " + totalSum);}
}
11 现有集合Arraylist list =new ArrayLIst,利用反射机制在这个泛型为integer的list中存放一个string对象
利用Java的反射机制,你可以绕过泛型的类型检查,从而在一个设计为存储特定类型元素的ArrayList
中存放其他类型的元素。以下是一个示例,展示如何在一个泛型为Integer
的ArrayList
中存放一个String
对象:
import java.lang.reflect.Method;
import java.util.ArrayList;public class ReflectionList {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();try {Method addMethod = list.getClass().getMethod("add", Object.class);addMethod.invoke(list, "This is a string");System.out.println(list.get(0)); // 输出: This is a string} catch (Exception e) {e.printStackTrace();}}
}
在这个示例中,我们首先创建了一个泛型为Integer
的ArrayList
。然后,我们使用反射获取add
方法,该方法的参数类型为Object
。这允许我们调用该方法并传入一个String
对象。
需要注意的是,这种操作会破坏泛型的类型安全性,因此在实际应用中应谨慎使用。
相关文章:
【2024秋招】2023-10-9 同花顺后端笔试题
1 Hashmap mp new hashmap(50)的大小扩充了几次 初时应该就给了这么多空间,在不考虑添加元素,所以扩容为0次 2 算数表达式的中缀为ab*c-d/e,后缀为abc*de/-,前缀是? 3 50M电信带宽ÿ…...
完美的错误处理:Go 语言最佳实践分享
Go 语言是一门非常流行的编程语言,由于其高效的并发编程和出色的网络编程能力,越来越受到广大开发者的青睐。在任何编程语言中,错误处理都是非常重要的一环,它关系到程序的健壮性和可靠性。Go 语言作为一门现代化的编程语言&#…...

vue首页多模块布局(标题布局)
<template><div class"box"><div class"content"><div class"box1" style"background-color: rgb(245,23,156)">第一个</div><div class"box2" style"background-color: rgb(12,233,…...
嵌入式系统>嵌入式硬件知识
AI芯片的特点包括 :新型计算范式AI芯片的关键特征: 1、新型的计算范式 AI 计算既不脱离传统计算,也具有新的计算特质,如处理的内容往往是非结构化数据(视频、图片等)。处理的过程通常需要很大的计算量&am…...
LeetCode 1402. 做菜顺序【排序,动态规划;贪心,前缀和,递推】1679
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
【多线程】探索Java中的多线程编程
标题:探索Java中的多线程编程 摘要: Java是一种广泛使用的编程语言,具有强大的多线程编程能力。本文将深入探讨Java中的多线程编程,包括线程的创建、同步与互斥、线程池的使用以及常见的多线程编程模式。通过示例代码和详细解释&…...
【算法题】翻转对
题目: 给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 你需要返回给定数组中的重要翻转对的数量。 示例 1: 输入: [1,3,2,3,1] 输出: 2 示例 2: 输入: [2,4,3,5,1] 输出: 3 注意: 给定数组的长…...

适用于 Mac 或 Windows 的 4 种最佳 JPEG/PNG图片 恢复软件
您的计算机或外部存储驱动器上很可能有大量 JPEG /PNG图片照片,但不知何故,您意识到一些重要的 JPEG /PNG图片文件丢失或被删除,它们对您来说意义重大,您想要找回它们. 4 种最佳 JPEG/PNG图片 恢复软件 要成功执行 JPEG /PNG图片…...
位置信息API
位置信息API 一、获取当前位置:wx.getLocation(object)二、选择位置:wx.chooseLocation(object)三、打开位置:wx.openLocation(object)四、监听位置事件五、地图组件控制API六、收货地址API:wx.chooseAddress(object) 一、获取当前…...

MySQL——九、SQL编程
MySQL 一、触发器1、触发器简介2、创建触发器3、一些常见示例 二、存储过程1、什么是存储过程或者函数2、优点3、存储过程创建与调用 三、存储函数1、存储函数创建和调用2、修改存储函数3、删除存储函数 四、游标1、声明游标2、打开游标3、使用游标4、关闭游标游标案例 一、触发…...

threejs(4)-纹理材质高级操作
一、纹理重复_缩放_旋转_位移操作 // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; // 导入lil.gui import { GUI } from "three/examples/jsm/l…...

Redis | 数据结构(01)
这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。 因此,这次我…...

一文详解多模态大模型发展及高频因子计算加速GPU算力 | 英伟达显卡被限,华为如何力挽狂澜?
★深度学习、机器学习、多模态大模型、深度神经网络、高频因子计算、GPT-4、预训练语言模型、Transformer、ChatGPT、GenAI、L40S、A100、H100、A800、H800、华为、GPU、CPU、英伟达、NVIDIA、卷积神经网络、Stable Diffusion、Midjourney、Faster R-CNN、CNN 随着人工智能技术…...

debian 10 安装apache2 zabbix
nginx 可以略过,改为apache2 apt updateapt-get install nginx -ynginx -v nginx version: nginx/1.14.2mysql 安装参考linux debian10 安装mysql5.7_debian apt install mysql5.7-CSDN博客 Install and configure Zabbix for your platform a. Install Zabbix re…...

Qt之菜单栏、工具栏、状态栏介绍及工具栏QAction的动态增删显示实现方式
目的 端应用程序或者编辑器基本都支持工具栏快捷功能的动态增删,即通过在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮,取消打钩则在工具栏上就移除了该功能的快捷按钮。那么Qt如何实现这个功能,本篇目的就是记录实现此功能的方法及思…...

十四天学会C++之第八天:文件操作
1. 文件的打开和关闭 文件操作的基本概念。打开文件:使用fstream库打开文件以供读写。关闭文件:确保文件在使用完毕后正确关闭。 文件的打开和关闭:C 文件操作入门 在C编程中,文件操作是一项重要的任务,可以读取和写…...
基于(N-1)×(N-1)棋盘的解的情况推出N×N棋盘的解的情况的N皇后问题
N皇后问题是一个比较经典的问题,其主要目标是在NN的棋盘上,放置N个皇后,要求所有皇后之间不能互相攻击,即任意两个皇后不能处在同一行、同一列或同一对角线上。解决该问题可以采用递归的方式,基于(N-1)棋盘的解的情况推…...

Vue mixin混入
可以把多个组件中共有的配置提取出来构成一个混入。 一、配置混入 (一) 创建mixin.js 这里的名字可以自定义,但是为了方便识别,多数场景下都写mixin。 mixin.js 要创建在src目录下,与main.js平级: &…...

基于 FFmpeg 的跨平台视频播放器简明教程(十):在 Android 运行 FFmpeg
系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)基于 FFmpeg 的跨平台视频…...

正点原子嵌入式linux驱动开发——Linux LCD驱动
LCD是很常用的一个外设,通过LCD可以显示绚丽的图片、界面等,提交人机交互的效率。STM32MP1提供了一个LTDC接口用于连接RGB接口的液晶屏。本章就来学校一下如何在Linux下驱动LCD屏。 LCD和LTDC简介 LCD简介 这里在当时学习stm32裸机开发的时候就学过了…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...