当前位置: 首页 > news >正文

java面试笔记(一)

1. 一万个string类型的数据,设计一个算法如何按照String长度来排序

以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码:

public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例数组String[] strings = {"example", "test", "longerexample", "short", "medium"// 这里可以添加更多字符串以达到一万个};// 使用 Arrays.sort 方法按照字符串长度排序Arrays.sort(strings, Comparator.comparingInt(String::length));// 输出排序后的结果for (String s : strings) {System.out.println(s);}}
}
2.在 Spring Boot 中,如果你有一个包含一万条数据的 List,并且在一个接口中调用 list.remove(0),当有 100 多个线程同时请求这个接口时,会发生以下情况:
可能发生的问题
  1. 线程安全问题

    • ArrayList 和 LinkedList 等常见的 List 实现不是线程安全的。多个线程同时调用 remove(0) 可能导致数据竞争(data race),从而引发 ConcurrentModificationException 或者导致数据不一致。
  2. 数据不一致

    • 如果多个线程同时尝试移除第一个元素,某些线程可能会看到不一致的状态,导致它们移除错误的元素或抛出异常。
  3. 性能问题

    • 频繁的 remove(0) 操作会导致数组的重排,性能开销较大。在高并发的情况下,这种性能损失会更加明显。
解决方案

为了解决上述问题,可以考虑以下几种方案:

1. 使用线程安全的集合:使用 CopyOnWriteArrayList 或 Collections.synchronizedList(new ArrayList<>()) 来保证线程安全。

List<String> list = Collections.synchronizedList(new ArrayList<>());

2. 使用锁在访问和修改 List 的地方使用显式的锁(如 ReentrantLock)来确保同一时间只有一个线程可以执行该操作。

private final Lock lock = new ReentrantLock();public void removeFirst() {lock.lock();try {if (!list.isEmpty()) {list.remove(0);}} finally {lock.unlock();}
}

3. 使用并发集合

  • 如果你的操作是复杂的,可以考虑使用 ConcurrentLinkedQueue 或其他并发集合,这些集合设计用于高并发场景。
假如使用redis存储改结果

因为redis是单线程多路复用的可以解决多线程并发问题,但是也会出现其他的问题。如list数据量过大会导致redis大key问题,严重影响redis性能。

3. 现在有两个表A,B他们的字段一模一样,A中有少量数据,B中有大量数据;现在需要将A,B数据全部查出来,去掉id相同的数据。

可以使用以下 SQL 查询来获取去重后的结果:

SELECT id, name FROM A
UNION
SELECT id, name FROM B
WHERE id NOT IN (SELECT id FROM A);
  1. UNION:

    • UNION 操作符用于合并两个 SELECT 语句的结果集,并自动去除重复记录。
  2. NOT IN:

    • 在第二个 SELECT 语句中,使用 WHERE id NOT IN (SELECT id FROM A) 来排除表 A 中已经存在的 ID,从而确保结果集中不会有重复的 ID。
4. linux命令如何去查找文档里的某个字符并忽略大小写
grep -i '字符' 文件名
5. Linux如何按照日期去分割日志文件并按照每个日期的分别存储,然后zip打包到其他服务器

详细步骤

  1. 分割日志文件

    • 确保日志文件的日期格式一致。
    • 使用 awk 命令按日期分割。
  2. 打包

    • 使用 zip 命令将所有生成的日志文件打包为 logs.zip
  3. 传输

    • 使用 scp 命令将打包文件发送到目标服务器。

示例

假设你的日志文件名为 access.log,可以按以下步骤执行:

# 按日期分割
awk '{ date = substr($1, 1, 10); print >> date".log" }' access.log# 打包
zip logs.zip *.log# 传输
scp logs.zip user@remote_server:/path/to/destination/
http://www.lryc.cn/news/539345.html

相关文章:

  • 【C++】36.C++IO流
  • Qt5开发入门指南:从零开始掌握跨平台开发
  • Rook-ceph(1.92最新版)
  • 深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
  • 网络安全学习架构 网络安全架构内容
  • 硕成C语言24
  • 《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》-配套代码示例
  • Linux下为Intel核显安装OpenCL
  • 用deepseek学大模型04-机器学习建模过程
  • 【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接
  • Unity3D实现接入DeepSeek对话
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】
  • 前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用」 「从零开始:Vue 和 React 最受欢迎的 UI 组件库入门指南」 「超实用!PC 端和移动端 UI 组件库推荐与实战
  • 【MySQL高级】17 - MySQL中常用工具
  • 【Linux】Linux 文件系统——有关 inode 不足的案例
  • 计算机视觉:卷积神经网络(CNN)基本概念(二)
  • 【第7章:注意力机制与Transformer模型—7.4 NLP领域的BERT、GPT系列模型】
  • [代码调试]安装Text2Image(stable diffusion)模型环境的踩坑记录
  • 大数据SQL调优专题——Flink执行原理
  • Oracle 12c中在同一组列上创建多个索引
  • 线程安全的集合类
  • 【如何实现 JavaScript 的防抖和节流?】
  • C#中File类的Copy()方法或FileInfo类的CopyTo()方法的参数overwrite取false和true的区别
  • 力扣 买卖股票的最佳时机
  • 蚁剑(AutSword)的下载安装与报错解决
  • 【全栈开发】----Mysql基本配置与使用
  • Spring Boot项目的基本设计步骤和相关要点介绍
  • 【Spring快速入门】不断更新...
  • nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作
  • HTML之JavaScript DOM(document)编程处理事件