京东自营 + 国补 iPhone 历史最低价          国家补贴 享8折

常见Java面试题

1.数组和链表的区别

2.ArrayList扩容机制

ArrayList的初始化容量为10,在新增元素的时候,会判断当前容量是否充足,充足则不进行扩容,

不充足则计算扩容的容量,为当前旧容量+旧容量左移一位,即当前旧容量的1.5倍,然后将元素拷贝至新数组

3.HashMap底层原理

Jdk1.7 数组 + 链表

Jdk1.8 数组 + 链表 + 红黑树

4.我想要一个key可重复的Map

IdentityHashMap

5.我想要一个排序的Map

TreeMap

6.我想要一个线程安全的Map

ConcurrentHashMap

7.实现线程几种方式

1.继承Thread类

2.实现Runnable

3.实现Callable

4.使用线程池ThreadPoolExecutor

5.使用Future

6.使用CompletableFuture

8.Runnable和Callable的区别

1.Runnable没有返回值,Callable有返回值

2.Runnable不能抛出异常,Callable可以获取到异常

9.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);
	}
}

10.多线程如何访问共享变量

使用valotile关键字

11.sleep 和wait方法的区别

1.sleep方法不会释放锁,wait方法会释放锁

2.sleep方法是Thread类中的,wait方法是Object类中

3.sleep方法到了时间会自动唤醒,wait方法需要notify或者notifyAll唤醒

4.sleep方法需要try catch ,而wait方法不需要

5.sleep方法可以在方法内任意位置,wait方法必须同步代码块里

12.synchronized关键字和valotile关键字区别

  1. volatile关键字解决的是变量在多个线程之间的可见性;而sychronized关键字解决的是多个线程之间访问共享资源的同步性。
  2. volatile只能用于修饰变量,而synchronized可以修饰方法,以及代码块。(volatile是线程同步的轻量级实现,所以volatile性能比synchronized要好,并且随着JDK新版本的发布,sychronized关键字在执行上得到很大的提升,在开发中使用synchronized关键字的比率还是比较大)
  3. 多线程访问volatile不会发生阻塞,而sychronized会出现阻塞。
  4. volatile能保证变量在多个线程之间的可见性,但不能保证原子性;而sychronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。

13.Java内存模型

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

14.程序计数器是干什么的

Java字节码执行的行号指示器,涉及到线程切换时记录当前线程执行到哪了

15.类加载器,双亲委派机制,为什么使用这种机制

应用类加载器、扩展类加载器、启动类加载器

在加载一个类时,首先委托自己的父类加载器进行加载

16.索引失效的情况

1.字段数据区分度不高

2.索引坏掉

3.like查询使用左模糊

4.建立了复合索引,但查询条件没有以复合索引的第一个字段开始

5.查询列使用了函数

6.查询列使用了运算

17.如何查看SQL是否走索引

使用Explain关键字查看SQL语句

18.数据库事务的四大特性

展开阅读全文

本文系作者在时代Java发表,未经许可,不得转载。

如有侵权,请联系nowjava@qq.com删除。

编辑于

关注时代Java

关注时代Java