vlambda博客
学习文章列表

简答关于 Java 基础的常见面试题

 点击上面 时代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> { @Override public String call() throws Exception { return "caller task"; } }
public static class CallerExceptionTask implements Callable<String> { @Override 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关键字区别

  1. volatile关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。

  2. volatile只能用于修饰变量,而synchronized可以修饰方法,以及代码块。(volatile是线程同步的轻量级实现,所以volatile性能比synchronized要好,并且随着JDK新版本的发布,sychronized关键字在执行上得到很大的提升,在开发中使用synchronized关键字的比率还是比较大)

  3. 多线程访问volatile不会发生阻塞,而sychronized会出现阻塞。

  4. volatile能保证变量在多个线程之间的可见性,但不能保证原子性;而sychronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。


12.Java内存模型

Java堆、方法区(元空间)、Java虚拟机栈、本地方法栈、程序计数器

--

知识分享,时代前行!

~~ 时代Java

还有更多好文章……

请查看历史文章和官网,

↓有分享,有收获~