简答关于 Java 基础的常见面试题
1.ArrayList扩容机制
ArrayList的初始化容量为10,在新增元素的时候,会判断当前容量是否充足,充足则不进行扩容,
不充足则计算扩容的容量,为当前旧容量+旧容量左移一位,即当前旧容量的1.5倍,然后将元素拷贝至新数组
2.HashMap底层原理
Jdk1.7 数组 + 链表
Jdk1.8 数组 + 链表 + 红黑树
3.我想要一个key可重复的Map
IdentityHashMap
4.我想要一个排序的Map
TreeMap
5.我想要一个线程安全的Map
ConcurrentHashMap
6.实现线程几种方式
1.继承Thread类
2.实现Runnable
3.实现Callable
4.使用线程池ThreadPoolExecutor
5.使用Future
6.使用CompletableFuture
7.Runnable和Callable的区别
1.Runnable没有返回值,Callable有返回值
2.Runnable不能抛出异常,Callable可以获取到异常
8.Callable的返回值如何获取
将任务放在FutureTask中,启动线程后get出来,代码如下
public class CallableTest {
public static class CallerTask implements Callable<String> {
public String call() throws Exception {
return "caller task";
}
}
public static class CallerExceptionTask implements Callable<String> {
public String call() throws Exception {
throw new RuntimeException("caller task throw exception");
}
}
public static void main(String[] args) {
//创建异步任务
FutureTask<String> futureTask = new FutureTask<>(new CallerExceptionTask());
//启动线程
new Thread(futureTask).start();
String s = null;
try {
s = futureTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("异步任务返回值:" + s);
}
}
9.多线程如何访问共享变量
使用valotile关键字
10.sleep 和wait方法的区别
1.sleep方法不会释放锁,wait方法会释放锁
2.sleep方法是Thread类中的,wait方法是Object类中
3.sleep方法到了时间会自动唤醒,wait方法需要notify或者notifyAll唤醒
4.sleep方法需要try catch ,而wait方法不需要
5.sleep方法可以在方法内任意位置,wait方法必须同步代码块里
11.synchronized关键字和valotile关键字区别
volatile关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。
volatile只能用于修饰变量,而synchronized可以修饰方法,以及代码块。(volatile是线程同步的轻量级实现,所以volatile性能比synchronized要好,并且随着JDK新版本的发布,sychronized关键字在执行上得到很大的提升,在开发中使用synchronized关键字的比率还是比较大)
多线程访问volatile不会发生阻塞,而sychronized会出现阻塞。
volatile能保证变量在多个线程之间的可见性,但不能保证原子性;而sychronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。
12.Java内存模型
Java堆、方法区(元空间)、Java虚拟机栈、本地方法栈、程序计数器
--
知识分享,时代前行!
~~ 时代Java
还有更多好文章……
请查看历史文章和官网,
↓有分享,有收获~