文章目录

  • Java 基础
    • 1. JDK 和 JRE 有什么区别?
    • 2. == 和 equals 的区别是什么?
    • 3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
    • 4. final 在 Java 中有什么作用?
    • 5. Java 中的 Math.round(-1.5) 等于多少?
    • 6. String 属于基础的数据类型吗?
    • 7. Java 中操作字符串都有哪些类?它们之间有什么区别?
    • 8. String str="i"与 String str=new String(“i”)一样吗?
    • 9. 如何将字符串反转?
    • 10. String 类的常用方法都有那些?
    • 11. 抽象类必须要有抽象方法吗?
    • 12. 普通类和抽象类有哪些区别?
    • 13. 抽象类能使用 final 修饰吗?
    • 14. 接口和抽象类有什么区别?
    • 15. Java 中 IO 流分为几种?
    • 16. BIO、NIO、AIO 有什么区别?
    • 17. Files的常用方法都有哪些?
  • 容器
    • 18. Java 容器都有哪些?
    • 19. Collection 和 Collections 有什么区别?
    • 20. List、Set、Map 之间的区别是什么?
    • 21. HashMap 和 Hashtable 有什么区别?
    • 22. 如何决定使用 HashMap 还是 TreeMap?
    • 23. 说一下 HashMap 的实现原理?
    • 24. 说一下 HashSet 的实现原理?
    • 25. ArrayList 和 LinkedList 的区别是什么?
    • 26. 如何实现数组和 List 之间的转换?
    • 27. ArrayList 和 Vector 的区别是什么?
    • 28. Array 和 ArrayList 有何区别?
    • 29. 在 Queue 中 poll()和 remove()有什么区别?
    • 30. 哪些集合类是线程安全的?
    • 31. 迭代器 Iterator 是什么?
    • 32. Iterator 怎么使用?有什么特点?
    • 33. Iterator 和 ListIterator 有什么区别?
    • 34. 怎么确保一个集合不能被修改?
  • 多线程
    • 35. 并行和并发有什么区别?
    • 36. 线程和进程的区别?
    • 37. 守护线程是什么?
    • 38. 创建线程有哪几种方式?
    • 39. 说一下 runnable 和 callable 有什么区别?
    • 40. 线程有哪些状态?
    • 41. sleep() 和 wait() 有什么区别?
    • 42. notify()和 notifyAll()有什么区别?
    • 43. 线程的 run()和 start()有什么区别?
    • 44. 创建线程池有哪几种方式?
    • 45. 线程池都有哪些状态?
    • 46. 线程池中 submit()和 execute()方法有什么区别?
    • 47. 在 Java 程序中怎么保证多线程的运行安全?
    • 48. 多线程锁的升级原理是什么?
    • 49. 什么是死锁?
    • 50. 怎么防止死锁?
    • 51. ThreadLocal 是什么?有哪些使用场景?
    • 52. 说一下 Synchronized 底层实现原理?
    • 53. Synchronized 和 volatile 的区别是什么?
    • 54. Synchronized 和 Lock 有什么区别?
    • 55. Synchronized 和 ReentrantLock 区别是什么?
    • 56. 说一下 Atomic 的原理?
  • 反射
    • 1. 什么是反射?
    • 58. 什么是 Java 序列化?什么情况下需要序列化?
    • 59. 动态代理是什么?有哪些应用?
    • 60. 怎么实现动态代理?
  • 对象拷贝
    • 61. 为什么要使用克隆?
    • 62. 如何实现对象克隆?
    • 63. 深拷贝和浅拷贝区别是什么?
  • Java Web
    • 64. JSP 和 servlet 有什么区别?
    • 65. JSP 有哪些内置对象?作用分别是什么?
    • 66. 说一下 JSP 的 4 种作用域?
    • 67. Session 和 Cookie 有什么区别?
    • 68. 说一下 Session 的工作原理?
    • 69. 如果客户端禁止 Cookie 能实现 Session 还能用吗?
    • 70. Spring MVC 和 Struts 的区别是什么?
    • 71. 如何避免 SQL 注入?
    • 72. 什么是 XSS 攻击,如何避免?
    • 73. 什么是 CSRF 攻击,如何避免?
    • 74. throw 和 throws 的区别?
    • 75. final、finally、finalize 有什么区别?
    • 76. try-catch-finally 中哪个部分可以省略?
    • 77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
    • 78. 常见的异常类有哪些?
  • 网络
    • 79. HTTP 响应码 301 和 302 代表的是什么?有什么区别?
    • 80. forward 和 redirect 的区别?
    • 81. 简述 TCP 和 UDP 的区别?
    • 82. TCP 为什么要三次握手,两次不行吗?为什么?
    • 83. 说一下 TCP 粘包是怎么产生的?
    • 84. OSI 的七层模型都有哪些?
    • 85. Get和 Post 请求有哪些区别?
    • 86. 如何实现跨域?
    • 87. 说一下 JSONP 实现原理?
  • 设计模式
    • 88. 说一下你熟悉的设计模式?
    • 89. 简单工厂和抽象工厂有什么区别?
  • Spring/Spring MVC
    • 90. 为什么要使用 Spring?
    • 91. 解释一下什么是 AOP?
    • 92. 解释一下什么是 IOC?
    • 93. Spring 有哪些主要模块?
    • 94. Spring 常用的注入方式有哪些?
    • 95. Spring 中的 Bean 是线程安全的吗?
    • 96. Spring 支持几种 Bean 的作用域?
    • 97. Spring 自动装配 Bean 有哪些方式?
    • 98. Spring 事务实现方式有哪些?
    • 99. 说一下 Spring 的事务隔离?
    • 100. 说一下 Spring MVC 运行流程?
    • 101. Spring MVC 有哪些组件?
    • 102. @RequestMapping 的作用是什么?
    • 103. @Data 的作用是什么?
  • Spring Boot/Spring Cloud
    • 104. 什么是 Spring Boot?
    • 105. 为什么要用 Spring Boot?
    • 106. Spring Boot 核心配置文件是什么?
    • 107. Spring Boot 配置文件有哪几种类型?它们有什么区别?
    • 108. Spring Boot 有哪些方式可以实现热部署?
    • 109. JPA 和 Hibernate 有什么区别?
    • 110. 什么是 Spring Cloud?
    • 111. Spring Cloud 断路器的作用是什么?
    • 1. Spring Cloud 的核心组件有哪些?
  • Hibernate
    • 1. 为什么要使用 Hibernate?
    • 2. 什么是 ORM 框架?
    • 3. Hibernate 中如何在控制台查看打印的 SQL 语句?
    • 4. Hibernate 有几种查询方式?
    • 5. Hibernate 实体类可以被定义为 final 吗?
    • 6. 在 Hibernate 中使用 Integer 和 int 做映射有什么区别?
    • 7. Hibernate 是如何工作的?
    • 8. get()和 load()的区别?
    • 9. 说一下 Hibernate 的缓存机制?
    • 10. Hibernate 对象有哪些状态?
    • 11. 在 Hibernate 中 getCurrentSession 和 openSession 的区别是什么?
    • 12. Hibernate 实体类必须要有无参构造函数吗?为什么?
  • Mybatis
    • 1. Mybatis 中 #{}和 ${}的区别是什么?
    • 126. Mybatis 有几种分页方式?
    • 127. RowBounds 是一次性查询全部结果吗?为什么?
    • 128. Mybatis 逻辑分页和物理分页的区别是什么?
    • 129. Mybatis 是否支持延迟加载?延迟加载的原理是什么?
    • 130. 说一下 Mybatis 的一级缓存和二级缓存?
    • 131. Mybatis 和 Hibernate 的区别有哪些?
    • 132. Mybatis 有哪些执行器(Executor)?
    • 133. Mybatis 分页插件的实现原理是什么?
    • 134. Mybatis 如何编写一个自定义插件?
  • RabbitMQ
    • 135. RabbitMQ 的使用场景有哪些?
    • 136. RabbitMQ 有哪些重要的角色?
    • 137. RabbitMQ 有哪些重要的组件?
    • 138. RabbitMQ 中 VHost 的作用是什么?
    • 139. RabbitMQ 的消息是怎么发送的?
    • 140. RabbitMQ 怎么保证消息的稳定性?
    • 141. RabbitMQ 怎么避免消息丢失?
    • 142. 要保证消息持久化成功的条件有哪些?
    • 143. RabbitMQ 持久化有什么特点?
    • 144. RabbitMQ 有几种广播类型?
    • 145. RabbitMQ 怎么实现延迟消息队列?
    • 146. RabbitMQ 集群有什么用?
    • 147. RabbitMQ 节点的类型有哪些?
    • 148. RabbitMQ 集群搭建需要注意哪些问题?
    • 149. RabbitMQ 每个节点是其他节点的完整拷贝吗?为什么?
    • 150. RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?
    • 151. RabbitMQ 对集群节点停止顺序有要求吗?
  • Kafka
    • 152. Kafka 可以脱离 ZooKeeper 单独使用吗?为什么?
    • 153. Kafka 有几种数据保留的策略?
    • 154. Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?
    • 155. 什么情况会导致 Kafka 运行变慢?
    • 156. 使用 Kafka 集群需要注意什么?
  • ZooKeeper
    • 157. ZooKeeper 是什么?
    • 158. ZooKeeper 都有哪些功能?
    • 159. ZooKeeper 有几种部署模式?
    • 160. ZooKeeper 怎么保证主从节点的状态同步?
    • 161. 集群中为什么要有主节点?
    • 162. 集群中有 3 台服务器,其中一个节点宕机,这个时候 ZooKeeper 还可以使用吗?
    • 163. 说一下 ZooKeeper 的通知机制?
  • MySQL
    • 164. 数据库的三范式是什么?
    • 165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 ID 是几?
    • 166. 如何获取当前数据库版本?
    • 167. 说一下 ACID 是什么?
    • 168. Char 和 VarChar 的区别是什么?
    • 169. Float 和 Double 的区别是什么?
    • 170. MySQL 的内连接、左连接、右连接有什么区别?
    • 171. MySQL索引是怎么实现的?
    • 172. 怎么验证 MySQL的索引是否满足需求?
    • 173. 说一下数据库的事务隔离?
    • 174. 说一下 MySQL常用的引擎?
    • 175. 说一下 MySQL的行锁和表锁?
    • 176. 说一下乐观锁和悲观锁?
    • 177. MySQL问题排查都有哪些手段?
    • 178. 如何做 MySQL的性能优化?
  • Redis
    • 179. Redis 是什么?都有哪些使用场景?
    • 180. Redis 有哪些功能?
    • 181. Redis 和 MemeCache 有什么区别?
    • 182. Redis 为什么是单线程的?
    • 183. 什么是缓存穿透?怎么解决?
    • 184. Redis 支持的数据类型有哪些?
    • 185. Redis 支持的 Java 客户端都有哪些?
    • 186. Jedis 和 Redisson 有哪些区别?
    • 187. 怎么保证缓存和数据库数据的一致性?
    • 188. Redis 持久化有几种方式?
    • 189. Redis 怎么实现分布式锁?
    • 190. Redis 分布式锁有什么缺陷?
    • 191. Redis 如何做内存优化?
    • 192. Redis 淘汰策略有哪些?
    • 193. Redis 常见的性能问题有哪些?该如何解决?
  • JVM
    • 194. 说一下 JVM 的主要组成部分?及其作用?
    • 1. 说一下 JVM 运行时数据区?
    • 2. 说一下堆栈的区别?
    • 3. 队列和栈是什么?有什么区别?
    • 4. 什么是双亲委派模型?
    • 5. 说一下类加载的执行过程?
    • 6. 怎么判断对象是否可以被回收?
    • 7. Java 中都有哪些引用类型?
    • 8. 说一下 JVM 有哪些垃圾回收算法?
    • 9. 说一下 JVM 有哪些垃圾回收器?
    • 10. 详细介绍一下 CMS 垃圾回收器?
    • 11. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
    • 206. 简述分代垃圾回收器是怎么工作的?
    • 207. 说一下 JVM 调优的工具?
    • 208. 常用的 JVM 调优的参数都有哪些?
  • 杂七杂八
    • 209. a = a + b 和 a += b 的区别?

