这部分面试题多用于面试的热身运动,对很多找实习和准备毕业找工作的小伙伴至关重要。
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<Integer> {
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(); }
}