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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值