Java 基础

1. JDK 和 JRE 有什么区别?

jre是java运行环境的意思,包含java虚拟机和java类库,是使用java语言编写程序是所需要的软件环境
jdk是java开发工具包,是程序员使用java语言编写java程序时所用到的开发包
可以总结一句话,jdk和jre,一个用于开发一个用于运行

2. == 和 equals 的区别是什么?

==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址
equals是一个方法,只能比较引用数据类型,重写前比较的是地址值,重写后比较的是属性的值

3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不一定为true。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。

4. final 在 Java 中有什么作用?

用于装饰类,类属性,类方法
对于被final修饰的类属性而言,子类就不能给它重新赋值,如果重新赋值,会报错

5. Java 中的 Math.round(-1.5) 等于多少?

-1

6. String 属于基础的数据类型吗?

不是, String是一个对象
基础的数据类型有
int,short,long,char,boolean,float,double,byte,
对应的基本类型的包装类:
Integer,Short,Long,Character,Float,Double,Byte

7. Java 中操作字符串都有哪些类?它们之间有什么区别?

String字符串的各种操作:
1)获取  length,charAt,indexOf
2)判断  contains,isEmpty,startsWith,endsWith,equals
3)  转换  copyValueOf
4)替换 replace
5)切割  split
6)子串  subString
7)转换,去空隔,比较  toUpperCase,trim,顺序比较

8. String str="i"与 String str=new String(“i”)一样吗?

不一样,前一个是常量,后者又重新new了一个对象,内存空间不一样

9. 如何将字符串反转?

1)递归方法
2)通过charAt返回char进行字符串的拼接
3) 将字符串转换成字符数组倒叙拼接然后返回值
4)调用StringBuffer中的reverse StringBuffer(s).reverse().toString()
5)把字符串转换成字符数组首位对调位置

10. String 类的常用方法都有那些?

equals,length,concat,charAt,substring,codePointAt,indexOf。。。。。。

11. 抽象类必须要有抽象方法吗?

抽象类不一定要有抽象方法但有抽象方法的类一定是抽象类

12. 普通类和抽象类有哪些区别?

1)抽象类不能被实例化
2)抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态
3)抽象方法只需声明,无需实现,可以允许普通方法有主体
4)含抽象方法的类必须声明为抽象类
5)抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类

13. 抽象类能使用 final 修饰吗?

final关键字不能用来修饰抽象类额接口

14. 接口和抽象类有什么区别?

1)抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
2)抽象类要被子类继承,接口要被类实现
3)接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
5)抽象类中的抽象方法必须全部被子类实现,如果子类不能实现全部父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如果不能全部实现接口方法,那么该类也只能为抽象类
6)抽象方法只能申明,不能实现,接口是设计的结果,抽象类是重构的接果
7)抽象类里可以没有抽象的方法
8) 如果一个类里又抽象方法,那么这个类只能是抽象类
9)抽象方法要被实现,不能是静态的,也不能是私有的
10)接口可以继承接口,并可多继承接口,但类只能单根继承

15. Java 中 IO 流分为几种?

根据处理数据类型不同:字符流和字节流
根据数据流向不同:输入流和输出流

16. BIO、NIO、AIO 有什么区别?

BIO和NIO是两种不同的网络通信模型,如今NIO已经大量应用再Jetty、zookeeper、Netty等开源框架中
BIO适用于连接数目比较小,并且一次发送大量数据的场景,这种方式对服务器资源要求比较高,并发局限于应用中
NIO服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据。
BIO:同步阻塞 NIO:同步非阻塞 AIO异步非阻塞

17. Files的常用方法都有哪些?

创建:createNewFile,mkdir,mdirs
删除:delete,deleteOnExit
判断:exists,isFile,isDirectory,isHidden,isAbsolute
获取:getName,getAbsolutePath,length,getParent,lastModified
文件夹相关 startic File

容器

18. Java 容器都有哪些?

 数组,String,java.util下的集合容器

19. Collection 和 Collections 有什么区别?

 java.util.collection是一个集合接口,提供对集合对象进行基本操作的通用接口的方法Collections是集合类的一个工具类(辅助类),提供一系列的静态方法,用于对集合中的元素进行排序、搜索以及线程安全各项操作。

20. List、Set、Map 之间的区别是什么?

 list:有序可以重复,可以插入多个null元素Set:无序不可以重复,只允许有一个null元素map:不是collection的子接口或者实现类,推行键值对,一个key一个value

21. HashMap 和 Hashtable 有什么区别?

 1)HashMap和HashTable都实现了map的接口,主要区别在于线程安全性、同步以及速度2)Hashmap是非同步的,而hashtable是同步的,意味着哈市table是线程安全的,多个线程可以共享一个hashtable3)Hashmap的迭代器是fail-fast迭代器,而hashTable不是4)Hashtable在单线程的环境下要比hashmap要慢;如果不需要同步,在单线程环境下,使用hashmap性能比hashtable好5)Hashmap不能保证随着时间的推移map中的元素次序是不变的

22. 如何决定使用 HashMap 还是 TreeMap?

 Hashmap通过hascode对其内容进行查找,TreeMap所有的元素都保持某种固定的顺序,

23. 说一下 HashMap 的实现原理?

  HashMap由数据和链表组成,数组是hashmap的主体,链表主要是解决哈希冲突而存在的,如果定位到的数组位置不含链表,那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为o,首先遍历链表,存在即覆盖;对于查找操作来讲,还需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMAp中的链表出现越少,性能才会越好。1 HashMap由数据和链表组成2 链表主要是解决哈希冲突而存在的 对于查找,添加等操作很快3 通过key对象的equals方法逐一比对查找,HashMAp中的链表出现越少,性能才会越好

24. 说一下 HashSet 的实现原理?

 iterator:返回对此set中元素进行迭代的迭代器size:返回此set中元素的数量(set的容量)isEmpty:判断Hashset集合是否为空contains:判断某个元素是否存在于HashSet中add():如果此set中尚未包含指定元素,则添加指定元素

25. ArrayList 和 LinkedList 的区别是什么?

 ArrayList使用了数组的实现,封装了对内部数组的操作linkedList使用了循环双向链表数据结构

26. 如何实现数组和 List 之间的转换?

 list转数组:toArray(arraylist.size)方法数组转list:Arrays的asList(a)的方法

27. ArrayList 和 Vector 的区别是什么?

 1)Vector的方法都是同步的,是线程安全的,而ArrayList的方法不是,由于线程同步必然影响性能,因此,ArrayList的性能比Vector好2)当Vector或ArrayList的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。1 Vector的方法都是同步的,是线程安全的 ArrayList的方法不是2 Vector会将它的容量翻倍,ArrayList只增加50%的大小

28. Array 和 ArrayList 有何区别?

 1)ArrayList是Array的复杂版本2)ArrayList可以存储异构对象,而Array只能存储相同类型的数据 [1,a,true] [1,2,3,4]3)Array的长度实际上是不可变的,二维变长数组实际上的长度也是固定的,可变的是其中元素的长度而ArrayList的长度可以指定也可以不指定,是变长的4)存取和增删的不同

29. 在 Queue 中 poll()和 remove()有什么区别?

 remove和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛出异常,而poll方法将返回null

30. 哪些集合类是线程安全的?

 Vector,HashTable,ConcurrentHashMap,Stack

31. 迭代器 Iterator 是什么?

 为各种容器提供了公共的操作接口,使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果。

32. Iterator 怎么使用?有什么特点?

  Iterator的常用方法:1.boolean hasNext()2.Object next()3.void remove()4.void forEachRemaining(Consumer action)Iterator的特点:遍历过程:1.不允许线程对集合元素进行修改,否则会抛出异常2.可以通过remove方法来移除集合中的元素3.Iterator必须依附某个Collection对象而存在,本身不具有装载数据对象的功能4.Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象5.强调以下next()方法,该方法通过游标指向的形式返回Iterator下一个元素

33. Iterator 和 ListIterator 有什么区别?

     1.iterator()方法在set和list接口中都有定义,但li's'tIterator()仅存在于list接口中(或者实现类中)2.listIterator有add()方法,可以向list中添加对象,而Iterator不能3.两个都有hasNext()和next()方法,可以实现顺序向后遍历,但listIterator有hasPrevious()和previous()方法,可以实现逆向遍历,Iterator就不可以。4.listIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现,Iterator没有此功能5.都可以实现删除对象,但listIterator可以实现对象的修改,set方法可以实现,Iterator仅能遍历,不可以修改

34. 怎么确保一个集合不能被修改?

 将参数中的List返回一个不可修改的List

多线程

35. 并行和并发有什么区别?

 并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理并行:指应用能够同时执行不同的任务。

36. 线程和进程的区别?

 主要区别在于它们是不同的操作系统资源管理方式。1)一个程序至少有一个进程,一个进程至少有一个线程2)线程的划分尺度小于进程,使得多线程程序的并发性高3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而大大地提高了程序的运行效率4)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能够独立执行,必须依存于应用程序中,由应用程序提供多个线程执行控制。5)多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。

37. 守护线程是什么?

  守护线程,是一个服务线程,准确的来说是服务其他的线程,另一个线程是用户线程守护线程如垃圾回收线程用户线程就是应用程序里的自定义线程

38. 创建线程有哪几种方式?

 继承Thread类实现runable接口

39. 说一下 runnable 和 callable 有什么区别?

 最大的不同点:实现Callable接口的任务线程能返回执行结果,而实现runable接口的任务线程不能返回结果Callable接口的call()方法允许抛出异常,而Runable接口的run()方法的异常只能在内部消化,不能继续上抛.

40. 线程有哪些状态?

 1.新建状态2.就绪状态3.运行状态4.阻塞状态5.死亡状态

41. sleep() 和 wait() 有什么区别?

对于sleep()方法,是属于Thread类,而wait()方法属于Object类
调用sleep()方法时,线程不会释放对象锁,而调用wait()方法时,线程会放弃对象锁,进入此对象的等待锁定池,只有针对此对象调用nofity()方法后本线程才进入对象锁定池准备

42. notify()和 notifyAll()有什么区别?

 notifyAll():唤醒所有wait线程    notify:只随机唤醒一个wait线程

43. 线程的 run()和 start()有什么区别?

 run()相当于线程的任务处理逻辑入口方法,由java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用
start()的作用是启动相应的线程。start()调用结束并不表示相应的线程已经开始,这个线程可能稍后运行,也有可能永远也不会运行

44. 创建线程池有哪几种方式?

1.newCachedThreadPool
2.newFixedThreadPool
3.newSingleThreadExecutor
4.newSingleThreadScheduledExecutor和newScheduledThreadPool(int corePoolSize)
5.newWorkStealingPool

45. 线程池都有哪些状态?

Running、ShutDown、Stop、Tidying、Terminated

46. 线程池中 submit()和 execute()方法有什么区别?

1.接收的参数不一样
2.submit有返回值,而execute没有
3.submit方便Exception处理

47. 在 Java 程序中怎么保证多线程的运行安全?

线程的安全性体现在三个方面:原子性,可见性,有序性

48. 多线程锁的升级原理是什么?

在java中锁共有4种状态,由低到高依次为无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况升级。锁可以升级但不能降级。

49. 什么是死锁?

指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

50. 怎么防止死锁?

1.加锁顺序 2.加锁时限 3.死锁检测

51. ThreadLocal 是什么?有哪些使用场景?

ThreadLocal叫做线程本地变量,也有叫做线程本地存储,即为变量在每个线程中创建了一个副本,每个线程可以访问自己内部的副本变量
最常见的ThreadLocal使用场景为用来解决数据库连接、session管理等

52. 说一下 Synchronized 底层实现原理?

方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。jvm可以从方法常量池中的方法表结构中的ACC_SYNCHRONIZED访问标志区分一个方法是否是同步方法。当方法调用时,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线程将先持有monitor,然后再执行方法,最后在方法完成时释放monitor。在方法执行期间,执行线程持有了monitor,其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。
1.同步 过字节码指令来控制
2.jvm 从方法常量池中 访问标志区分一个方法是否是同步方法 调用指令 检查方法的ACC_SYNCHRONIZED访问标志是否被设置
3.获取锁,其他线程无法获取锁

53. Synchronized 和 volatile 的区别是什么?

  • volatile本质是在告诉Jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞
    *volatile仅能使用在变量级别;synchronized则可以使用在变量、方法和类级别的
    *volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
    *volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞
    *volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

54. Synchronized 和 Lock 有什么区别?

*首先synchronized是java内置关键字,在jvm层面,lock是个java类
*synchronized无法判断是否获取锁的状态,lock可以判断是否获取到锁
*synchronized会自动释放锁,lock需在finally中手工释放锁,否则容易造成线程死锁
*用sychronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2等待。如果线程1阻塞,线程2会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了
*synchronized的锁可重入、不可中断、非公平,而Lock锁皆可实行
*Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题

55. Synchronized 和 ReentrantLock 区别是什么?

这两种方式最大区别就是对于Synchronized来说他是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而reemntrantLock它是jDK1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。

56. 说一下 Atomic 的原理?

使用atomic修饰属性,编译器会设置默认读写方法为原子读写,并使用互斥锁添加保护。

反射

1. 什么是反射?

指运行中的程序检查自己和软件运行环境的能力,他可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

58. 什么是 Java 序列化?什么情况下需要序列化?

是一种用来处理对象流的机制,对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络中传输。
情况:1.对象序列化可以实现分布式对象
2.java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每一个对象的数据

59. 动态代理是什么?有哪些应用?

   当想要给实现了某个接口的类中的方法,加一些额外的处理,比如加日志,加事务,加权限,Spring的AOP等。

60. 怎么实现动态代理?

    首先必须定义一个接口,还要有一个InvocationHandler处理类。再有一个工具类Proxy。利用到InvacationHandler,并接代理类源码,将其编译生成代理类的二进制码,利用机器加载,并将其实例化产生代理对象,最后返回

对象拷贝

61. 为什么要使用克隆?

 想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了。

62. 如何实现对象克隆?

 两种不同的克隆方式,浅克隆(ShallowClone)和深克隆(DeepClone)两种方式:实现Cloneable接口并重写object类中的clone()方法实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

63. 深拷贝和浅拷贝区别是什么?

 浅克隆只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝

Java Web

64. JSP 和 servlet 有什么区别?

 jsp的本质是servlet,jvm只能识别java类,不能识别jsp的代码,web容器将jsp的代码编译成jvm额能够识别的java类jsp更擅长表现于页面显示,servlet更擅长于逻辑控制Servlet中没有内置对象,jsp的内置对象都是通过HTTPServletRequest对象,HttpServletREsponse对象以及HttpServlet对象得到的jsp是Servlet的一种简化,使用jsp只需完成程序员需要输出到客户端的内容,jsp中的java脚本如何镶嵌到一个类中,youjsp容器完成

65. JSP 有哪些内置对象?作用分别是什么?

 page:指的是JSP被翻译成Servlet的对象的引用pageContext:对象可以用来获得其他8个内置对象,还可以作为Jsp的域范围对象使用request:代表的是请求对象,可以用于获得客户机的信息,也可以作为域对象使用,使用request保存的数据在一次请求范围内有效Session:代表的是一次会话,可以用来保存用户的私有信息,也可以作为域对象使用,使用session保存的数据在一次会话范围有效Application:代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效Response:是响应对象,代表的是从服务器向浏览器响应数据Out:jspWrite是用于向页面输出内容的对象Config:指的是ServletConfig用于JSP翻译成Servlet后获得Servlet的配置的对象Exception:在页面设置isErrorPage=“true”,即可使用,是Throwable的引用,用来获得页面错误的信息

66. 说一下 JSP 的 4 种作用域?

 page,request,session,application

67. Session 和 Cookie 有什么区别?

  1.Cookie以文本文件格式存储在浏览器中,而session存储在服务器端它存储了限制数据量。它只允许4kb他没有在cookie中保存多个变量2.cookie的存储限制了数据量,只允许4kb,而session是无限量的3.我们可以轻松地访问cookie值但是我们无法轻松访问会话值,因此它更安全4.设置cookie时间可以使cookie过期,但是使用session-destory(),将会销毁会话

68. 说一下 Session 的工作原理?

  当打开浏览器到关闭浏览器,这一期间称为一个会话,也就是一个session,是保存在服务器端的,每当客户端请求页面时,服务器就会自动分配一个ID来唯一识别这个用户。一般不用session来保存大量的数据,这样会占用大量的资源。

69. 如果客户端禁止 Cookie 能实现 Session 还能用吗?

  在Asp中,Session必须依赖Cookie才可用,session是存储在服务器端的,而Cookie是存储在客户端的,相对而言,session的那全性和可靠性程度都比cookie高在Php中通过相关额配置,可以让session不依赖Cookie而存在

70. Spring MVC 和 Struts 的区别是什么?

1.底层实现机制:struts2是filter springmvc是servlet
2.运行效率:struts2底层是Servlet,参数基于属性封装,如果配置单例,会出现线程安全问题,所以配置多例
springmvc底层是servlet,单例
3.参数封装:struts2基于属性封装
springMvc基于方法进行封装

71. 如何避免 SQL 注入?

               1.检查变量数据类型和格式2.过滤特殊字符3.绑定变量,使用预编译语句总结:使用预编译绑定变量的sql语句严格加密处理用户的机密信息不要随意开启生产环境中的webserver的错误信息使用正则表达式过滤传入的参数字符串过滤检查是否包含非法字

72. 什么是 XSS 攻击,如何避免?

即跨站脚本攻击,是一种常见于web应用于web应用程序中的计算机安全漏洞
1.获取用户输入,不用.innerHtml,用innerText
2.对用户输入进行过滤,如HtmlEncode函数实现应该至少进行&<>"’/等符号转义成&It&gt&quot&#x27&#x2F

73. 什么是 CSRF 攻击,如何避免?

即跨站请求伪造
1.请求令牌
2.token验证
3.配置angular提交表头
4.再次测试跨域post
异常

74. throw 和 throws 的区别?

 1.throw是在代码块内的,即在捕获方法内的异常并抛出时用的
try{} cacth(Exce e){ throw new Exc()}2.throws是针对方法的,即将方法的异常信息抛出去
void main() throws Ex3.可以理解为throw是主动的,而throws是被动的

75. final、finally、finalize 有什么区别?

 final:用来修饰类,方法和变量finally:作为异常的处理部分,只能在try/catch语句中,表示这段语句最终一定会被执行finalize:是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法,该对象被回收时被调用。

76. try-catch-finally 中哪个部分可以省略?

 try语句后面必须要有一个别的语句跟在后面,如try-catch,try-finally,try-catch-finally

77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

 会执行,在return前执行

78. 常见的异常类有哪些?

  IOEException、RunntimeException、ArrayIndexOUtOfBoundsException、NullpointerException

网络

79. HTTP 响应码 301 和 302 代表的是什么?有什么区别?

 301,302都是Http状态的编码,都代表着某个URL发生了转移区别:    301 redirect:代表永久性转移302 redirect:代表暂时性转移

80. forward 和 redirect 的区别?

  代表了两种请求转发方式:直接转发(forward)和间接转发(redirect)举例:直接:A找B借钱,B说没有,B去找C借,借到借不到都会把信息传递给A简接:A找B借钱,B说没有,让A去找C借

81. 简述 TCP 和 UDP 的区别?

  1.基于连接与无连接2.对于系统资源的要求(TCP较多,UDP少)3.UDP程序结构较为简单4.流模式与数据包模式5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证

82. TCP 为什么要三次握手,两次不行吗?为什么?

  不行,因为为了防止已失效的连接请求又传送到服务器端,因而产生错误

83. 说一下 TCP 粘包是怎么产生的?

 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包接收数据端的应用层没有及时读取接收缓冲区中的数据,将会发生粘包

84. OSI 的七层模型都有哪些?

 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层

85. Get和 Post 请求有哪些区别?

 Get:从指定的资源请求数据post:向指定的资源提交要被处理的数据

86. 如何实现跨域?

 1.图片ping或script标签跨域2.JSONP跨域3.CORS4.window.name+iframe5.window.postMessage()6.修改document.domain跨子域7.WebSocket8.代理

87. 说一下 JSONP 实现原理?

  浏览器只对XHR请求有同源请求限制,而对script标签src属性、link标签ref属性和img标签src属性没有这种限制,利用这个“漏洞”就可以很好的解决跨域请求。JSONP就是利用了script标签无同源限制的特点来实现的,当向第三方站点请求时,我们可以将此请求放在<script>标签的src属性里,这就如同我们请求一个普通的JS脚本,可以自由的向不同的站点请求。

设计模式

88. 说一下你熟悉的设计模式?

      工厂方法模式,抽象工厂模式,单例工模式

89. 简单工厂和抽象工厂有什么区别?

      简单工厂就是一个专门生产某个产品的类抽象工厂不仅生产鼠标,同时生产键盘

Spring/Spring MVC

90. 为什么要使用 Spring?

  Spring带来了它的两大特征AOP和IOC,如果没有Spring,我们不得不在使用每一个类之前,实例化一个对象。当然我们可以用工厂方法来做这件事,就可以集中管理并且让调用者和被调用者之间的耦合松散。于是需要大量的工厂类,并且在增加或者改变接口实现的时候,还需要对工厂进行调整。而Spring就像一个大工厂一样,使用了大量的反射机制来生成需要实例的对象。除此以外Spring还带来了强大的代理,我们使用的每一个注入的对象都是经过代理的增强对象,同时可以使用aop包来定义一些与业务逻辑不相关的切面。增强功能模块的内聚,拆分功能模块和非业务模块。而Aop又是建立在IOP基础上,因此如果没有Spring,功能模块和非功能模块混在一起,导致逻辑混乱不清晰。

91. 解释一下什么是 AOP?

  面向切面编程,可以说是OOP的补充与完善。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建方面,从而使得编译器可以在编译期间织入有关方面的代码

92. 解释一下什么是 IOC?

 控制反转,即借助于第三方实现具有依赖关系的对象之间的解耦

93. Spring 有哪些主要模块?

 七大功能模块:一、Spring Core:Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Spring的所有功能都是借助IOC实现的。二、AOP:是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置三、ORM:提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,mybatis,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架可进                   行封装,并对其进行管理。四、DAO:Spring提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事务,并不对JDBC进行实现。五、MVC:WebMVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框                   架更加简洁和方便。六、WEB:常见的框架如Struts1,struts2,jsf的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器七、Context:提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。

94. Spring 常用的注入方式有哪些?

  构造方法的注入、setter注入、基于注解的注入

95. Spring 中的 Bean 是线程安全的吗?

  Spring容器本身并没有提供Bean的线程安全策略对于线程安全问题,要从原型和单例分别说明:对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然不会有线程安全的问题对于单例Bean,如果单例Bean是一个无状态的Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。

对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法

96. Spring 支持几种 Bean 的作用域?

   singleton:单例模式,在整个Spring  ioc容器中,使用singleton定义的Bean将只有一个实例prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,将会产生一个新的Bean实例request:对于每次HTTP 请求,使用request定义的bean都将会产生一个新实例session:对于每次HTTP Session,使用session定义的bean都将产生一个新实例globalsession:每一个全局的HTTP Session,使用session定义的bean都将产生一个新实例

97. Spring 自动装配 Bean 有哪些方式?

 使用XML配置自动装配Bean、使用@Autowired和@Resource注解来自动装配Bean

98. Spring 事务实现方式有哪些?

 1)编程式事务管理对基于POJO的应用来说是唯一选择2)基于TransactionProxyFactoryBean的声明式事务管理3)基于@Transactional的声明式事务管理4)基于Aspectj AOP配置事务

99. 说一下 Spring 的事务隔离?

  在一个典型的应用程序中,多个事务同时进行,经常会为了完成他们的工作而操作同一个数据。并发虽然是必须的,但会导致脏读,不可重复读和幻影读在理想状态下,事务之间将完全隔离,从而防止这些问题的发生。然而,完全隔离会影响性能,因为隔离经常牵扯到锁定在数据库中的记录

100. 说一下 Spring MVC 运行流程?

   1)用户发送请求到DispatchServlet2)DispatchServlet根据请求路径查询具体的Handler3)HandlerMapping返回一个HandlerExcutionChain给DispatchServlet4)DispatchServlet调用HandlerAdapter适配器5)HandlerAdapter调用具体的Handler处理业务6)Handler处理结束返回一个具体的ModelAndView给适配器7)适配器将ModelAndView给DispatchServlet8)DispatchServlet把视图名称给viewResolver视图解析器9)viewREsource返回一个具体的视图给DispatchServlet10)渲染视图11)展示给用户

101. Spring MVC 有哪些组件?

  Handlermapping、HandlerAdapter、HandlerExceptionREsolver、viewResolver、RequestToViewNameTranslator、LocalResolver、ThemeResolver、MultipartResolver、FlashMapManager

102. @RequestMapping 的作用是什么?

   用来处理请求地址映射的注解,可用于类和方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

103. @Data 的作用是什么?

 Spring可以自动帮你把Bean里面引用的对象的Setter/getter方法省略,它会自动帮你set/get

Spring Boot/Spring Cloud

104. 什么是 Spring Boot?

    Springboot是一个框架,一种全新的编程规范,它的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件,所有SpringBoot是一个服务于框架的框架,服务范围是简化配置文件

105. 为什么要用 Spring Boot?

    让文件配置变得相当简单、让应用部署变得简单,可以快速开启一个Web容器进行开发。

106. Spring Boot 核心配置文件是什么?

   bootstrap(.yml或者.properties)、application(.yml或者.properties)

107. Spring Boot 配置文件有哪几种类型?它们有什么区别?

  注解,获取Springboot的环境变量

108. Spring Boot 有哪些方式可以实现热部署?

  Spring LoadedSpring-boot-devtools

109. JPA 和 Hibernate 有什么区别?

   Hiberante是JPA规范的一个具体实现Hibrenate有jpa没有的特性Hinernate的效率更快JPA有更好的移植性,通用性

110. 什么是 Spring Cloud?

   Spring Cloud是一个微服务框架,相比Dubbo等RPC框架,Spring Cloud提供的全套的分布式系统的解决方案SpringCloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring  boot开发框架的集成Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性Token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式SpringCloud为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服务和构建应用、同时能够快速和云平台进行对接。

111. Spring Cloud 断路器的作用是什么?

   为了防止在分布式系统中出现这种瀑布似的连锁反应导致的灾难

1. Spring Cloud 的核心组件有哪些?

   服务发现---Netflix  EureKa客服端负载均衡---Netflix Ribbon断路器---Netflix   Hystrix服务网关---Netflix Zuul分布式配置---Spring Cloud Config

Hibernate

1. 为什么要使用 Hibernate?

   1)对JDBC访问数据库的代码进行了封装,大大简化了数据访问层繁琐的重复性代码2)Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度的简化了Dao层的编码工作3)hibrenate使用了java的反射机制,而不是字节码增强程序来实现透明性4)Hibrenate的性能非常好,因为它是一个轻量级的框架。映射的灵活性很出色,支持各种关系数据库,从一对多到多对多的各种复杂关系

2. 什么是 ORM 框架?

   通过描述对象和数据库之间的元数据,将程序的对象自动持久化到关系数据库中

3. Hibernate 中如何在控制台查看打印的 SQL 语句?

   使用application.properties配置文件,使用yml也可以达到同样的效果在jpa下一级不直接是hibernate,而是propertiesspring.jpa.properties.hibernate.show_sql=true     //控制台是否打印spring.jpa.properties.hibernate.format_sql=true    //格式化sql语句spring.jpa.properties.hibernate.use_sql_comments=true    //指出是什么操作生成了该语句

4. Hibernate 有几种查询方式?

       一、Hql查询二、QBC(Query by  Criteria)查询三、原生SQL查询

5. Hibernate 实体类可以被定义为 final 吗?

   可以是可以,但是这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为java不允许对final类进行扩展,所以Hibernate就无法再使用代理了。如此一来就限制了使用可以提升性能的手段。

6. 在 Hibernate 中使用 Integer 和 int 做映射有什么区别?

  1)返回数据库字段值是null的话,int的类型会报错2)通过jdbc将实体存储到数据库的操作通过sql语句,基本数据类型可以直接存储,对象需要序列化存储3)在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存

7. Hibernate 是如何工作的?

   1)读取并解析配置文件2)读取并解析映射信息,创建SessionFactory3)打开Session1) 创建事务Transation5)持久化操作6)提交事务7)关闭Session8)关闭SessionFactory

8. get()和 load()的区别?

  使用get()来根据ID进行单条查询,当get()方法被调用时就会发出SQL语句,并且返回的对象也是实际的对象当调用load()方法的时候会返回一个目标对象的代理对象,在这个代理对象中只存储了目标对象的iD值,只有当调用除ID值以外的属性值的时候才会发出SQL查询的

9. 说一下 Hibernate 的缓存机制?

   一级缓存就是session级别的缓存,在事务范围内有效,内置的不能被卸载。二级缓存是SessionFactory级别的缓存,从应用启动到应用结束有效。是可以选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。

10. Hibernate 对象有哪些状态?

    1)Transient 瞬时:对象刚new出来,还没设id,设了其他值2)Persistent 持久:调用了save()、saveOrUpdate(),就变成Persistent,有id3)Detached 脱管:当session close()完之后,变成了Detached

11. 在 Hibernate 中 getCurrentSession 和 openSession 的区别是什么?

    1)openSession从字面上可以看得出来,是打开一个新的session对象而且每次打开使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session2)getCurrentSession,从字面上可以就看得出来,是获取当前上下文一个session对象,当第一次使用此方法时会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession得区别之一,简单而言,getCurrentSession就是:如果有已经使用的,用旧的,如果没有,建新的。

12. Hibernate 实体类必须要有无参构造函数吗?为什么?

   肯定的。Hibernate框架会调用这个默认构造方法来构造实例对象,即Class类得newInstance方法,这个方法就是通过调用默认构造方法来创建实例对象当查询得时候返回得实体类是一个对象实例,是Hibernate动态通过反射生成得。反射的Class.forName("className").newInstance()需要对应的类提供一个无参构造方法,必须有个无参的构造方法将对象创建出来,单从Hibernate的角度讲,它是通过反射创建实体对象的,所以没有构造方法是不行的,另外Hibernate也可以通过有参的构造方法创建对象。

Mybatis

1. Mybatis 中 #{}和 ${}的区别是什么?

   1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

1. $将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
   2. #方式能够很大程度防止sql注入。
   4. 方 式 无 法 防 止 S q l 注 入 。 5. 方式无法防止Sql注入。 5. Sql5.方式一般用于传入数据库对象,例如传入表名.
  6.一般能用#的就别用$.

126. Mybatis 有几种分页方式?

    1.数组分页2.sql分页3.拦截器分页4.RowBounds分页

127. RowBounds 是一次性查询全部结果吗?为什么?

   不是,RowBounds在处理分页时,只是简单的把offer之前的数据都skip掉,超过limit之后的数据不取出

128. Mybatis 逻辑分页和物理分页的区别是什么?

   1.逻辑分页,内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量大的情况下,内存开销过大,容易内存溢出,不建议使用2.物理分页,内存开销比较小,在数据量比较小的情况下效率比逻辑分页还要低,在数据量很大的情况下,建议使用物理分页

129. Mybatis 是否支持延迟加载?延迟加载的原理是什么?

   支持。在mybatis中,延迟加载也是使用动态代理完成的,但在mybatis中被代理的对象不是one方而是many方本身,默认情况下一旦我访问了这个延迟加载对象任何一个属性,都会触发这个延迟加载对象的加载,这不是我们想要的结果,我们想要的是在需要dept的时候才去查询dept对象,去改变默认配置,使只有调用clone方法的时候才会触发完全加载

130. 说一下 Mybatis 的一级缓存和二级缓存?

   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能

131. Mybatis 和 Hibernate 的区别有哪些?

   1、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。                   2、Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。                   3、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

132. Mybatis 有哪些执行器(Executor)?

   SimpleExecutor、ReuseExecutor、BatchExecutor

133. Mybatis 分页插件的实现原理是什么?

   就是在StatementHandler之前进行拦截,对MappedStatement进行一系列的操作(大致就是拼上分页sql)

134. Mybatis 如何编写一个自定义插件?

   1. 编写Interceptor的实现类2. 使用@Intercepts注解完成插件签名 说明插件的拦截四大对象之一的哪一个对象的哪一个方法3. 将写好的插件注册到全局配置文件中

RabbitMQ

135. RabbitMQ 的使用场景有哪些?

   简单的发送与接收,没有特别的处理单发送多接收发布、订阅模式,发送端发送广播消息,多个接收端接收按路线发送接收按topics发送接收

136. RabbitMQ 有哪些重要的角色?

    management、policymaker、monitorng、administrator

137. RabbitMQ 有哪些重要的组件?

    Spring AMQPmessageExchange

138. RabbitMQ 中 VHost 的作用是什么?

    通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据

139. RabbitMQ 的消息是怎么发送的?

   举个例子,假如你想投递一封邮件,你可以将邮件投递到某个邮箱,然后邮递员从邮箱中获取邮件,并将邮件交付到接收方,在这个过程中,RabbitMQ就 类似于邮箱 、邮局和邮递员,RabbitMQ是一个消息队列,它可以接收程序发送的消息,然后放入到相应的消息队列中,另外一些程序可以从消息队列中获取数据,以此完成程序之间的通信

140. RabbitMQ 怎么保证消息的稳定性?

   1.publisher confirms(发布方确认)2.message持久化3.acknowledgement(consumer确认)

141. RabbitMQ 怎么避免消息丢失?

   将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。但依然解决不了小概率丢失事件的发生(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了),如果我们需要对这种小概率事件也要管理起来,那么我们要用到事务。

142. 要保证消息持久化成功的条件有哪些?

       为了长时间的存储和管理消息,一般会使用数据库。在Activemq中默认使用的是Derby DB。当然也可更改配置来使用其他的DB。如果要使用不在上面列表中的DB,可以通过配置SQL语句和JDBC驱动来支持自己的DB。Broker在启动的时候读取配置文件,若在配置文件中指定了特定的JDBC驱动,则会在classpath路径下自动检测配置的JDBC驱动

143. RabbitMQ 持久化有什么特点?

    消息的可靠性是RabbitMQ的一大特色,服务会把持久化的queue存放在硬盘上,当服务重启的时候,会重新什么之前被持久化的queue。队列是可以被持久化,但是里面的消息是否为持久化那还要看消息的持久化设置。也就是说,重启之前那个queue里面还没有发出去的消息的话,重启之后那队列里面是不是还存在原来的消息,这个就要取决于发生着在发送消息时对消息的设置了。

如果要在重启后保持消息的持久化必须设置消息是持久化的标识。

144. RabbitMQ 有几种广播类型?

 1.fanout广播模式2.direct广播模式:能选择性的发送接收消息,在终端运行并输入参数3.Topic细致的消息过滤广播模式

145. RabbitMQ 怎么实现延迟消息队列?

   延迟任务通过消息的TTL和Dead letter Exchange来实现。我们需要建立2个队列,一个用于发送消息,一个用于消息过期后的转发目标队列。第一步,首先需要创建2个队列。第二步,实现消息的Producer。第三步,实现消息的Consumer。

146. RabbitMQ 集群有什么用?

    一个rabbitmq集群中可以共享user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的,一个例外是,那些当前只属于创建它的节点的消息队列,尽管它们可见且可被所有节点读取。rabbitmq节点可以动态的加入到集群中,一个节点它可以加入到集群中,也可以从集群环集群会进行一个基本的负载均衡。

147. RabbitMQ 节点的类型有哪些?

   内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘

148. RabbitMQ 集群搭建需要注意哪些问题?

   每个节点Cookie的同步;主机之间 必须可以相互识别并可达,/etc/hosts文件配置必须准确

149. RabbitMQ 每个节点是其他节点的完整拷贝吗?为什么?

   不是,队列的完整信息只放在一个节点,其他节点存放的是该队列的指针

150. RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?

    如果唯一的磁盘节点崩溃,集群是可以保持运行的,但不能更改任何东西。不能创建队列不能创建交换器不能创建绑定不能添加用户不能更改权限不能添加和删除集群几点

151. RabbitMQ 对集群节点停止顺序有要求吗?

     启动顺序:磁盘节点 => 内存节点关闭顺序:内存节点 => 磁盘节点

Kafka

152. Kafka 可以脱离 ZooKeeper 单独使用吗?为什么?

  不可以,kafka必须要依赖一个zookeeper集群才能运行。kafka系群里面各个broker都是通过zookeeper来同步topic列表以及其它broker列表的,一旦连不上zookeeper,kafka也就无法工作。

153. Kafka 有几种数据保留的策略?

  1)N天前的删除。2)保留最近的多少Size数据。

154. Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?

  Kafka Broker默认的消息保留策略是:要么保留一定时间,要么保留到消息达到一定大小的字节数  当消息达到设置的条件上限时,旧消息就会过期并被删除,所以在任何时刻,可用消息的总量都不会超过配置参数所指定的大小。

topic可以配置自己的保留策略,可以将消息保留到不再使用他们为止。因为在一个大文件里查找和删除消息是很费时的事,也容易出错,所以,分区被划分为若干个片段。默认情况下,每个片段包含1G或者一周的数据,以较小的那个为准。在broker往leader分区写入消息时,如果达到片段上限,就关闭当前文件,并打开一个新文件。当前正在写入数据的片段叫活跃片段。当所有片段都被写满时,会清除下一个分区片段的数据,如果配置的是7个片段,每天打开一个新片段,就会删除一个最老的片段,循环使用所有片段。

155. 什么情况会导致 Kafka 运行变慢?

 由于producer是线程安全的,所以采用单实例,但一次发送阻塞将会影响后续的数据处理

156. 使用 Kafka 集群需要注意什么?

  配置好zookeeper之后,关闭防火墙启动zk服务,在bin目录下三台依次启动

ZooKeeper

157. ZooKeeper 是什么?

   Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。Zookeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

158. ZooKeeper 都有哪些功能?

  配置维护、域名服务、分布式同步、组服务

159. ZooKeeper 有几种部署模式?

单机部署:一台集群上运行;
集群部署:多台集群运行;

伪集群部署:一台集群启动多个 zookeeper 实例运行。

160. ZooKeeper 怎么保证主从节点的状态同步?

  zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 zab 协议。 zab 协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab 就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态

161. 集群中为什么要有主节点?

 在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点

162. 集群中有 3 台服务器,其中一个节点宕机,这个时候 ZooKeeper 还可以使用吗?

   可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。

163. 说一下 ZooKeeper 的通知机制?

   客户端端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些客户端会收到 zookeeper 的通知,然后客户端可以根据 znode 变化来做出业务上的改变。

MySQL

164. 数据库的三范式是什么?

  第一:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。第二:如果关系模式R满足第一范式,并且R的所有非主属性都完全依赖于R的每一个候选关键属性,称为R满足第二范式,简记为2NF第三:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式。

165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 ID 是几?

  7-2+1=6

166. 如何获取当前数据库版本?

 一、在查询器中输入“Select@@Version”并运行,查看运行结果,对照便知版本二、运行SQL SERVER服务管理器,在任务栏小托盘处,右键单击管理器图标,选“关于”,在弹出的窗口中,对照信息便知三、在添加或删除程序中查看SQL SERVER的支持信息,可直接查看到版本号

167. 说一下 ACID 是什么?

  ACID是事务的四大特性:Atomicity:原子性现在对于一个事务来讲,要么一起执行成功要么一起失败,执行的过程是不能被打断或者执行其他操作的Consistency:一致性表现为事务进行过后和执行前,整体系统是稳定的,比如对于入账出账操作是不会有总资金的变化的Isolation:隔离性表示各个事务间不会相互影响,数据库一般会提供多种级别的隔离。实际上多个事务是并发执行的,但它们之间不会相互影响Durability:持久性表示一旦一个事务成功了,那么他的改变是永久性的被记录和操作

168. Char 和 VarChar 的区别是什么?

  CHAR的长度是固定的,而VARCHAR2的长度是可以变化的CHAR的效率比VARCHAR2的效率稍高目前VARCHAR是VARCHAR的同义词

169. Float 和 Double 的区别是什么?

   Double精度高,有效数字16位,float精度7位,但double消耗的内存是float的两倍,double的运算速度比float慢得多

170. MySQL 的内连接、左连接、右连接有什么区别?

  1.内连接,显示两个表中有联系的所有数据;

2.左链接,以左表为参照,显示所有数据;
   3.右链接,以右表为参照显示数据;

171. MySQL索引是怎么实现的?

   索引是一种高效获取数据的存储结构,例:hash、 二叉、 红黑。索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。

172. 怎么验证 MySQL的索引是否满足需求?

  用explain,加在select前面,然后运行,查看key那列有没有用到你那个索引

173. 说一下数据库的事务隔离?

  任何支持事务的数据库都必须具备四个特性,分别是:原子性,一致性,隔离性,持久性,也就是我们常说的事务ACID,这样才能保证事务中数据的正确性。事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每一个并发的事务间要相互进行隔离。

174. 说一下 MySQL常用的引擎?

  在Mysql数据库中,常用的引擎主要有两个:Innodb和MyIASMInnodb:提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。它的设计目标就是处理大数据容量的数据库系统,它本身实际上是基于Mysql后台的完整的系统MyISAM:是Mysql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候要锁定这个表。所以会导致效率降低。大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的大批量的插入语句时在MyIASM引擎中执行的比较快,但是Update语句在Innodb下执行的会比较快,尤其在并发量大的时候

175. 说一下 MySQL的行锁和表锁?

   表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度 最低行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也最高锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源的争用以外,数据也是一种供许多用户共享的资源

176. 说一下乐观锁和悲观锁?

   悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它自己拿到锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。乐观锁,顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

177. MySQL问题排查都有哪些手段?

  1.事务级别  :select @@global.tx_isolation2.输出数据当前状态:SHOW ENGINE INNODB STATUS 可用于排查死锁问题,锁定行数等问题3.查询数据库连接信息:select * from information_schema.PROCESSLIST4.查询事务信息:select * from information_schema.INNODB_TRX5.查询数据库锁等待信息:select * from information_schema.INNODB_LOCK_WAITS6.手动杀掉某个进程:kill trx_mysql_thread_id。。。。。。

178. 如何做 MySQL的性能优化?

   1.为查询缓存优化你的查询2.EXplain的Select 查询3.当只要有一行数据时使用LIMIT14.为搜索字段建索引5.在Join表的时候使用相当类型的例,并将其索引6.千万不要ORDER BY  RAND()7.避免SELECT *8.永远为每张表设置一个ID|9.使用ENUM而不是VARCHAR10.从PROCEDURE ANAKYSE()取得建议11.尽可能的使用NOT NULL12.Prepared Statements13.无缓冲的查询14.把IP地址存成UNSIGNED INT15.固定长度的表会更快16.垂直分割17.拆分大的DELETE或INSERT语句18.越小的列会越快19.选择正确的存储引擎20.使用一个对象关系映射器21.小心“永久链接”

Redis

179. Redis 是什么?都有哪些使用场景?

   是由意大利人开发的一款内存高速缓存数据库。全称为远程数据服务,该软件用c语言编写,是一个key-value存储系统,支持丰富的数据类型众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。

拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。

180. Redis 有哪些功能?

   慢查询、缓存

181. Redis 和 MemeCache 有什么区别?

  1.与Memached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富的多:String、hash、List、Set和Sort Set。Redis内部使用一个redisObject对象来表示所有的key和value2.内存管理机制不同,并不是所有的数据都是一直存储在内存中的。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘3.数据持久化支持。Redis虽然是基于内存的存储系统,但它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而memcached是不支持数据持久化操作的4.集群管理不同。memcached是全内存的数据缓冲系统,redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

182. Redis 为什么是单线程的?

    以前有个误区,认为高性能服务器一定是多线程来实现的,其实不然,redis核心就是如果我的数据全在内存里,单线程的区操作效率是最高的。因为多线程的本质就是COU模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis用单个CPU绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPu上完成的,所以它是单线程处理

183. 什么是缓存穿透?怎么解决?

   缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存

184. Redis 支持的数据类型有哪些?

   String,hash,list,set,zset

185. Redis 支持的 Java 客户端都有哪些?

    Redission、jedis,lettuce,官方推荐使用Redisson

186. Jedis 和 Redisson 有哪些区别?

   Jedis时java实现redis的客户端,它的Api提供了全面类似于Redis原生命令的支持。相比于其他Redis封装框架更加原生。它的使用主要是使用JedisPoolRedisson是一个在Redis的基础上实现的Java驻内存数据网格。它不仅提供了一系列额分布式的java常用对象,还提供了许多分布式服务

187. 怎么保证缓存和数据库数据的一致性?

    我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。

188. Redis 持久化有几种方式?

   RDB与AOF两种方式

189. Redis 怎么实现分布式锁?

   1)setNx一个锁key,相应的value为当前时间加上过期时间的时钟2)如果setNx成功,或者当前时钟大于此时key对应的时钟则加锁成功,否则加锁失败退出3)加锁成功执行相应的业务操作4)释放锁时判断当前时钟是否小于锁key的value,如果当前时钟小于锁key对应的value对应的value则执行删除锁key的操作

190. Redis 分布式锁有什么缺陷?

   对于单点的redis能很好的实现分布式锁,如果redis集群,会出现master宕机的情况。如果master宕机,此时锁key还没有同步到slave节点上,会出现机器B从新的master上获取了一个重复的锁

191. Redis 如何做内存优化?

   1)redisObject对象2)缩减键值对象3)共享对象池4)字符串优化5)编码优化6)控制key的数量

192. Redis 淘汰策略有哪些?

  1)voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

2)volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  3)volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰4)allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

5)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

6)no-enviction(驱逐):禁止驱逐数据

193. Redis 常见的性能问题有哪些?该如何解决?

   1.Master写内存快照2.Master AOF持久化3.Master调用BGREWRITEAOF4.Redis主从复制的性能问题5.单点故障问题

总结:Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
尽量避免在压力较大的主库上增加从库
为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<–Slave1<–Slave2<–Slave3…….,这样的结构也方便解决单点故障问题,实现Slave对 Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。

JVM

194. 说一下 JVM 的主要组成部分?及其作用?

  堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制,值得一提的是从JDK1.7版本之后,运行时常量池从方法区移到了堆上。方法区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区在JDK1.7版本及以前被称为永久代,从JDK1.8永久代被移除。虚拟机栈。虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

本地方法栈。与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

  程序计数器。指示Java虚拟机下一条需要执行的字节码指令。

以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。
所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。

1. 说一下 JVM 运行时数据区?

    JVM运行时数据区包括数据隔离的数据区:方法区和堆,线程隔离的数据区:虚拟机栈,本地方法栈,程序计数器

2. 说一下堆栈的区别?

   栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。堆内存存储的是数组和对象,凡是new建立的都是在堆中,堆中存放的都是实体,实体用于封装数据,而且是封装多个,如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,java有垃圾回收机制不定时的收取。

3. 队列和栈是什么?有什么区别?

   队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。区别:1.操作的名称不同,队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈2.可操作的方式不同。队列是在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作3.操作的方法不同。队列是先进先出,即队列的修改是依先进先出的原则进行的。新来的成员总要加入队尾,每次离开的成员总是队列头上。而栈为后进先出,即每次删除的总是当前栈中最新的元素,即最后插入的元素,而最先插入的被放在栈的底部,要到最后才能删除。

4. 什么是双亲委派模型?

    是JVM中类加载的机制。这个模型要求除了Bootstrap ClassLoader外,其余的类加载器都要有自己的父加载器。子加载器通过组合来复用父加载器的代码,而不是使用继承。在某个类加载器class文件时,它首先委托父加载器去加载这个类,依次传递到顶层类加载器。如果顶层加载不了,子加载器才会尝试加载这个类。

5. 说一下类加载的执行过程?

   类从被加载到JVM中开始到卸载为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用和卸载七个阶段,其中类加载过程包括加载、验证、准备、解析和初始化五个阶段。当一个类加载器接收到一个类加载的任务时,不会立即展开加载,而是将加载任务委托给它的父类加载器去执行,每一层的类都采用相同的方式,直到委托给最顶层的启动类加载器为止。如果父类加载器无法加载委托给它的类,便将类的加载任务退回给下一级类加载器去执行加载。

