Java 后端技术总结

2021-04-10  本文已影响0人  wanglei1702

01、HashMap的特性

Map 集合特点:

02、HashMap集合的扩展

03、Java虚拟机中的内存模型

jvm 有以下几种内存空间

04、线程内存空间(扩展)

05、Java中的异常处理机制的简单原理和应用。

基类:Throwable,派生了两个子类:Error 和 Exception
Error 是 JVM 本身的错误,不能被程序员处理,如内存溢出等
Exception 分为:IOException 和 RuntimeException
Error 和 RuntimeException 及它们的子类,是非检查异常,即编译时不会发现这些可能的异常,不需要特殊处理;
而检查异常在编译时即可检查出可能存在,需要用 try.catch 处理,或者用 throws 抛给上一层处理;
扩展:Spring 框架的事务默认是 RuntimeException 才回滚,可以通过修改 @Transaction 注解中的 rollbackFor 属性来指定为 Exception 回滚

06、创建线程的几种方式?

07、垃圾回收机制

如何判断哪些对象需要回收(内存管理)

08、HashCode()、equals()的区别

09、String,StringBuilder,StringBuffer三者的区别

10、是否可以从一个static方法内部发出对非static方法的调用

11、wait方法和sleep方法的区别

12、问题扩展&应用场景

线程的生命周期:

13、new String("xyz") 创建了几个StringObject?是否可以继承String类?

14、多线程中解决同步问题的方式

15、这两行代码执行后,原始的String对象中的内容到底变了没有

String s = "Hello";
s = s + "world!";

原始的 String 对象有 "Hello" 和 "world!", + 运算符运算之后会创建新的 String 对象 "Helloworld!",而原有的 String 不会改变
String 是不可变字符串,如需可变字符串,可以用 StringBuilder 或 StringBuffer

16、HashMap和Hashtable的区别

HashMap:

HashTable:

17、单例设计模式中懒汉式和饿汉式的区别

18、类加载机制

类装载器将 Class 文件装载后,形成描述 Class 结构的元信息对象,包含 Class 的结构信息:如构造函数、属性和方法等;
虚拟机把描述类的数据加载到内存,并对数据校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java类型

19、cookie和session的区别与联系

20、在HTTP请求中,如何选择 GET 和 POST

22、servlet的生命周期及常用方法

如何保证 servlet 线程安全:
servlet 是单例,所以可能会有线程安全问题,可以通过不使用全局变量来避免线程安全问题
servlet 也可以配置多例模式,但已被废弃;还可以加锁,但是对性能影响较大,不推荐

23、转发和重定向的区别

32、http,https,ftp,talnet的默认端口

33、常见的http返回状态码

34、TCP和UDP区别,HTTP协议

36、Spring AOP的实现原理

37、IOC和DI的关系

38、Spring 中的设计模式

39、Spring中Bean的作用域

40、spring框架实现实例化和依赖注入的方式

- spring 实现实例化的方式:spring 获取类字节码文件,并通过构造函数进行实例化

41、springMVC的执行流程

42、spring和springMVC中的常用注解

43、springMVC和structs2的区别

44、springMVC中的前端控制器和处理器映射器

45、springMVC如何实现请求参数绑定

46、springMVC获取表单数据的几种方式

47、ssm整合流程

49、mybatis中#和$传参的区别

50、mybatis中的动态sql语句

51、mybatis映射配置文件的编写规范

52、mybatis的执行过程分析

53、常见设计模式及应用场景?

54、两种动态代理的区别

56、日志文件的管理

日志文件的管理

57、分布式开发的缺点

58、支付接口

60、RabbitMQ 在项目中的应用

订单超时处理,死信队列(交换机)

61、RabbitMQ 数据提交不成功

有消息回执机制

63、dubbo服务开发流程,运行流程

65、广告数据用 redis 缓存

用 redis 的 hash 类型数据存储不同类型的广告, redisTemp late.boundHashOps("").get("");

66、权限控制

后台管理系统用到权限控制;
用 Spring Security 框架,包含用户、角色、权限的概念,对应数据库表用户表、角色表、权限表,由于是多对多的关系,所有还有用户角色表、和角色权限表两个中间表

67、RabbitMQ 消息丢失问题

68、token 校验

用到 jwt 令牌作为 token,用户登录,服务端生成 jwt 令牌返回给客户端,客户端下次请求时带上 jwt 令牌,服务端校验 jwt 令牌是否合法,并判断用户的权限

70、redis 缓存与数据库同步

客户端请求进来,如果 redis 中有数据,则直接返回,若 redis 中没有数据,则从 mysql 中查询并保存到 redis中。
若数据库中数据有更新,则同步更新 redis 数据。
如广告数据,商品搜索(redis 中存储分类对应的品牌、分类对应的规格)

71、fastDFS 的执行流程

