赞
踩
目录
最近趁着金三银四面了五六家公司吧,也整理了一些问题供大家参考一下(适合经验三年左右的)。
1.自我介绍简单一点吧,把自己的情况说清楚,一两分钟即可。
2.微服务的组件
答:微服务是把一个类似单体项目根据某种维度进行拆分,比如根据功能模块进行拆分。
拆分之后,具备了更好的抗压性/扩展性,还可以更好的解耦,但是维护相比之前会更麻烦了
常用的组件有Spring Cloud。其中里面有:
Nacos:用来做注册中心/配置中心
Gateway:用来做网关
Hystrx:做限流、熔断、降级
Dubbo:做服务间的调用
Feign:也是服务间的调用
3.mq的运用
答:本项目中是用作削峰和解耦。
4.项目的并发量
5.机器搭建
6.团队的规模
7.查询优化
答:索引
8.spring的知识点
9.@resource/@Autowired区别
答:(1)来源不一样:@Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解
(2)依赖查找的顺序不同:依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中,
@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找
@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找
(3)支持的参数不同:@Autowired 和 @Resource 在使用时都可以设置参数,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数
(4)依赖注入的用法不同:@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入
(5)编译器 IDEA 的提示不同:@Autowired 编译器会提示报错信息
10.设计模式
答:单例模式、设配器模式、工厂模式、代理模式
11.单例模式如何避免线程安全以及应用场景
答:
单例模式在多线程的,应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,
那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
应用场景:对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等
12.设计模式里面的工程模式?
答:(1)简单工厂模式:建立一个工厂类,对实现了同一接口的一些类进行实例的创建。优点是比较好理解,简单易操作。
缺点是类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改
(2) 工厂方法模式:对简单工厂模式的改进,使用一个工厂接口,创建多个工厂类,每个工厂创建对应的对象。
创建一个工厂接口和创建多个工厂实现类,一旦需要增加新的功能,直接增加新的工厂类就可以了,
不需要修改之前的代码。有利于代码的维护和扩展。
(3) 抽象工厂模式:
MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。
13.代码review工作的重点
答:(1)代码规范:命名、格式、内容、位置(包结构)
(2)耦合、性能、内存
13.sql xml语句(实体字段和数据库怎么对应?)
14.修改表结构语句(mysql中change和modify 的区别)
答:ALTER TABLE `ry-cloud`.sys_user_role CHANGE role_id role_id1 bigint(20) NOT NULL COMMENT '角色ID';
(1)change 可以更改列名 和 列类型 (每次都要把新列名和旧列名写上, 即使两个列名没有更改,只是改了类型)
(2)modify 只能更改列属性 只需要写一次列名, 比change 省事点
15.数据库mvcc(多版本解决的是读写并发冲突)
答:是数据库的多版本并发控制,在读取数据不用加锁也可以提高读取效率和并发性的手段。
实现原理:一种读取操作, 使用数据在某个时间点的快照显示查询结果, 而不考虑同时运行的其他事务所执行的更改.
如果查询的数据已被另一个事务更改, 则会根据undo log的内容重建原始数据. 该技术避免了一些锁定问题,这些问题可以通过强制事务等待其他事务完成来减少并发性.
隐含字段:一个事务最新id,回滚的指针16.不用or,会导致索引失效,如何改造?
答:(1)代码层面查两次
(2)或者用UNION来代替17.数据库视图、序列化、存储过程
答:(1)数据库视图:数据库一个或多个表导出的虚拟表,方便用户对数据进行操作。视图的数据依赖原数据,二者会互相影响。
(2)数据库序列化:是将数据结构或者对象转换成字节流、json等方便去存储或者是传输。
(3)18.数据库的事务
19.分库分表
答:关系型数据库容易成为系统瓶颈,链接数量,存储容量都是有限的,超过1千万之后因其查询维度的较多,性能会下降严重。
(1)垂直切分:分库:根据业务不同拆成不同库;分表:把不常用的字段或者长度比较大的字段拆到另一张表(主键跟着走)。缺点:只能在代码里面去聚合,增加了其复杂度
(2)水平切分:库内分表、分库分表。将按照不同的条件分散到多个数据库或者多个表中,使单表数据量变小。缺点:维护难度加大、跨分片的事务不好保证20.事务不生效的原因
答:(1)方法不是public;(2)异常被方法吞掉了;(3)抛出异常类型大于@Transactional 默认回滚的是 RuntimeException 和 Error;(4)非同一个线程
21.jdk 1.8的新特性
答:Lambda表达式、Stream API、map数据结构优化
22.java8函数式接口,Functional Interface
答:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。为lambda表达式和方法引用(用冒号::来进行方法的调用)提供目标类型
23.spring的知识点
24.aop底层
答:面向切面的编程,通过预编译和运行期间动态代理实现程序功能统一的技术。实现invocationHandle类则是JDK动态代理,否则是CGLib动态代理。
25.SpringCloud会出现那些安全问题
26..SpringBoot监听器
27.SpringBoot的优势以及创建方式
答:(1)主要是简化新spring应用的初始搭建和开发过程(使用IntelliJ IDEA,可以利用创建Spring Initializr的方式创建Spring Boot项目、
使用官方文档创建项目,在Spring官方文档上面提供了一种在线生成Spring Boot项目的方式、
使用Spring Tool Suite,可以直接新建Spring Starter Project项目)
(2)嵌入式Web容器、自动化配置、可执行Jar部署28.SpringCloud的配置文件
答:nacos或者阿波罗都可以。
29.springMVC(Model(模型)、View(视图)、Controller(控制器))
答:是一种软件设计规范,将业务逻辑、数据、显示分离的方法来组织代码,降低了视图和业务逻辑之间的耦合。
浏览器把请求放到试图层===控制器收到请求====模型处理数据=====返回视图===响应给浏览器
30.map的实现类
答:HashMap、TreeMap、
31.流的并行和串行
答:串行:Stream,并行:parallelStream(其底层使用Fork/Join框架实现,通过Fork把任务拆开,Join把结果进行合并)
32.环境切换(idea的设置)
答:spring.profiles.active====》VM options两处改动33.Java中的值传递和引用传递
答:(1)值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
(2)引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
个人认为:在一个类中调用其他方法,这个方法中如果是直接复制对象则是值传递,如果是在参数基础上改则是引用传递
34.反射应用场景答:(1)可以动态的加载类,并创建其实例。String className = "com.example.MyClass";
Class<?> clazz = Class.forName(className);
Object obj = clazz.newInstance();
(2)通过反射,我们可以在运行时动态地获取类的信息。这样就可以获取类的构造方法、字段、方法等信息,并进行相应的操作。35.异常处理,finaly里面的执行
答:(1)不管try中是否出现异常,finally块中的代码都会执行;
(2)当try和catch中有return时,finally依然会执行;
(3)finally中如果包含return,那么程序将在这里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了36.dubbo一次性数据量太大出现的情况
答:会出现Dubbo报错Data length too large;首先看这种大数据是不是符合双方约定的,如果是的话就去修改生产者xml payload参数,否则可以加一些限制。
37.throw 和 throws 的区别
答:throw代表动作,表示抛出一个异常的动作;
throws代表一种状态,代表方法可能有异常抛出throw用在方法实现中,而throws用在方法声明中;
throw只能用于抛出一种异常,而throws可以抛出多个异常
38.多线程锁
39.分布式锁原理
答:在多进程环境里面,通过外部的工具来达到加锁功能
40.redis的看门狗(在没有自定义释放时间才会生效)
答:是redission提供的自动延期机制,使得分布式锁可以自动延期,默认30秒。
41.分布式锁遇到的问题
答:(1)可能忘记了释放锁;(2)释放了别人的锁;(3)锁超时等问题
42.分布式锁的方式
答:redission、zk、数据库
43.线程池参数的设定
答:(1) IO 密集型任务:2*核心数+1
(2) CPU密集型任务:核心数+1
即使当计算(CPU)密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保 CPU 的时钟周期不会被浪费。
44.网络状态的含义:401等等
答:(1)401 Unauthorized:请求要求身份验证。客户端需要进行身份验证才能获取请求的内容。如果请求未包含有效的身份验证凭据,服务器可能返回此状态码。
(2)400 Bad Request:客户端发送的请求有错误。服务器不理解或无法处理客户端发送的请求。这可能是由于参数错误、缺少必要的信息或语法错误等引起的。
(3)403 Forbidden:服务器拒绝了客户端的请求。客户端没有访问请求的权限,无法获取请求的资源。
(4)404 Not Found:请求的资源不存在。服务器未能找到请求的资源。这可能是由于资源被删除或请求的 URL 错误等引起的。
(5)502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效的响应。通常表示上游服务器发生了故障或响应超时。45.如何快速找到nginx目录
答:(1)在默认安装位置下查看,大多数一般会安装在默认位置下(/usr/local/openresty/nginx 或/usr/local/nginx)
(2)查看nginx进程(ps -aux|grep nginx)
(3)nginx运行进程,执行ls -l /proc/进程号/exe ,然后会打印出安装/运行位置46.docker
答:docker是一个开源的应用容器引擎,开发者可以把程序及其依赖项打包到一个可移值的镜像中,可以在任意的linux/Windows系统上运行
这些镜像。47.主从复制
48.jvm调优
49.Linux命令
50.消息中间件的原理(Kafka、Pulsar 等等)以及项目运用情况
首先就是把自己的项目讲清楚,特别是自己项目涉及的技术尽量把底层也弄懂,现在的面试占比可能项目占70%,八股文也就30%。如果有涉及笔试的话,建议多看看表结构设计,sql要能手写出来比较好。还有就是自己的简历可以多优化一下,不要太简单了,多找厉害的朋友参考参考。
其次感觉整个行情变差了,工资也压得厉害。对于中小型自研公司他们需要比较全能的人吧,对于我这种底层码农感觉横向的学习挺重要的,比如前端开发、Python这种可以多学学。
对于社招感觉面比较窄,比如零售的行业你必须要有零售开发项目,制造业你可能得会ERP之类的。
感觉现在五年经验还挺受欢迎的,随便瞎写的,大家将就看。
外包慎重,加油!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。