秋招-查漏补缺_01_面试准备


1. 问题

  1. JDBC中Statement、PreparedStatement和CallableStatement三者的作用和区别?

    1. Statement、PreparedStatement和CallableStatement都是接口(interface)。
    2. Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
    3. Statement接口提供了执行语句和获取结果的基本方法; PreparedStatement接口添加了处理 IN 参数的方法; CallableStatement接口添加了处理 OUT 参数的方法。
    4. Statement: 普通的不带参的查询SQL;支持批量更新,批量删除;
      PreparedStatement: 可变参数的SQL,编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题; 支持批量更新,批量删除;
      CallableStatement: 继承自PreparedStatement,支持带参数的SQL操作; 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
    5. Statement每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。 PreparedStatement是预编译的,使用PreparedStatement有几个好处 :
      1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
      2. 安全性好,有效防止Sql注入等问题。
      3. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
      4. 代码的可读性和可维护性。
  2. 访问控制权限public、protected、default、private之间的区别?

  3. 线程的start()方法和run()方法的区别?哪个会导致线程销毁?

  4. Java中内存泄露和内存溢出的区别?为什么会发生内存泄露?内存泄漏的直接结果是什么?

  5. StringBuffer和StringBuilder的区别是什么?底层结构和String有什么区别?

  6. 字符串常量池和运行时常量池的区别?

  7. 哈希冲突/碰撞怎么解决?

    再散列?链表(链表其实也相当于哈希碰撞,因为链表过长的话,显然效率就会变低。)?

    先数组,再链表,然后如果链表长度过长(节点数大于8,且HashMap总元素大于64),就会将链表转换为红黑树。

    扩容之后,现有的节点是怎么操作的【红黑树上的节点】?

  8. final、finally、finalize的区别?

  9. 垃圾回收算法中的标记算法中的可达性分析(三色标记算法)流程?

    可达性分析之三色标记算法详解_黄智霖-blog的博客-CSDN博客_三色标记算法

  10. stream流

  11. lambda表达式

  12. 接口和抽象类的区别?

    从语法上来说,有如下区别:

    1. 抽象类是半抽象的,接口是完全抽象的。
    2. 抽象类中有构造方法,接口中没有构造方法
    3. 接口和接口之间支持多继承。类和类之间只能单继承。
    4. 一个类可以同时实现多个接口,一个抽象类只能继承一个类。
    5. 接口中只允许出现常量和抽象方法。接口使用的比抽象类多。
    6. 接口一般都是对行为的抽象
    7. 接口的祖先也是Object类。

    相同之处,二者都有抽象方法,都不能实例化【虽然抽象类有构造方法】。

    从作用上来说:抽象类更多地是做为父类模板,因为抽象类有类的特点,可以直接在抽象类中添加非抽象方法作为模板,子类无需改变可直接调用或者重写。而接口则不行,接口更多地是作为一种规范协议,如果接口添加了某些抽象方法,所有的子类必须都改变源码来实现方法。

    那么普通类其实也可以实现上面的功能,那么为什么还要出现抽象类呢?参考模板方法设计模式。即既有框架规定的核心实现,无法修改,也有允许用户自定义实现的抽象方法。

    模板方法设计模式在模板类中定义核心的算法骨架,具体的实现步骤可以延迟到子类当中去实现。模板类通常是一个抽象类,定义的核心方法通常是final的。模板类中的抽象方法就是不确定怎么实现的方法,通常交给子类来做。

  13. 深拷贝和浅拷贝的区别?深克隆浅克隆?

    面试题:深拷贝和浅拷贝(超级详细,有内存图)_田江的博客-CSDN博客_深拷贝和浅拷贝面试题

    Java面试题——浅拷贝和深拷贝_skyy~的博客-CSDN博客_java深拷贝和浅拷贝面试题

  14. Exception和Error的区别?

    根类是Object类,然后Throwable类继承Object类,是所有错误(Error)和异常(Exception)的父类。不管是错误还是异常,都是可抛出的。

    Throwable类有Error和Exception两个直接子类。

    错误只要发生,Java程序只有一个结果,就是终止程序的执行,退出JVM,错误是不能处理的。而异常允许处理,不处理也会终止执行。

    错误是不能处理的,只要发生错误,虚拟机就会终止退出;而异常则允许处理,不退出JVM。

    常见的错误有:OutOfMemoryError、StackOverflowError

    常见的异常有:Exception(编译时异常)和RuntimeException(运行时异常)

    c5b3565168c54566f73c27cd97780a0e.png

  15. Java常用的集合?

  16. HashMap、HashTable和TreeMap底层的数据结构,源码?

    • HashMap底层采用了哈希表这种数据结构(非线程安全);
    • Hashtable底层采用了哈希表这种数据结构(线程安全,但是保证线程安全有其他方法,该类效率较低,用的较少);
    • TreeMap实现SortedMap接口,SortedMap接口继承了Map接口。TreeMap底层采用了二叉树这种数据结构。SortedMap集合下的子类,存储元素会自动按照key元素的大小顺序排序。
  17. ArrayList、LinkedList、Vector、HashMap、HashTable、TreeMap总结

    遍历方式:Iterator、foreach、下标。【针对ArrayList、LinkedList、Vector】

    遍历方式:Iterator、foreach。【HashSet、TreeSet,注意,没有下标遍历,因为无序】

  18. 迭代器Iterator的作用是什么?为很么要有迭代器这个类?

  19. 泛型的作用是什么?

  20. ThreadLocal

  21. 线程池

  22. 什么是反射?反射的作用是什么?

    反射就是获取到指定类在方法区中的Class对象。找到这个对象之后,其实就可以手动创建对象了。因为JVM在类加载时,其实就是创建这个Class对象,然后自动创建对象。

    那么和new 构造方法()这种方式的优点是什么呢?new 构造方法()显然会把构造方法写死,即只能创建固定的类对象。那么能不能动态创建不同的类对象呢?显然按照传统方式是不能的,因为如果是动态的,只能是配置文件形式(无需重新编译编译源码),但是传统方式是无法将字符串转换成Java语句的,所以要想动态创建不同的类对象,只能识别字符串。显然可以用Class.forName(类名全路径)获取到具体的Class类对象,然后实例化。

    另外,通过反射,即获取到该类在方法区中的Class对象,可通过该对象的一些方法来反编译class文件,生成源码。

  23. 什么是注解?注解的作用是什么?

    注解和枚举类似,也是一种引用数据类型。注解只是在编译阶段给编译器做参考的,和运行阶段没有关系。有了注解,编译器在编译阶段会进行编译检查,如果和注解的作用不符,那么就会报错。

    因此注解有三个保留策略:sources、class、runtime,即注解分别保留到源代码、字节码文件、运行时。

    注解其实就是一种标记,可编写代码对某种特定的注解修饰的代码执行特定的操作。比如框架中的@Service、@Component等。

  24. Java8新特性

  25. Java中的IO和NIO

  26. Socket和RPC的区别?Dubbo和SpringCloud用的是什么

    底层是TCP/IP的封装?

  27. Arrays.asList();

  28. Java中的类型推断。

  29. 迭代器和生成器的区别?

  30. Comparable和Comparator的异同?

  31. fork/join框架

  32. sleep和wait的异同

  33. java语法糖

  34. 你知道什么是Java内存模型JMM吗?

  35. JMM和volatile它们两个之间的关系?

  36. JMM有哪些特性or它的三大特性是什么?

  37. 为什么要有JMM,它为什么出现?作用和功能是什么?

  38. happens-before先行发生原则你有了解过吗?

  39. 可重入锁

    可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。比如ReentrantLock就是可重入锁。因此可重入锁也被称为递归锁。Synchronized也是可重入锁。

  40. i++和++i是原子操作吗?

  41. 用户态和系统态的切换

  42. 总线嗅探和缓存一致性协议

  43. IO密集和CPU密集型,线程池中的多线程数量如何设置?怎么设置线程数量,获取当前操作系统的核数。

  44. ThreadLocal中ThreadLocalMap中的数据结构和关系?

  45. ThreadLocal的key是弱引用,这是为什么?

  46. ThreadLocal内存泄露问题你知道吗?

  47. ThreadLocal中最后为什么要加remove方法?

  48. 线程池中的shutdown是怎么操作的

  49. Thread、ThreadLocal、THreadLocalMap的关系

  50. Entry和HashMap

  51. 为什么ThreadLocalMap中的Entry要继承弱引用

  52. 可达性算法,三个标记法。

  53. VM参数都有哪些?

  54. ThreadLocal为什么尽量是static的

  55. 公平锁和非公平锁,Lock和Synchronized哪个是公平锁,哪个是非公平锁。

    公平锁―是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁 在高并发的情况下,有可能会造成优先级反转或者饥饿现象。

    1. 公平锁,就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己
    2. 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。
    3. 非公平锁的优点在于吞吐量比公平锁大。
    4. 对于Synchronized而言,也是一种非公平锁。
    5. ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。
  56. LockSupport工具类是干什么的,有什么作用?

  57. 偏向锁是什么,在JUC中的体现

  58. Monitor是干什么的

  59. 内部类的作用是什么,为什么要定义内部类,而不是在外面定义一个类呢?内部类可以是抽象的吗?

  60. CLH队列,与AQS的关系?

  61. 单例设计模式一共有几种实现方式?请分别用代码实现,并说明各个实现方式的优点和缺点?什么时候需要使用工具类?

    恶汉式(两种)、懒汉式(三种)、双重检查、静态内部类、枚举,一共八种实现方式。基于类加载方式(静态变量、静态代码块)的饿汉式为什么是线程安全的?

  62. 静态内部类的特点,为什么可以实现懒加载的单例模式?

  63. MySQL中的子查询是原子操作吗?

  64. @Transactional注解的具体流程

  65. MySQL缓存与Redis的区别?

  66. Redis持久化策略

    (一)分布式缓存——Redis持久化之RDB和AOF_方方土^_^的博客-CSDN博客_rdb和aof的全称

  67. Redis实现分布式锁

    Redis实现分布式锁_useruseruser15的博客-CSDN博客_redis实现分布式锁

    Redis实现分布式锁的五种方法详解_Redis_脚本之家 (jb51.net)

  68. Redis缓存击穿、缓存雪崩、缓存穿透的区别?

  69. Spring循环依赖怎么解决

  70. Spring三级缓存解决循环依赖的实现原理

  71. Redis中如何开启事务,事务保证了原子性吗?

  72. Redis集群中主机宕机后,谁来提供写服务?从机如何上位?从机宕机后,集群关系会变吗?

  73. Redis哨兵模式是干嘛的。

  74. 怎么保证单点登录?

  75. Spring的事务传播行为?什么是事务传播?

2. 知识点

  1. Spring没有提供日志系统,需要采用AOP的方式将第三方日志框架集成到Spring中。
  2. 构造方法不能被继承,只能被显式或隐式的调用
  3. final修饰的类不能被继承,final修饰的方法不能被重写,但是可以被重载
  4. iterator.remove()操作会删除迭代器刚刚返回的元素。
  5. 子类重写父类方法时,方法的访问权限不能小于原访问权限。在接口中,方法的默认权限就是public,所以子类重写后只能是public。
  6. ConcurrentHashMap 使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。CAS算法,即无锁算法【乐观锁】,效率比锁高。
  7. Arrays.asList()方法返回的列表是Arrays.ArrayList类型的,并不是java.util.ArrayList;
  8. Spring中原型bean的创建,就是原型模式的使用
  9. Redis默认有16个数据库,不能自己创建,可通过设置配置文件在启动前指定Redis自动创建数据库的个数。连接Redis后,默认连接的是0号数据库实例。
  10. 集群主从复制,少量主服务器负责写,大量从服务器负责读。

文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录