fastDFS 是分布式文件系统,分为 tracker 和 storage 两层,storage 是存储文件的服务器,tracker 是用来决定存储到哪个 storage 的;
storage 会定时发送心跳给 tracker。
存储文件时,客户端先请求 tracker,tracker 根据负载均衡,返回一台 storage 的 ip 地址和端口,客户端根据 ip 和端口访问 storage,并传输存储文件,storage 生成文件的 file id 并返回给客户端,客户端存储 file id;
查询文件时,客户端同样请求 tracker,tracker 返回 storage 的 ip 和端口,客户端再去访问 storage 获取文件

72、zookeeper集群全部都挂了处理方式

消费者会把服务提供者的地址列表缓存,所以即使 zookeeper 挂了,消费者也可以直接从地址列表中选一个去访问服务提供者;
如果服务提供者地址改变,而 zookeeper 挂了,则消费者无法从 zookeeper 获取新的地址,也就无法访问服务提供者

73、解决购物车内存大小问题

如果没有登录,购物车可以用 cookie 来存储,大小限制 4k,替代的方式是用 session,最大支持 1M,前端的 localStorage 5M,或者服务端的 redis,mysql;
一般没有登录就用 cookie,登录后就用 redis

74、springboot 和 springcloud 的关系

76、Java 的四个基本特性(抽象、封装、继承,多态)

77、构造器 Constructor 是否可被 override

构造器不能被 override,因为构造器不能被继承
但是可以被重载 overload

79、多线程与死锁

实现多线程的方式:

- 1、继承自 Thread 类,重写 run() 方法, 调用 start() 方法开启一个线程
- 2、实现 Runnable 接口,重写 run() 方法,new 一个 Thread 对象,自定义的类创建的实例传入,调用 Thread 的 start() 方法开启一个线程; 或者通过 ExecutorService 来开启一个线程
- 3、实现 Callable 接口,重写 call() 方法, 通过 ExecutorService 来开启一个线程 

多线程相关的方法:

- sleep : 休眠
- join : 阻塞当前线程,执行传入的线程,可以用来实现等待其他线程执行完之后再继续执行当前线程
- yield : 暂时不继续执行,但是后续会继续执行,由任务调动者决定

死锁:
两个线程在互相等待对方释放锁,而双方都没有释放自己所持有的锁,导致两个线程都阻塞,也就是死锁

80、产生死锁的方式

两个线程在互相等待对方释放锁,而双方都没有释放自己所持有的锁,导致两个线程都阻塞,也就是死锁

81、内存溢出和内存泄漏

内存溢出:程序可用的内存已全部被占用,不能申请更多内存,导致内存溢出
内存泄漏:应该被释放的内存没有被释放,且不能被当前程序或其他程序使用,即是内存泄漏

83、Spring 事务的传播特性

参考:https://juejin.cn/post/6844903938928427022

84、SpringMVC 原理

SpringMVC 基于 servlet,将 servlet 封装,请求派发给控制器,并通过模型对象封装响应视图,我们只需关注 controller 的业务实现;SpringMVC 的核心类是 DispatcherServlet,前端控制器,我们所编写的 controller 也叫后端控制器

85、linux常用命令

86、数据库事务隔离级别

讨论事务隔离级别之前先讨论事务并发可能出现的情况(问题)

- 脏读:一个事务读到另一个未提交事务修改过的数据
- 不可重复读:一个事务执行过程中读同一条数据出现了不同的结果,因为其他的事务对这条数据进行了修改操作
- 幻读:一个事务根据某些条件查询一些记录,过程中其他事务插入了符合条件的记录,则这个事务再次根据同样的条件查询会得到不同数量的记录

数据库隔离级别

隔离级别的作用是让不同的事务相互隔离,互不影响,保证事务的一致性,分为以下四个级别

- 读未提交:可能出现 脏读、不可重复读、幻读(都能出现,一般不用)
- 读已提交:可能出现 不可重复读、幻读(解决脏读,一般不用)
- 可重复读:可能出现 幻读(解决脏读、不可重复读),一个事务只能在当前事务提交后,才能读到其他提交后的事务修改后的数据;这是 MySQL 的默认事务隔离级别
    问:为什么上了写锁(写操作),其他事务还可以进行读操作?
    答:InnoDB 有多版本并发控制,可以读快照,不会阻塞
- 可串行化:问题都不会出现,但对性能影响较大

隔离级别比较:可串行化 > 可重复读 > 读已提交 > 读未提交
对性能的影响:可串行化 > 可重复读 > 读已提交 > 读未提交

87、SQL 注入的原理,如何预防

注入原理:传入参数中包含 sql 语句关键字,从而修改 sql 语句的条件
如删除指定 username 的记录: delete from t_user where username = ?;
传入参数:zhangsan or 1 = 1
完整语句:delete from t_user where username = zhangsan or 1 = 1;
这样判断条件对所有记录都成立,会删除所有数据,username 的判断没有作用

如何预防:

88、SQL性能优化

SQL 语句优化:

89、myBatis 常用标签,批量操作

批量操作:

上一篇 下一篇

猜你喜欢

热点阅读