半年经验Java面试准备

认识自己

去年7月入职,就互联网行业来说,公司较为普通,不过也算是大厂了,坐标南京。
进来转眼大半年了,发现方向不对头,不像自己毕业时想的那样,虽然同是开发,但更多的是流程化的编程,杂事很多,语言也不是Java,此时萌生了跳槽的想法。

准备阶段

基础很薄弱,还是校招的基础,只会SSM框架和SpringBoot框架,其他的知识基本忘完了,于是开始复习:
1、Java基础
(1)一些基础知识,数据类型、面向对象、对象创建过程、类加载顺序等一系列非常非常基础的知识;
(2)Java集合,主要有set、list、map;

  • set:分hashset和treeset,这块问的不多,但是还是要知道hashset底层是基于hashmap,由于涉及到不重复的元素,不重复又会引出对象的equals方法和hashCode方法,重写二者的区别;
  • list:分ArrayList和LinkedList,二者区别,增删查的快慢,线程不安全,这里会引出CopyOnWriteArrayList,它是线程安全的,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。
  • map:很重要,面试基本必问,首先聊hashmap,底层原理在JDK1.7和JDK1.8的区别(数组+链表,1.8后链表转变为红黑树),什么时候开始扩容(加载因子0.75),为什么扩容,扩容在JDK1.7和1.8有什么区别,
    JDK1.8链表会转变成红黑树,什么时候转(链表长度超过8),为什么是8而不是7、6,这里涉及到泊松分布了,简单聊聊即可。hashmap的线程不安全性体现在哪,那么线程安全的集合你知道有哪些?hashtable和concurrenthashmap,
    分别介绍介绍,hashtable简单介绍,主要介绍concurrenthashmap,JDK1.7和JDK1.8的区别(锁粒度,1.7主要是segment,多个桶上锁,1.8是针对key,采用CAS+synchronized方式,为什么不能都用CAS?主要是因为链表元素的添加采用CAS的方式在性能上不如synchronized)

(3)Java多线程

  • 多线程的实现方式:三种,继承Thread,实现Runnable,实现Callable,区别说一下;
  • 线程池:核心参数、阻塞队列的区别、拒绝策略、执行过程,理解了执行过程,可以看一遍源码加深印象,线程池的最大线程数和核心线程数设置(1.先看下机器的CPU核数;2.分析下线程池处理的程序是CPU密集型,还是IO密集型)
  • 锁:synchronized和lock的区别,二者都是可重入锁,底层原理上有啥区别:
    • synchronized:应用于三个地方,普通方法、静态方法、同步代码块,区别是就是类锁和对象锁,通过javap指令分析字节码文件,可以发现底层依赖于monitor对象,同时,synchronized在JDK1.6后还引入了锁优化的机制,
      其实在JDK1.4就已经引入,不过默认是关闭状态,锁优化说白了就是设置了不同级别的锁提高效率(无锁——>偏向锁——>轻量级锁——>重要级锁);还有一些优化:如自旋锁(用户态和内核态的来回切换对于CPU来说代价很大,引入自旋锁),自适应自旋锁(自旋得次数由上一次获取锁的自旋次数决定,次数稍微延长一点点),
      锁的消除(对于线程的私有变量,不存在并发问题,没有必要加锁,即使加锁编译后,也会去掉),锁粗化(当一个循环中存在加锁操作时,可以将加锁操作提到循环外面执行,一次加锁代替多次加锁,提升性能)。
    • lock:说到lock的话,必须要说AQS,AbstractQueuedSynchronizer,lock的底层总结起来就是CAS+AQS,AQS里有三个主要的变量,state(0标识没有线程获得锁),节点线程(当前获得锁的线程),CLH(FIFO队列),说一下过程吧:
      当线程1和线程2同时去获取锁,线程1获得了锁,采用CAS将state置为1,节点线程置为线程1,线程2进行队列,此时又有线程3来的话,发现队列里有线程2,它就会乖乖去排队,然后等线程1执行完成后,state置为0,一个一个陆续去执行,这就是公平锁的实现,
      非公平锁的话就是当线程1释放锁时,此时线程3来了,不管队列里有没有线程,都会去竞争锁。
  • 线程之间的通信方式:1、wait/notify模式,2、volatile,3、join,4、ThreadLocal方式
    这里几乎都会问的,但是主要就是volatile,如何保证可见性和禁止重排序;缓存一致性协议、JVM发送lock前缀指令、CPU的嗅探机制;重排序的话可以了解一些happens before原则;

(4)反射、IO:反射的理解,怎么用,解决什么问题;IO流,了解各个输入输出流,怎么使用即可。
(5)总结:我这属于半年的工作经验,学的还是不够深刻,再下一步继续将这些知识进行一个深度的挖掘!

一个字一个字敲的,还在更新!

猜你喜欢

转载自blog.csdn.net/weixin_44374871/article/details/115166436
今日推荐