目的: 总结下面试时遇到的问题,并附上自己的答案.
1 Java基础
1.1 Java的继承,多态。 以及多态下的域和方法的调用问题 。
class A{
int num = 1;
public void print(){
System.out.print("num = " + num);
}
}
class B extends A{
int num = 2;
public void print2(){
System.out.print("numn = " + num);
}
/*
public void print(){
System.out.print("num = " + num);
}
*/
}
}
public class C{
public static void main(Stirng[] args){
A a = new B();
a.print();
// a.print2();
}
}
问输出结果。
1.2 Java中四个权限修饰符是什么? 具体代表了什么权限。
1.3 String, String Builder, String Buffer有什么区别?
2 集合类
这方面是问的最多的。基本每个面试都会问。所以应该仔细看一下。
2.1 map(Hashmap)了解吗? 讲一下你最常用的的map。
答案:一般我会随身携带纸笔。遇到这个问题就将hashmap的结构实现画出来。如下图:
不太明白的可以参考这个文章:
https://www.cnblogs.com/chengxiao/p/6059914.html
(题外: 如果对自己有自信,可以点名这种实现是jdk1.7, 在1.8后有所改变。但是这样可能会让面试官问你1.8是怎么实现的,没信心回答好千万的不要多此一举)
在画完这个图后,基本就是对面试官照着图讲hashmap的源码实现过程了。在讲源码的过程中要出现以下相关内容
- 数组容量和负载因子。
- 向hashmap中添加元素时的实现过程:
- 检查map的容量,此处会涉及到resize方法。
- 怎么确定在数组中的存储位置,此处可以带过
- 计算出来的位序一样时怎么办? 链表链接。
- 一定要点明添加的元素已经存在的情况(通过比较hash值和equal方法), 在此处还能告诉面试官这就是为什么我们重写hashcode要求重写equals方法,显得你对底层很了解.
2.2 List用过哪些? ArrayList 和 LinkedList的插入,删除,查找的时间复杂度各是多少? 底层怎么实现? System.ArrayCopy 是怎么操作的, 会出现什么问题.
ArrayCopy会出现的问题: https://www.cnblogs.com/weikongziqu/p/5808184.html
3 多线程
3.1 三个线程顺序打印(或者是线程C等待线程A和线程B的运行结果)怎么实现
- 第一种方法是设置一个全局变量, 利用violate修饰,来动态的改变变量值,进而实现不同线程能拿到不同的锁
3.1 讲一下synchronized
3.2 synchronized和lock的区别是什么
- synchronized是jdk自带的同步工具。 在获取锁后,即使程序发生异常,它也能够自动实现锁的释放。这点从对synchronized的反编译能看出来。一个synchronized对应一个monitor enter和两个monitor exit。 这点是与lock不同的地方。 lock的释放需要手动进行。
3.3 线程间怎么通信
4 spring
4.1 介绍下MVC设计模式
4.2 spring AOP / IOC介绍一下
5 手写代码
5.1 排序算法
- 快排
- 堆排
- 归并
- 冒泡
5.2 数组中只有0,1,2 三种数, 对这个数组进行排序. 要求不使用额外空间, 时间复杂度尽可能小
使用三个指针, 分别指向0,1,2. 移动指针进行交换
5.3 查看一个字符串是不是以某个子字符串开头(或者是否包含某个字符串)
使用正则表达式判断. 也可以看一下String的源码