1. 问题
JDBC中Statement、PreparedStatement和CallableStatement三者的作用和区别?
- Statement、PreparedStatement和CallableStatement都是接口(interface)。
- Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
- Statement接口提供了执行语句和获取结果的基本方法; PreparedStatement接口添加了处理 IN 参数的方法; CallableStatement接口添加了处理 OUT 参数的方法。
- Statement: 普通的不带参的查询SQL;支持批量更新,批量删除;
PreparedStatement: 可变参数的SQL,编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题; 支持批量更新,批量删除;
CallableStatement: 继承自PreparedStatement,支持带参数的SQL操作; 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持; - Statement每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。 PreparedStatement是预编译的,使用PreparedStatement有几个好处 :
- 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
- 安全性好,有效防止Sql注入等问题。
- 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
- 代码的可读性和可维护性。
访问控制权限public、protected、default、private之间的区别?
线程的start()方法和run()方法的区别?哪个会导致线程销毁?
Java中内存泄露和内存溢出的区别?为什么会发生内存泄露?内存泄漏的直接结果是什么?
StringBuffer和StringBuilder的区别是什么?底层结构和String有什么区别?
字符串常量池和运行时常量池的区别?
哈希冲突/碰撞怎么解决?
再散列?链表(链表其实也相当于哈希碰撞,因为链表过长的话,显然效率就会变低。)?
先数组,再链表,然后如果链表长度过长(节点数大于8,且HashMap总元素大于64),就会将链表转换为红黑树。
扩容之后,现有的节点是怎么操作的【红黑树上的节点】?
final、finally、finalize的区别?
垃圾回收算法中的标记算法中的可达性分析(三色标记算法)流程?
stream流
lambda表达式
接口和抽象类的区别?
从语法上来说,有如下区别:
- 抽象类是半抽象的,接口是完全抽象的。
- 抽象类中有构造方法,接口中没有构造方法。
- 接口和接口之间支持多继承。类和类之间只能单继承。
- 一个类可以同时实现多个接口,一个抽象类只能继承一个类。
- 接口中只允许出现常量和抽象方法。接口使用的比抽象类多。
- 接口一般都是对行为的抽象。
- 接口的祖先也是Object类。
相同之处,二者都有抽象方法,都不能实例化【虽然抽象类有构造方法】。
从作用上来说:抽象类更多地是做为父类模板,因为抽象类有类的特点,可以直接在抽象类中添加非抽象方法作为模板,子类无需改变可直接调用或者重写。而接口则不行,接口更多地是作为一种规范协议,如果接口添加了某些抽象方法,所有的子类必须都改变源码来实现方法。
那么普通类其实也可以实现上面的功能,那么为什么还要出现抽象类呢?参考模板方法设计模式。即既有框架规定的核心实现,无法修改,也有允许用户自定义实现的抽象方法。
模板方法设计模式在模板类中定义核心的算法骨架,具体的实现步骤可以延迟到子类当中去实现。模板类通常是一个抽象类,定义的核心方法通常是final的。模板类中的抽象方法就是不确定怎么实现的方法,通常交给子类来做。
深拷贝和浅拷贝的区别?深克隆浅克隆?
Exception和Error的区别?
根类是Object类,然后Throwable类继承Object类,是所有错误(Error)和异常(Exception)的父类。不管是错误还是异常,都是可抛出的。
Throwable类有Error和Exception两个直接子类。
错误只要发生,Java程序只有一个结果,就是终止程序的执行,退出JVM,错误是不能处理的。而异常允许处理,不处理也会终止执行。
错误是不能处理的,只要发生错误,虚拟机就会终止退出;而异常则允许处理,不退出JVM。
常见的错误有:OutOfMemoryError、StackOverflowError
常见的异常有:Exception(编译时异常)和RuntimeException(运行时异常)
Java常用的集合?
HashMap、HashTable和TreeMap底层的数据结构,源码?
- HashMap底层采用了哈希表这种数据结构(非线程安全);
- Hashtable底层采用了哈希表这种数据结构(线程安全,但是保证线程安全有其他方法,该类效率较低,用的较少);
- TreeMap实现SortedMap接口,SortedMap接口继承了Map接口。TreeMap底层采用了二叉树这种数据结构。SortedMap集合下的子类,存储元素会自动按照key元素的大小顺序排序。
ArrayList、LinkedList、Vector、HashMap、HashTable、TreeMap总结
遍历方式:Iterator、foreach、下标。【针对ArrayList、LinkedList、Vector】
遍历方式:Iterator、foreach。【HashSet、TreeSet,注意,没有下标遍历,因为无序】
迭代器Iterator的作用是什么?为很么要有迭代器这个类?
泛型的作用是什么?
ThreadLocal
线程池
什么是反射?反射的作用是什么?
反射就是获取到指定类在方法区中的Class对象。找到这个对象之后,其实就可以手动创建对象了。因为JVM在类加载时,其实就是创建这个Class对象,然后自动创建对象。
那么和
new 构造方法()
这种方式的优点是什么呢?new 构造方法()
显然会把构造方法写死,即只能创建固定的类对象。那么能不能动态创建不同的类对象呢?显然按照传统方式是不能的,因为如果是动态的,只能是配置文件形式(无需重新编译编译源码),但是传统方式是无法将字符串转换成Java语句的,所以要想动态创建不同的类对象,只能识别字符串。显然可以用Class.forName(类名全路径)
获取到具体的Class类对象,然后实例化。另外,通过反射,即获取到该类在方法区中的Class对象,可通过该对象的一些方法来反编译class文件,生成源码。
什么是注解?注解的作用是什么?
注解和枚举类似,也是一种引用数据类型。注解只是在编译阶段给编译器做参考的,和运行阶段没有关系。有了注解,编译器在编译阶段会进行编译检查,如果和注解的作用不符,那么就会报错。
因此注解有三个保留策略:sources、class、runtime,即注解分别保留到源代码、字节码文件、运行时。
注解其实就是一种标记,可编写代码对某种特定的注解修饰的代码执行特定的操作。比如框架中的@Service、@Component等。
Java8新特性
Java中的IO和NIO
Socket和RPC的区别?Dubbo和SpringCloud用的是什么
底层是TCP/IP的封装?
Arrays.asList();
Java中的类型推断。
迭代器和生成器的区别?
Comparable和Comparator的异同?
fork/join框架
sleep和wait的异同
java语法糖
你知道什么是Java内存模型JMM吗?
JMM和volatile它们两个之间的关系?
JMM有哪些特性or它的三大特性是什么?
为什么要有JMM,它为什么出现?作用和功能是什么?
happens-before先行发生原则你有了解过吗?
可重入锁
可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。比如ReentrantLock就是可重入锁。因此可重入锁也被称为递归锁。Synchronized也是可重入锁。
i++和++i是原子操作吗?
用户态和系统态的切换
总线嗅探和缓存一致性协议
IO密集和CPU密集型,线程池中的多线程数量如何设置?怎么设置线程数量,获取当前操作系统的核数。
ThreadLocal中ThreadLocalMap中的数据结构和关系?
ThreadLocal的key是弱引用,这是为什么?
ThreadLocal内存泄露问题你知道吗?
ThreadLocal中最后为什么要加remove方法?
线程池中的shutdown是怎么操作的
Thread、ThreadLocal、THreadLocalMap的关系
Entry和HashMap
为什么ThreadLocalMap中的Entry要继承弱引用
可达性算法,三个标记法。
VM参数都有哪些?
ThreadLocal为什么尽量是static的
公平锁和非公平锁,Lock和Synchronized哪个是公平锁,哪个是非公平锁。
公平锁―是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁 在高并发的情况下,有可能会造成优先级反转或者饥饿现象。
- 公平锁,就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己
- 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。
- 非公平锁的优点在于吞吐量比公平锁大。
- 对于Synchronized而言,也是一种非公平锁。
- ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。
LockSupport工具类是干什么的,有什么作用?
偏向锁是什么,在JUC中的体现
Monitor是干什么的
内部类的作用是什么,为什么要定义内部类,而不是在外面定义一个类呢?内部类可以是抽象的吗?
CLH队列,与AQS的关系?
单例设计模式一共有几种实现方式?请分别用代码实现,并说明各个实现方式的优点和缺点?什么时候需要使用工具类?
恶汉式(两种)、懒汉式(三种)、双重检查、静态内部类、枚举,一共八种实现方式。基于类加载方式(静态变量、静态代码块)的饿汉式为什么是线程安全的?
静态内部类的特点,为什么可以实现懒加载的单例模式?
MySQL中的子查询是原子操作吗?
@Transactional注解的具体流程
MySQL缓存与Redis的区别?
Redis持久化策略
Redis实现分布式锁
Redis缓存击穿、缓存雪崩、缓存穿透的区别?
Spring循环依赖怎么解决
Spring三级缓存解决循环依赖的实现原理
Redis中如何开启事务,事务保证了原子性吗?
Redis集群中主机宕机后,谁来提供写服务?从机如何上位?从机宕机后,集群关系会变吗?
Redis哨兵模式是干嘛的。
怎么保证单点登录?
Spring的事务传播行为?什么是事务传播?
2. 知识点
- Spring没有提供日志系统,需要采用AOP的方式将第三方日志框架集成到Spring中。
- 构造方法不能被继承,只能被显式或隐式的调用。
- final修饰的类不能被继承,final修饰的方法不能被重写,但是可以被重载。
- iterator.remove()操作会删除迭代器刚刚返回的元素。
- 子类重写父类方法时,方法的访问权限不能小于原访问权限。在接口中,方法的默认权限就是public,所以子类重写后只能是public。
- ConcurrentHashMap 使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。CAS算法,即无锁算法【乐观锁】,效率比锁高。
- Arrays.asList()方法返回的列表是Arrays.ArrayList类型的,并不是java.util.ArrayList;
- Spring中原型bean的创建,就是原型模式的使用
- Redis默认有16个数据库,不能自己创建,可通过设置配置文件在启动前指定Redis自动创建数据库的个数。连接Redis后,默认连接的是0号数据库实例。
- 集群主从复制,少量主服务器负责写,大量从服务器负责读。