金三银四面试题(十三):Java基础问题(4)

这部分面试题多用于面试的热身运动,对很多找实习和准备毕业找工作的小伙伴至关重要。

ArrayList,Vector和LinkedList

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增

加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存

操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全).

通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进

行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

LinkedList 也是线程不安全的,LinkedList 提供了一些方法,使得 LinkedList 可以被当作堆

栈和队列来使用。

可以自己写一个String类吗

可以,但是使用的时候只能用自己的类加载器去加载,否则类加载器只能加载lang包下的String。

Java开启新线程的方法

  • 继承Thread类:

    可以创建一个类,继承自Thread类,并重写其run()方法来定义线程要执行的任务。然后,可以创建该类的实例并调用start()方法来启动线程。

  • 实现Runnable接口:

    可以创建一个类,实现Runnable接口,并实现其run()方法来定义线程要执行的任务。然后,可以将该实现类的实例传递给Thread类的构造函数,并调用start()方法来启动线程。

  • 实现Callable 接口:该接口中的call方法可以在线程执行结束时产生一个返回值。这个可能不常用。

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;

    public class MyCallable implements Callable {
    public Integer call() {
    // 执行一些耗时任务
    int result = 0;
    for (int i = 0; i < 10; i++) {
    result += i;
    try {
    Thread.sleep(100); // 模拟耗时操作
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    return result;
    }

    复制代码
      public static void main(String[] args) {
          MyCallable myCallable = new MyCallable();
          FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
    
          Thread thread = new Thread(futureTask);
          thread.start();
    
          try {
              // 获取任务执行的结果
              int result = futureTask.get();
              System.out.println("Result: " + result);
          } catch (InterruptedException | ExecutionException e) {
              e.printStackTrace();
          }
      }

    }

MyCallable 类实现了 Callable 接口,该接口的泛型指定了任务执行后返回的结果类型。在 call() 方法中,定义了任务要执行的操作,并返回一个整数结果。在 main() 方法中,创建了一个 FutureTask 对象,它可以用来获取任务的执行结果。然后,创建一个线程,并将 FutureTask 对象传递给线程的构造函数。调用 start() 方法启动线程后,可以调用 FutureTask 的 get() 方法来获取任务的执行结果。

  • 使用Executor框架:
    可以使用java.util.concurrent包中的Executor框架来管理线程。通过Executor框架,可以更方便地控制线程的创建、执行和关闭。

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    public class Main {
    public static void main(String[] args) {
    // 创建线程池
    ExecutorService executor = Executors.newFixedThreadPool(3);

    复制代码
          // 提交 Runnable 任务给线程池执行
          executor.execute(() -> {
              for (int i = 0; i < 5; i++) {
                  System.out.println(Thread.currentThread().getName() + ": Task " + i);
                  try {
                      Thread.sleep(100); // 模拟耗时操作
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
          });
    
          // 关闭线程池
          executor.shutdown();
      }

    }

往期文章

金三银四面试题(一):JVM类加载与垃圾回收

金三银四面试题(二):数据库缓存的数据一致性

金三银四面试题(三):JVM内存模型

金三银四面试题(四):Full GC 和 Minor GC

金三银四面试题(五):JVM之TLAB

金三银四面试题(六):对象大小知多少

金三银四面试题(七):JVM常见面试题(1)

金三银四面试题(八):JVM常见面试题(2)

金三银四面试题(九):JVM常见面试题(3)

金三银四面试题(十):Java基础问题(1)

金三银四面试题(十一):Java基础问题(2)

相关推荐
神仙别闹几秒前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
Flynn Liang1 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
SomeOtherTime1 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔1 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆2 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
SimonKing2 小时前
Workbuddy太占C盘空间了,写个迁移工具迁走10G的数据
java·后端·程序员
Hvitur3 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J3 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪3 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang