转载

面试题

文章目录

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、SetMap 之间的区别是什么?
    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 响应码 301302 代表的是什么?有什么区别?
    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 中使用 Integerint 做映射有什么区别?
    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. CharVarChar 的区别是什么?
    169. FloatDouble 的区别是什么?
    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,一个用于开发一个用于运行

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

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

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

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

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

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

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

-1

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

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

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

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

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

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

  1. 如何将字符串反转?

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

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

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

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

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

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

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

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

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

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

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

  1. Java 中 IO 流分为几种?

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

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

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

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

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

容器

  1. Java 容器都有哪些?

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

  2. Collection 和 Collections 有什么区别?

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

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

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

  4. HashMap 和 Hashtable 有什么区别?

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

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

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

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

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

    1 HashMap由数据和链表组成
    2 链表主要是解决哈希冲突而存在的 对于查找,添加等操作很快
    3 通过key对象的equals方法逐一比对查找,HashMAp中的链表出现越少,性能才会越好

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

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

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

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

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

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

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

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

    1 Vector的方法都是同步的,是线程安全的 ArrayList的方法不是
    2 Vector会将它的容量翻倍,ArrayList只增加50%的大小

  2. Array 和 ArrayList 有何区别?

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

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

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

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

    Vector,HashTable,ConcurrentHashMap,Stack

  2. 迭代器 Iterator 是什么?

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

  3. 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下一个元素
    
  4. 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仅能遍历,不可以修改

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

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

多线程

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

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

  2. 线程和进程的区别?

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

  3. 守护线程是什么?

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

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

    继承Thread类
    实现runable接口

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

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

  1. 线程有哪些状态?

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

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

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

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

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

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

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

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

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

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

Running、ShutDown、Stop、Tidying、Terminated

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

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

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

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

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

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

  1. 什么是死锁?

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

  1. 怎么防止死锁?

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

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

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

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

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

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

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

  2. Synchronized 和 Lock 有什么区别?

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

  1. Synchronized 和 ReentrantLock 区别是什么?

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

  1. 说一下 Atomic 的原理?

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

  1. 什么是反射?

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

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

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

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

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

  2. 怎么实现动态代理?

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

对象拷贝

  1. 为什么要使用克隆?

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

  2. 如何实现对象克隆?

    两种不同的克隆方式,浅克隆(ShallowClone)和深克隆(DeepClone)
    两种方式:实现Cloneable接口并重写object类中的clone()方法

             实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
    
  3. 深拷贝和浅拷贝区别是什么?

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

Java Web

  1. JSP 和 servlet 有什么区别?

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

  2. 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的引用,用来获得页面错误的信息

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

    page,request,session,application

  4. Session 和 Cookie 有什么区别?

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

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

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

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

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

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

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

  1. 如何避免 SQL 注入?

           1.检查变量数据类型和格式
           2.过滤特殊字符
           3.绑定变量,使用预编译语句
    

    总结:使用预编译绑定变量的sql语句

       严格加密处理用户的机密信息
       不要随意开启生产环境中的webserver的错误信息
       使用正则表达式过滤传入的参数
       字符串过滤
       检查是否包含非法字
    
  2. 什么是 XSS 攻击,如何避免?

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

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

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

  1. throw 和 throws 的区别?

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

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

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

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

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

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

    会执行,在return前执行

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

    IOEException、RunntimeException、ArrayIndexOUtOfBoundsException、NullpointerException

网络

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

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

          302 redirect:代表暂时性转移
    
  2. forward 和 redirect 的区别?

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

        简接:A找B借钱,B说没有,让A去找C借
    
  3. 简述 TCP 和 UDP 的区别?

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

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

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

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

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

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

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

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

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

  8. 如何实现跨域?

    1.图片ping或script标签跨域
    2.JSONP跨域
    3.CORS
    4.window.name+iframe
    5.window.postMessage()
    6.修改document.domain跨子域
    7.WebSocket
    8.代理

  9. 说一下 JSONP 实现原理?

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