Java基本知识要点总结

Java基础

Java容器

  • Java集合概述
  • 说说 List,Set,Map 三者的区别?
  • 如何选用集合?
  • Iterator 迭代器
  • 有哪些集合是线程不安全的?怎么解决呢?
  • Arraylist 和 Vector 的区别?
  • Arraylist 与 LinkedList 区别?
  • 说一说 ArrayList 的扩容机制吧
  • Comparable 和 Comparator 的区别
  • 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
  • HashMap 和 Hashtable 的区别
  • HashMap 和 HashSet 区别
  • HashMap 和 TreeMap 区别
  • HashSet 如何检查重复
  • HashMap 的底层实现(JDK1.8 之前 / JDK1.8 之后)
  • HashMap 的长度为什么是 2 的幂次方
  • HashMap 多线程操作导致死循环问题
  • HashMap 有哪几种常见的遍历方式?
  • ConcurrentHashMap 和 Hashtable 的区别
  • ConcurrentHashMap 线程安全的具体实现方式/底层具体实现(JDK1.8 之前 / JDK1.8 之后)
  • Collections 工具类排序操作
  • Collections 工具类查找、替换操作
  • Collections 工具类同步控制
  • 快速失败(fail-fast)
  • 安全失败(fail-safe)
  • ArrayList 源码
  • LinkedList 源码
  • HashMap(JDK1.8)源码
  • ConcurrentHashMap源码
  • 参考
    Java集合框架常见面试题
    Java 集合框架

并发

Java并发编程之美(2018)

  • 线程创建的三种方式
  • 线程notify() / notifyAll() / wait() 方法
  • 线程的join() 方法
  • 线程的sleep() 方法
  • sleep()和wait()的区别

区别是:
1. sleep()不释放同步锁,wait()释放同步锁
2. sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.
3. 这两个方法来自不同的类分别是Thread和Object
4. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){ x.notify() //或者wait() }
5. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

  • 线程的yield() 方法

  • 线程中断 / interrupt()方法;InterruptedException异常;通过interrupt优雅地退出一个线程

  • 线程死锁,避免死锁

  • 守护线程;setDaemon(true);JVM等待所有线程退出后才结束;jps命令的使用

  • ThreadLocal类 / InheritableThreadLocal类

  • 如何引起线程安全问题;读取-修改-写入操作

  • Java多线程的内存模型
    Java基本知识要点总结

  • Java共享变量的内存可见性问题;定义;如何产生;如何解决

  • synchronized关键字;synchronized关键字在内存模型中的内存语义;如何解决共享内存不可见和原子性问题
    synchronized(修饰方法和代码块)

  • volatile关键字;如何解决共享内存不可见问题,无法解决原子性问题

  • 指令重排和volatile关键字

  • Java中的原子性和CAS操作

  • Unsafe类(未吃透源码)

  • 伪共享;定义,结合多线程内存模型;多线程和单线程条件下的区别;如何避免

  • 乐观锁和悲观锁

  • 公平锁和非公平锁;ReentrantLock

  • 独占锁和共享锁;ReadWriteLock

  • 可重入锁;synchronized实例;解释代码;原理实现
    Synchronized可重入锁分析

  • 自旋锁;CPU占用和内核切换的权衡