文章目录
- 一、Java基础
- 1. 解释下什么是面向对象?面向对象和面向过程的区别?
- 2. 面向对象的三大特性?分别解释下?
- 3. JDK、JRE、JVM 三者之间的关系?
- 4. 重载和重写的区别?
- 5. Java 中是否可以重写一个 private 或者 static 方法?
- 6. 构造方法有哪些特性?
- 8. Java 中创建对象的几种方式?
- 9. 抽象类和接口有什么区别?
- 10. 静态变量和实例变量的区别?
- 11、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
- 12. Integer 和 int 的区别?
- 14. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
- 15、final、finally、finalize 的区别
- 16. == 和 equals 的区别?
- 17. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
- 19. & 和 && 的区别?
- 20. Java 中的参数传递是传值呢?还是传引用?
- 21. Java 中的 Math.round(-1.5) 等于多少?
- 22. 如何实现对象的克隆?
- 23. 深克隆和浅克隆的区别?
- 24. 什么是 Java 的序列化,如何实现 Java 的序列化?
- 25. 什么情况下需要序列化?
- 26. 泛型, 什么是类型擦除 ?
- 27. 什么是泛型中的限定通配符和非限定通配符 ?
- 29. Java 中的反射是什么意思?有哪些应用场景?
- 30. 反射的优缺点?
- 31. Java 中的动态代理是什么?有哪些应用?
- 32. 怎么实现动态代理?
- 33. static 关键字的作用?
- 34. super 关键字的作用?
- 35. 字节和字符的区别?
- 36. String 为什么要设计为不可变类?
- 37. String、StringBuilder、StringBuffer 的区别?
- 39. String str = "i" 与 String str = new String("i") 一样吗?
- 40. String 类的常用方法都有那些?
- 41. final 修饰 StringBuffer 后还可以 append 吗?
- 42. Java 中的 IO 流的分类?说出几个你熟悉的实现类?
- 43. 字节流和字符流有什么区别?
- 44. BIO、NIO、AIO 有什么区别?
- 二、Java异常
- 三、Java集合
- 1. Java 中常用的容器有哪些?
- 2. ArrayList 和 LinkedList 的区别?
- 3. ArrayList 实现 RandomAccess 接口有何作用?为何 LinkedList 却没实现这个接口?
- 4. ArrayList 的扩容机制?
- 5. Array 和 ArrayList 有何区别?什么时候更适合用 Array?
- 6. HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8
- 7. HashMap 的 put 方法的执行过程?
- 8. HashMap 的 get 方法的执行过程?
- 9. HashMap 的 resize 方法的执行过程?
- 10. HashMap 的 size 为什么必须是 2 的整数次方?
- 11. HashMap 多线程死循环问题?
- 12. HashMap 的 get 方法能否判断某个元素是否在 map 中?
- 13. HashMap 与 HashTable 的区别是什么?
- 14. HashMap 与 ConcurrentHashMap 的区别是什么?
- 15. HashTable 和 ConcurrentHashMap 的区别?
- 16. ConcurrentHashMap 的实现原理是什么?
- 17. HashSet 的实现原理?
- 18. HashSet 怎么保证元素不重复的?
- 19. LinkedHashMap 的实现原理?
- 20. Iterator 怎么使用?有什么特点?
- 21. Iterator 和 ListIterator 有什么区别?
- 22. Iterator 和 Enumeration 接口的区别?
- 23. fail-fast 与 fail-safe 有什么区别?
- 24. Collection 和 Collections 有什么区别?
- 四、Java并发
- 1. 并行和并发有什么区别?
- 2. 线程和进程的区别?
- 3. 守护线程是什么?
- 4. 创建线程的几种方式?
- 5. Runnable 和 Callable 有什么区别?
- 6. 线程状态及转换?
- 7. sleep() 和 wait() 的区别?
- 8. 线程的 run() 和 start() 有什么区别?
- 9. 在 Java 程序中怎么保证多线程的运行安全?
- 10. Java 线程同步的几种方法?
- 11. Thread.interrupt() 方法的工作原理是什么?
- 12. 谈谈对 ThreadLocal 的理解?
- 13. 在哪些场景下会使用到 ThreadLocal?
- 14. 说一说自己对于 synchronized 关键字的了解?
- 15. 如何在项目中使用 synchronized 的?
- 16. 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗?
- 17. 谈谈 synchronized 和 ReenTrantLock 的区别?
- 18. synchronized 和 volatile 的区别是什么?
- 19. 谈一下你对 volatile 关键字的理解?
- 20. 说下对 ReentrantReadWriteLock 的理解?
- 21. 说下对悲观锁和乐观锁的理解?
- 22. 乐观锁常见的两种实现方式是什么?
- 23. 乐观锁的缺点有哪些?
- 24. CAS 和 synchronized 的使用场景?
- 25. 简单说下对 Java 中的原子类的理解?
- 26. atomic 的原理是什么?
- 27. 说下对同步器 AQS 的理解?
- 28. AQS 的原理是什么?
- 29. AQS 对资源的共享模式有哪些?
- 30. AQS 底层使用了模板方法模式,你能说出几个需要重写的方法吗?
- 31. 说下对信号量 Semaphore 的理解?
- 32. CountDownLatch 和 CyclicBarrier 有什么区别?
- 33. 说下对线程池的理解?为什么要使用线程池?
- 34. 创建线程池的参数有哪些?
- 35. 如何创建线程池?
- 36. 线程池中的的线程数一般怎么设置?需要考虑哪些问题?
- 37. 执行 execute() 方法和 submit() 方法的区别是什么呢?
- 38. 说下对 Fork和Join 并行计算框架的理解?
- 39. JDK 中提供了哪些并发容器?
- 40. 谈谈对 CopyOnWriteArrayList 的理解?
- 41. 谈谈对 BlockingQueue 的理解?分别有哪些实现类?
- 42. 谈谈对 ConcurrentSkipListMap 的理解?
- 五、Java JVM
- 1. 说一下 Jvm 的主要组成部分?及其作用?
- 2. 谈谈对运行时数据区的理解?
- 3. 堆和栈的区别是什么?
- 4. 堆中存什么?栈中存什么?
- 5. 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
- 6. Java 中的参数传递时传值呢?还是传引用?
- 7. Java 对象的大小是怎么计算的?
- 8. 对象的访问定位的两种方式?
- 9. 判断垃圾可以回收的方法有哪些?
- 10. 垃圾回收是从哪里开始的呢?
- 11. 被标记为垃圾的对象一定会被回收吗?
- 12. 谈谈对 Java 中引用的了解?
- 13. 谈谈对内存泄漏的理解?
- 14. 内存泄露的根本原因是什么?
- 15. 举几个可能发生内存泄漏的情况?
- 16. 尽量避免内存泄漏的方法?
- 17. 常用的垃圾收集算法有哪些?
- 18. 为什么要采用分代收集算法?
- 19. 分代收集下的年轻代和老年代应该采用什么样的垃圾回收算法?
- 20. 什么是浮动垃圾?
- 21. 什么是内存碎片?如何解决?
- 22. 常用的垃圾收集器有哪些?
- 23. 谈谈你对 CMS 垃圾收集器的理解?
- 24. 谈谈你对 G1 收集器的理解?
- 25. 说下你对垃圾回收策略的理解/垃圾回收时机?
- 26. 谈谈你对内存分配的理解?大对象怎么分配?空间分配担保?
- 27. 说下你用过的 JVM 监控工具?
- 28. 如何利用监控工具调优?
- 29. JVM 的一些参数?
- 30. 谈谈你对类文件结构的理解?有哪些部分组成?
- 31. 谈谈你对类加载机制的了解?
- 32. 类加载各阶段的作用分别是什么?
- 33. 有哪些类加载器?分别有什么作用?
- 34. 类与类加载器的关系?
- 35. 谈谈你对双亲委派模型的理解?工作过程?为什么要使用
- 36. 怎么实现一个自定义的类加载器?需要注意什么?
- 37. 怎么打破双亲委派模型?
- 38. 有哪些实际场景是需要打破双亲委派模型的?
- 39. 谈谈你对编译期优化和运行期优化的理解?
- 40. 为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?
- 41. 说下你对 Java 内存模型的理解?
- 42. 内存间的交互操作有哪些?需要满足什么规则?
- 六、SSM框架
- 1. 使用 Spring 框架的好处是什么?
- 2. 解释下什么是 AOP?
- 3. AOP 的代理有哪几种方式?
- 4. 怎么实现 JDK 动态代理?
- 5. AOP 的基本概念:切面、连接点、切入点等?
- 6. 通知类型(Advice)型(Advice)有哪些?
- 7. 谈谈你对 IOC 的理解?
- 8. Bean 的生命周期?
- 9. Bean 的作用域?
- 10. Spring 中的单例 Bean 的线程安全问题了解吗?
- 11. 谈谈你对 Spring 中的事物的理解?
- 12. Spring 中的事务隔离级别?
- 13. Spring 中的事物传播行为?
- 14. Spring 常用的注入方式有哪些?
- 15. Spring 框架中用到了哪些设计模式?
- 16. ApplicationContext 通常的实现有哪些?
- 17. 谈谈你对 MVC 模式的理解?
- 18. SpringMVC 的工作原理/执行流程?
- 19. SpringMVC 的核心组件有哪些?
- 20. SpringMVC 常用的注解有哪些?
- 21. @RequestMapping 的作用是什么?
- 22. 如何解决 POST 请求中文乱码问题,GET 的又如何处理呢?
- 23. SpringMVC 的控制器是不是单例模式,如果是会有什么问题,怎么解决?
- 24. SpringMVC 怎么样设定重定向和转发的?
- 25. SpringMVC 里面拦截器是怎么写的?
- 26. SpringMVC 和 Struts2 的区别有哪些?
- 27. 谈谈你对 MyBatis 的理解?
- 28. MyBaits 的优缺点有哪些?
- 29. MyBatis 与 Hibernate 有哪些不同?
- 30. MyBatis 中 #{} 和 ${}的区别是什么?
- 31. MyBatis 是如何进行分页的?分页插件的原理是什么?
- 32. MyBatis 有几种分页方式?
- 33. MyBatis 逻辑分页和物理分页的区别是什么?
- 34. MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
- 35. 说一下 MyBatis 的一级缓存和二级缓存?
- 36. Mybatis 有哪些执行器(Executor)?
- 37. MyBatis 动态 SQL 是做什么的?都有哪些动态 SQL?能简述一下动态 SQL的执行原理不?
- 七、MySQL
- 1. 请说下你对 MySQL 架构的了解?
- 2. 一条 SQL 语句在数据库框架中的执行流程?
- 3. 数据库的三范式是什么?
- 4. char 和 varchar 的区别?
- 5. varchar(10) 和 varchar(20) 的区别?
- 6. 谈谈你对索引的理解?
- 7. 索引的底层使用的是什么数据结构?
- 8. 谈谈你对 B+ 树的理解?
- 9. 为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树呢?
- 10. 谈谈你对聚簇索引的理解?
- 11. 谈谈你对哈希索引的理解?
- 12. 谈谈你对覆盖索引的认识?
- 13. 索引的分类?
- 14. 谈谈你对最左前缀原则的理解?
- 15. 怎么知道创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
- 16. 什么情况下索引会失效?即查询不走索引?
- 17. 查询性能的优化方法?
- 18. InnoDB 和 MyISAM 的比较?
- 19. 谈谈你对水平切分和垂直切分的理解?
- 20. 主从复制中涉及到哪三个线程?
- 21. 主从同步的延迟原因及解决办法?
- 22. 谈谈你对数据库读写分离的理解?
- 23. 请你描述下事务的特性?
- 24. 谈谈你对事务隔离级别的理解?
- 25. 解释下什么叫脏读、不可重复读和幻读?
- 26. MySQL 默认的隔离级别是什么?
- 27. 谈谈你对MVCC 的了解?
- 28. 说一下 MySQL 的行锁和表锁?
- 29. InnoDB 存储引擎的锁的算法有哪些?
- 30. MySQL 问题排查都有哪些手段?
- 31. MySQL 数据库 CPU 飙升到 500% 的话他怎么处理?
- 八、Redis
- 九、计算机网络
- 1. 为什么需要三次握手?两次不行?
- 2. 为什么需要四次挥手?三次不行?
- 3. TCP与UDP有哪些区别?各自应用场景?
- 4. HTTP1.0,1.1,2.0 的版本区别
- 5. POST和GET有哪些区别?各自应用场景?
- 6. HTTP 哪些常用的状态码及使用场景?
- 7. HTTP状态码301和302的区别,都有哪些用途?
- 8. 在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?
- 9. HTTP 如何实现长连接?在什么时候会超时?
- 10. TCP 如何保证有效传输及拥塞控制原理
- 11. IP地址有哪些分类?
- 12. GET请求中URL编码的意义
- 13. 什么是SQL 注入?举个例子?
- 14. 谈一谈 XSS 攻击,举个例子?
- 15. 讲一下网络五层模型,每一层的职责?
- 16. 简单说下 HTTPS 和 HTTP 的区别
- 17. 对称加密与非对称加密的区别
- 18. 简单说下每一层对应的网络协议有哪些?
- 19. ARP 协议的工作原理?
- 20. TCP 的主要特点是什么?
- 21. UDP 的主要特点是什么?
- 22. TCP 和 UDP 分别对应的常见应用层协议有哪些?
- 23. 为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
- 24. 保活计时器的作用?
- 25. TCP 协议是如何保证可靠传输的?
- 26. 谈谈你对停止等待协议的理解?
- 27. 谈谈你对 ARQ 协议的理解?
- 28. 谈谈你对滑动窗口的了解?
- 29. 谈下你对流量控制的理解?
- 30. 谈下你对 TCP 拥塞控制的理解?使用了哪些算法?
- 31. 什么是粘包?
- 32. TCP 黏包是怎么产生的?
- 33. 怎么解决拆包和粘包?
- 34. forward 和 redirect 的区别?
- 35. HTTP 方法有哪些?
- 36. 在浏览器中输入 URL 地址到显示主页的过程?
- 37. DNS 的解析过程?
- 38. 谈谈你对域名缓存的了解?
- 39. 谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?
- 40. HTTPS 的工作过程?
- 41. HTTP 和 HTTPS 的区别?
- 42. HTTPS 的优缺点?
- 43. 什么是数字签名?
- 44. 什么是数字证书?
- 45. Cookie 和 Session 有什么区别?
- 十、操作系统
- 1. 简单说下你对并发和并行的理解?
- 2. 同步、异步、阻塞、非阻塞的概念
- 3. 进程和线程的基本概念
- 4. 进程与线程的区别?
- 5. 为什么有了进程,还要有线程呢?
- 6. 进程的状态转换
- 7. 进程间的通信方式有哪些?
- 8. 进程的调度算法有哪些?
- 9. 什么是死锁?
- 10. 产生死锁的原因?
- 11. 死锁产生的必要条件?
- 12. 解决死锁的基本方法?
- 13. 怎么预防死锁?
- 14. 怎么避免死锁?
- 15. 怎么解除死锁?
- 16. 什么是缓冲区溢出?有什么危害?
- 17. 分页与分段的区别?
- 18. 物理地址、逻辑地址、虚拟内存的概念
- 19. 页面置换算法有哪些?
- 20. 谈谈你对动态链接库和静态链接库的理解?
- 21. 外中断和异常有什么区别?
- 22. 一个程序从开始运行到结束的完整过程,你能说出来多少?
- 23. 什么是用户态和内核态
- 24. 用户态和内核态是如何切换的?
- 25. 进程终止的方式
- 26. 守护进程、僵尸进程和孤儿进程
- 27. 如何避免僵尸进程?
- 28. 介绍一下几种典型的锁?
- 29. 常见内存分配内存错误
- 30. 内存交换中,被换出的进程保存在哪里?
- 31. 原子操作的是如何实现的
- 32. 抖动你知道是什么吗?它也叫颠簸现象
- 十一、消息队列与分布式
- 1. 消息队列的基本作用?
- 2. 消息队列的优缺点有哪些?
- 3. 如何保证消息队列的高可用?
- 4. 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
- 5. 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
- 6. 如何保证消息的顺序性?
- 7. 大量消息在 MQ 里长时间积压,该如何解决?
- 8. MQ 中的消息过期失效了怎么办?
- 9. RabbitMQ 有哪些重要的角色?
- 10. RabbitMQ 有哪些重要的组件?
- 11. RabbitMQ 有几种广播类型?
- 12. Kafka 可以脱离 zookeeper 单独使用吗?为什么?
- 13. Kafka 有几种数据保留的策略?
- 14. Kafka 的分区策略有哪些?
- 15. 谈下你对 Zookeeper 的认识?
- 16. Zookeeper 都有哪些功能?
- 17. 谈下你对 ZAB 协议的了解?
- 18. Zookeeper 怎么保证主从节点的状态同步?
- 19. Zookeeper 有几种部署模式?
- 20. 说一下 Zookeeper 的通知机制?
- 21. 集群中为什么要有主节点?
- 22. 集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?
- 23. 说一下两阶段提交和三阶段提交的过程?分别有什么问题?
- 24. Zookeeper 宕机如何处理?
- 25. 说下四种类型的数据节点 Znode?
- 26. Zookeeper 和 Dubbo 的关系?
一、Java基础
1. 解释下什么是面向对象?面向对象和面向过程的区别?
面向对象是一种基于面向过程的编程思想,是一种编程风格。把一切东西看成是一个个对象,比如人、耳机、鼠标、水杯等,他们各自都有属性。
区别:
- 编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
- 封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
- 面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势很明显
2. 面向对象的三大特性?分别解释下?
- 封装:将抽象性函式接口的实现细节部分包装、隐藏起来的方法。比如使用private修饰属性、方法,然后提供公共方式进行访问、修改等。
① 良好的封装能够减少耦合
② 类内部的结构可以自由修改
③ 可以对成员变量进行更精确的控制
④ 隐藏信息,实现细节
- 继承:当多个类中内容出现了重复,把重复内容放到新的类中,通过extends 关键字让原来的类和新的类产生关联关系;新的类称为父类/超类,原来的类称为子类/派生类。
① 拥有父类非 private 的属性、方法(也有说可以继承private,只是不能使用),不能继承构造函数
② 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
③ 子类可以用自己的方式实现父类的方法(重写)
④ Java 中类的继承是单继承(即一个类只能有一个直接父类,一个父类可以存在多个子类),但是可以多重继承
⑤ 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
- 多态:同一个行为具有多个不同表现形式或形态的能力,多态存在的三个必要条件 :继承、重写、父类引用指向子类对象
a、编译时多态 :在编译时期绑定代码,体现形式 —— 重载
b、运行时多态 :在运行时期绑定代码,体现形式 —— 重写、向上造型
3. JDK、JRE、JVM 三者之间的关系?
- JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
- JRE(Java Runtime Environment)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
- JVM(Java Virtual Machine)即Java虚拟机,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。
4. 重载和重写的区别?
都是多态的体现
- 重载(overload)
1.发生在本类或子类
2.方法名要一样
3.参数类型或者个数要不一样(至少一种不一样)
4.修饰符、返回值可以不一样
5.可以抛出不同的异常
- 重写(override)
1.发生在子类对父类方法的覆盖
2.方法名要一样
3.参数类型和个数要一样
4.返回值要一样或者为其子类,接口实现类
5.访问修饰符要大于等于原来的
6.抛出的异常要小于等于原来的
5. Java 中是否可以重写一个 private 或者 static 方法?
不可以
因为 private 修饰的变量和⽅法只能在当前类中使⽤, 如果是其他的类继承当前类是不能访问到 private 变量或⽅法的,当然也不能重写(覆盖)
因为⽅法重写(覆盖)是基于运⾏时动态绑定的,⽽ static ⽅法是编译时静态绑定的
6. 构造方法有哪些特性?
- 构造⽅法的⽅法名必须与类名相同
- 构造⽅法没有返回类型,也不能定义为void,在⽅法名前⾯不声明⽅法类型
- 构造⽅法的主要作⽤是完成对象的初始化⼯作,它能够把定义对象时的参数传给对象的域
- ⼀个类可以定义多个构造⽅法,如果在定义类时没有定义构造⽅法,则编译系统会⾃动插⼊⼀个⽆参数的默认构造器,这个构造器不执⾏任何代码
- 构造⽅法可以重载,以参数的个数,类型,顺序
8. Java 中创建对象的几种方式?
- 使用new关键字
- 通过spring bean管理
- 反射newInstance
- 调用clone方法(类要实现Cloneable接口)
- 反序列化readObject(要实现Serializable接口)
9. 抽象类和接口有什么区别?
抽象类
- 构造方法:有构造方法,用于子类实例化使用
- 成员变量:可以是变量,也可以是常量
- 成员方法:可以是抽象的,也可以是非抽象的
接口
- 构造方法:没有构造方法
- 成员变量:只能是常量。默认修饰符:public static final
- 成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract (推荐:默认修饰符请自己永远手动给出)
jdk1.8可以写以default和static开头的具体方法
类与类:
继承关系,只能单继承。可以多层继承。
类与接口:
实现关系,可以单实现,也可以多实现。
类还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系,可以单继承,也可以多继承。
体现的理念不同
抽象类里面定义的都是一个继承体系中的共性内容。
接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。
10. 静态变量和实例变量的区别?
- 静态变量用 static字符修饰,随着类的加载而加载,可以直接通过"类名.变量名"直接调用,也可以通过类的对象调用。
- 实例变量相当于该类的属性,需要 "new对象 "才能被调用。
- 静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象 再去获取它,得到的是改变后的值
- 实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象的取值结果,得到的仍是实例变量一开始被赋予的值
11、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
char、short、byte在做运算时,会自动提升为int,所以s1+1为int,报错,需要强转s1=(short) s1+1
Java语言规范中讲到,复合赋值E1 op =E2等价于简单赋值E1=(T) (E1 op E2),隐式的有个强转
12. Integer 和 int 的区别?
int是基本数据类型,默认值为0
Integer是int的包装类,默认值值null,是一个对象,提供了各种API接口
使用==比较时,int比较的是值,Integer比较的是内存地址,在直接赋值(不是new出来的)或者valueOf时,值在-128-127之间为true
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
14. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
switch可以作用于char、short、byte、int、enum、String以及对应的包装类
jdk1.7开始支持String
15、final、finally、finalize 的区别
final是修饰符,被修饰的类不能被继承,被修饰的方法不能重写,被修饰的变量需要初始化且不能修改(可以在代码块中初始化),修饰的变量为引用类型时,指引用地址不可变,引用的对象内容可以修改
finally异常捕捉时配合try使用,一定会被执行的代码
finalize是Object的方法,目的是为了保证对象在垃圾回收之前完成特定资源的回收,但调用该方法不保证一定被回收,不推荐使用
16. == 和 equals 的区别?
基本数据类型==比较的是值,引用类型比较的是地址
equals比较的是地址,可以进行重写
17. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
不一定,比如哈希冲突。对象一样,则hashCode一定相同
19. & 和 && 的区别?
&是按位与,不会短路,a&b是把a和b都转换成二进制数然后再进行与的运算
&&是逻辑与,会短路,a&&b就是当且仅当两个操作数均为 true时,其结果才为 true,只要有一个为false,a&&b就为false
20. Java 中的参数传递是传值呢?还是传引用?
值传递
基本数据类型传递是一个副本
引用类型传递是引用地址,所以在用=赋值时,改变的是自身的地址引用,不会改变原对象。如果是修改内容,则原对象内容也会被修改
21. Java 中的 Math.round(-1.5) 等于多少?
Math的round方法是四舍五入,如果参数是负数,则往大的数如,Math.round(-1.5)=-1,如果是Math.round(1.5)则结果为2
22. 如何实现对象的克隆?
分为浅克隆和深克隆
- 调用对象的clone方法,前提是要实现Cloneable接口,默认浅拷贝
- 使用反序列化readObject,前提是要实现Serializable接口,深拷贝
- 使用BeanUtils等第三方工具,浅拷贝
23. 深克隆和浅克隆的区别?
- 浅克隆:对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性(拷贝一份该对象并重新分配内存,即产生了新的对象);但如果被克隆的对象中包含除8中数据类型和String类型外的其他类型的属性,浅克隆并不会克隆这些属性(即不会为这些属性分配内存,而是引用原来对象中的属性)
- 深拷贝:在浅克隆的基础上,递归地克隆除8种基本数据类型和String类型外的属性(即为这些属性重新分配内存而非引用原来对象中的属性)
24. 什么是 Java 的序列化,如何实现 Java 的序列化?
什么是java序列化:当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
Java中的序列化机制能够将一个实例对象(只序列化对象的属性值,而不会去序列化什么所谓的方法。)的状态信息写入到一个字节流中使其可以通过socket进行传输、或者持久化到存储数据库或文件系统中;然后在需要的时候通过字节流中的信息来重构一个相同的对象。
如何实现序列化:一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可。
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
25. 什么情况下需要序列化?
- 永久性保存对象,保存对象的字节序列到本地文件或者数据库中
- 通过序列化以字节流的形式使对象在网络中进行传递和接收
- 通过序列化在进程间传递对象
26. 泛型, 什么是类型擦除 ?
- 无限制类型擦除
当在类的定义时没有进行任何限制,那么在类型擦除后将会被替换成Object
,例如<T>、<?>
都会被替换成Object
。 - 有限制类型擦除
当类定义中的参数类型存在上下限(上下界),那么在类型擦除后就会被替换成类型参数所定义的上界或者下界,例如<? extend Person>
会被替换成Person
,而<? super Person>
则会被替换成Object
常用的通配符为:T, E, K, V, ?
- ? 表示不确定的类型
- T(type) 表示具体的一个类型
- K和V分别表示键值对中的key和value
- E (element) 代表Element
27. 什么是泛型中的限定通配符和非限定通配符 ?
限定通配符对类型进行了限制,有两种限定通配符:
<? extends T>
它通过确保类型必须是T及T的子类来设定类型的上界;
<? super T>
它通过确保类型必须是T及T的父类设定类型的下界;
非限定通配符:类型为<T>
,可以用任意类型来替代
29. Java 中的反射是什么意思?有哪些应用场景?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
30. 反射的优缺点?
31. Java 中的动态代理是什么?有哪些应用?
- JDK动态代理
- CGLib字节码代理
AOP就是根据动态代理做的,@Transactional也是基于动态代理
spring boot 2.x版本默认为CGLib动态代理
如果类实现了接口,使用JDK代理,否则使用CGLib
动态代理的应用:Spring的AOP,加事务,加权限,加日志
32. 怎么实现动态代理?
- JDK动态代理
被代理类首先要实现接口,创建一个处理类实现InvocationHandler
接口,重写invoke
方法,在invoke方法里写增强代码,还要写一个获取代理对象实例的方法,通过Proxy.newProxyInstance
实例化
public Object getInstance() {
return Proxy.newProxyInstance(
this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(),
this);
}
- CGLib字节码代理
被代理类不能为final类,创建一个类实现MethodInterceptor
接口,重写intercept
方法,在intercept方法里写增强代码,同样需要一个获取代理对象的方法,通过Enhancer
创建代理对象
public Object getInstance(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
33. static 关键字的作用?
(1)static成员变量
java中可以通过statin关键字修饰变量达到全局变量的效果。static修饰的变量(静态变量)属于类,在类第一次通过类加载器到jvm时被分配内存空间。
(2)static成员方法
static修饰的方法属于类方法,不需要创建对象就可以调用。static方法中不能使用this和super等关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态方法。
(3)static 代码块
JVM在加载类时会执行static代码块,static代码块常用于初始化静态变量,static代码只会在类被加载时执行且执行一次。
(4)static内部类
static内部类可以不依赖外部类实例对象而被实例化,而内部类需要在外部类实例化后才能被实例化。
静态内部类不能访问外部类的普通变量,只能访问外部类的静态成员变量和静态方法。
34. super 关键字的作用?
1、super表示超(父)类的意思,this表示对象本身
2、super可用于访问父类被子类隐藏或着覆盖的方法和属性,使用形式为super.方法(属性)
3、在类的继承中,子类的构造方法中默认会有super()语句存在(默认隐藏),相当于执行父类的相应构造方法中的语句,若显式使用则必须位于类的第一行
4、对于父类有参的构造方法,super不能省略,否则无法访问父类的有参构造方法,使用形式为super(xx,xx…)
35. 字节和字符的区别?
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号,比如’A’、‘B’、‘$’、'&'等。
一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
字节与字符:
- ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
- UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
- Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
- 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
- UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
- UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。
36. String 为什么要设计为不可变类?
1)常量池的需要
字符串常量池是 Java 堆内存中一个特殊的存储区域,当创建一个 String 对象时,假如此字符串在常量池中不存在,那么就创建一个;假如已经存在,就不会再创建了,而是直接引用已经存在的对象。这样做能够减少 JVM 的内存开销,提高效率。
2)hashCode 的需要
因为字符串是不可变的,所以在它创建的时候,其 hashCode 就被缓存了,因此非常适合作为哈希值(比如说作为 HashMap 的键),多次调用只返回同一个值,来提高效率。
3)线程安全
就像之前说的那样,如果对象的状态是可变的,那么在多线程环境下,就很容易造成不可预期的结果。而 String 是不可变的,就可以在多个线程之间共享,不需要同步处理。
37. String、StringBuilder、StringBuffer 的区别?
1、运算速度比较(通常情况下):StringBuilder > StringBuffer > String
2、线程安全性:StringBuilder(非线程安全),StringBuffer(线程安全的)
3、总结
String:适用于少量的字符串操作。
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
39. String str = “i” 与 String str = new String(“i”) 一样吗?
不一样
40. String 类的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
ength():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
41. final 修饰 StringBuffer 后还可以 append 吗?
可以。final 修饰的是一个引用变量,那么这个引用始终只能指向这个对象,但是这个对象内部的属性是可以变化的。
42. Java 中的 IO 流的分类?说出几个你熟悉的实现类?
- 按照流的流向分,可以分为输入流和输出流;
- 按照操作单元划分,可以划分为字节流和字符流;
- 按照流的角色划分为节点流和处理流。
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
按操作方式分类结构图
按操作对象分类结构图
43. 字节流和字符流有什么区别?
1、定义
字节流是一种执行8位字节输入和输出的机制,基本单元为字节;而字符流是Java中执行16位Unicode输入和输出操作的机制,基本单元为Unicode码元。
2、结尾
字节流以stream结尾;而字符流以reader和writer结尾
3、处理方式
字节流是最基本的,采用ASCII编码;它通常用于处理二进制数据,它是按字节来处理的,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元。
字符流采用Unicode编码,它是按虚拟机的encode来处理,也就是要进行字符集的转化;它通常处理文本数据,它支持写入及读取Unicode码元。
4、缓冲区
字节流默认不使用缓冲区;字符流使用缓冲区。
44. BIO、NIO、AIO 有什么区别?
BIO
同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销
NIO
同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理
AIO
异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理,一般适用于连接数较多且连接时间较长的应用
伪异步I/O
伪异步I/O采用了线程池实现,因此避免了为每个请求创建一个独立线程造成线程资源耗尽的问题,但由于底层依然是采用的同步阻塞模型,因此无法从根本上解决问题
如果单个消息处理的缓慢,或者服务器线程池中的全部线程都被阻塞,那么后续Socket的I/O消息都将在队列中排队。新的Socket请求将被拒绝,客户端会发生大量连接超时
二、Java异常
1. finally 块中的代码什么时候被执行?
finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值
2. finally 是不是一定会被执行到?
不一定
当程序进入try块之前就出现异常时,会直接结束,不会执行finally块中的代码
当程序在try块中强制退出时也不会去执行finally块中的代码
3. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,如果finally中有return,则会覆盖catch中的return
4. try-catch-finally 中那个部分可以省略?
以下三种情况都是可以的:
try-catch
try-finally
try-catch-finally
可以省略catch或者finally。catch和finally不可以同时省略。
5. Error 和 Exception 的区别?
6. 运行时异常与受检异常有何异同?
同上
7. throw 和 throws 的区别?
throw抛出一个异常
throws在方法上声明可能抛出的异常