6. 怎么判断对象是否可以被回收?

   如果一个程序无法引用到该对象,那么这个对象就没有到达根对象的路径,或者说从跟对象开始无法引用到该对象,该对象就是不可达的

7. Java 中都有哪些引用类型?

  1.强引用2.软引用3.弱引用4.虚引用引用队列

8. 说一下 JVM 有哪些垃圾回收算法?

   1.标记清除算法2.复制算法3.标记整理算法4.分代收集算法

9. 说一下 JVM 有哪些垃圾回收器?

  1.串行回收器1.1 新生代串行回收器1.2 老年代串行回收器2.并行回收器2.1新生代ParNew回收器2.2新生代ParalleIGC回收器2.3老年代ParallelOldGC

10. 详细介绍一下 CMS 垃圾回收器?

   CMS垃圾回收的全称是Concurrent Mark-Sweep Collector,从名字上可以看出两点,一个使用的是并发收集,第二个使用的收集算法是Mark-Sweep.从而也可以推测出该收集器的特点是低延迟并且会有浮动垃圾的问题。CMS收集器是为了低延迟而生,通过尽可能的并行执行垃圾回收的几个阶段来把延迟控制到最低。CMS收集器是老年代的垃圾收集器,一般情况下会有ParNew来配合执行(默认情况下也是ParNew),ParNew也是使用并行的算法来执行年轻代的回收。当然除此之外,你还可以选择使用Serial收集器来收集年轻代,不过一般很少这样使用。通过咱们说的CMS收集器是指广义上的CMS收集器,包含以下几个:ParNew(Young)GC + CMS(Old)GC + Serial GC 算法(应对核心的CMS GC某些时候的不赶趟,开销很大)。本文重点介绍一些CMS在Old区域的回收。

11. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

   1. 新生代(New Generation)

大多数情况下Java程序中新建的对象都从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称为S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可通过-XX:SurvivorRatio来调整Eden Space及Survivor Space的大小。不同的GC方式会以不同的方式按此值来划分Eden Space和Survivor Space,有些GC方式还会根据运行状况来动态调整Eden、S0、S1的大小。
2. 老年代(Old Generation或Tenuring Generation)
用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新建的对象也有可能在老年代上直接分配内存。主要有两种状况(由不同的GC实现来决定):一种为大对象,可通过在启动参数上设置-XX:PretenureSizeThreshold=1024(单位为字节,默认值为0)来代表当对象超过多大时就不在新生代分配,而是直接在老年代分配,此参数在新生代采用Parallel Scavenge GC时无效,Parallel Scavenge GC会根据运行状况决定什么对象直接在老年代上分配内存;另一种为大的数组对象,且数组中无引用外部对象。
新生代和老生代因为结构划分不一样,其串行收集器算法也不一样
新生代串行收集器
采用stop the world策略,步骤大概是:先从eden区扫描,把存活的对象拷贝到to区,如果to区放不下的对象直接拷贝到old区。再从from区扫描存活对象,如果对象存活次数超过阀值的就移到老年区,其他的移到to区。做完之后from和to区概念互换(from和to只是运行时的概念,其实就对应存活1区和存活2区)

206. 简述分代垃圾回收器是怎么工作的?

     首先,垃圾回收器将某些特殊的对象定义为GC根对象。接下来,垃圾回收器会对内存中的整个对象图进行遍历,它先从GC根对象开始,然后是根对象引用的其它对象,比如实例变量。回收器将访问到的所有对象都标记为存活。存活对象在上图中被标记为蓝色。当标记阶段完成了之后,所有的存活对象都已经被标记完了。其它的那些(上图中灰色的那些)也就是GC根对象不可达的对象,也就是说你的应用不会再用到它们了。这些就是垃圾对象,回收器将会在接下来的阶段中清除它们。

207. 说一下 JVM 调优的工具?

  Jconsole(Java Monitoring and Management Console)是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监测工具。jconsole使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

208. 常用的 JVM 调优的参数都有哪些?

    (1)-Xms20M表示设置JVM启动内存的最小值为20M,必须以M为单位(2)-Xmx20M表示设置JVM启动内存的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免JVM内存自动扩展。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高3)-verbose:gc表示输出虚拟机中GC的详细情况(4)-Xss128k表示可以设置虚拟机栈的大小为128k

杂七杂八

209. a = a + b 和 a += b 的区别?

a = a + b 不会做类型转换的
a int  b str
a + b  int无法转成stra += b
a = a(String) + b

Java史上最全的面试题汇总(JVM/Mysql/boot/cloud/zk/kafka/MQ/redis)相关推荐

  1. 史上最全网络安全面试题汇总 ! !

    php爆绝对路径方法? 单引号引起数据库报错 访问错误参数或错误路径 探针类文件如phpinfo 扫描开发未删除的测试文件 google hacking phpmyadmin报路径:/phpmyadm ...

  2. 史上最全各类面试题汇总,没有之一,不接受反驳

    计算机网络 从网络加载一个10M的图片,说下注意事项 OSI网络体系结构与TCP/IP协议模型 TCP的3次握手和四次挥手 为什么TCP链接需要三次握手,两次不可以么,为什么? TCP协议如何来保证传 ...

  3. 史上最全的前端资源汇总(下)

    56. 表格 Grid 表格 Grid 地址 facebook表格 http://facebook.github.io/fixed-data-table 类似于Excel编辑表格-handsontab ...

  4. 史上最全第三方地图服务汇总【天地图/高德/百度/腾讯/谷歌地图等】

    Webgis开发过程中,我们一般使用第三方地图服务作为底图.本篇博文给大家介绍市面上常用的第三方地图服务,应该算的上是史上最全. 如果需要转载,请注明转载出处:https://blog.csdn.ne ...

  5. 面试:史上最全多线程面试题 - (锁内存模型线程)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xxyybs/article/detai ...

  6. 速度收藏!史上最全Spring 面试题 92 问!【附答案】高清PDF下载

    吐血整理了Spring面试题一共92题,并且全部归档整理成了一个PDF版本,获取方式在底部! String面试题(92题) 1.不同版本的 Spring Framework 有哪些主要功能? Vers ...

  7. 史上最全网络安全面试题合集

    php爆绝对路径方法? 单引号引起数据库报错 访问错误参数或错误路径 探针类文件如phpinfo 扫描开发未删除的测试文件 google hacking phpmyadmin报路径:/phpmyadm ...

  8. 2018最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)--转载

    版权声明:本文为转载文章,感谢博主小胖梅的博客,如有侵权,请联系我删除,谢谢 转载链接: https://blog.csdn.net/xm1037782843/article/details/8070 ...

  9. 史上最全网络安全面试题总结

    新的一年,难免有不少小伙伴面临跳槽或者找工作,本文总结了常见的安全岗位面试题,方便各位复习.祝各位事业顺利,财运亨通. php爆绝对路径方法? 单引号引起数据库报错 访问错误参数或错误路径 探针类文件 ...

最新文章

  1. linux视频学习6(mysql的安装/)
  2. mysql 多主多从配置,自增id解决方案
  3. dec++如何查看机器指令_机器指令到汇编再到高级编程语言!
  4. Spring JDBC-自增键和行集RowSet
  5. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
  6. C/C++ 函数指针调用函数
  7. 学会了Python之后,我的职业生涯突飞猛进
  8. 前端javascript经典面试题集合(2020年最新)
  9. javascript实现窗口随着鼠标移动且移动路径重现
  10. 见习经理_第一天洗了整天碗
  11. django模板层 (标签,过滤器,自定义inclusion_tag,模板的继承与导入)
  12. thinkphp htmls.php,ThinkPHP静态缓存简单配置和使用方法详解
  13. 查询各分类中最大自增ID
  14. 电脑开机后过一会就关机自动重启
  15. iOS 极光推送没有声音怎么办?
  16. 15.系统安全分析与设计
  17. # Classification: Accuracy(准确率)
  18. c语言计算n+nn+nnn+nnnn......---@颜麓
  19. 使用Keras和OpenCV实时预测年龄、性别和情绪 (详细步骤+源码)
  20. 百度商业系统大规模微服务分布式监控实践

热门文章

  1. 动态生成 iframe;销毁 iframe,释放内存
  2. 昨日关注:Channel9 Wiki: Online Tutorials about Enterprise Library
  3. PASCAL VOC 数据集的标注格式
  4. 【琐碎】查看tensorflow安装版本、位置信息及是GPU版本还是CPU版本
  5. sqlserver里面增加约束条件
  6. 身为职场人千万要警惕的这五大效应
  7. 区块链+农业持续发力,加快农业现代化发展
  8. oracle rac 主备 轮训,RAC+DATAGUARD环境下主备切换
  9. 使用又拍云让网站实现https访问
  10. 【概率论与统计学】最常用常考的6种概率计算 经验分享