中通——面试题

Java面试题

1、如何构建自己的事件机制?
类EventObject作为父类用来生成我们自己的事件类,接口EventListener用来实现我们自己的监听器;剩下的事情就是如何注册这些事件以及测试他们了。

2、Tomcat的工作原理?
Tomcat用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用。

3、对非Http通信协议或私有协议,一般解析的思路?
暂时还未涉及网网络协议这块,只是对http协议的一些概念问题有些了解

4、Netty与SpringBoot的集成方式?
(1)在pom.xml中添加以下依赖
(2)让SpringBoot的启动类实现CommandLineRunner接口并重写run方法
(3)创建Netty的相关类,配置类等
(4)application.yml文件中对于netty的一个配置

5、Activiti工作流中,如果要实现根据工作负荷来安排任务,有什么思路?
上家公司用到了Activiti工作流,但是不是我负责的模块,可以试着解析流程定义文件,取出文件中定义的所有节点,在父节点上进行判断,根据子节点的数量,对工作复合进行区分。

6、条件概率的含义是什么?在AI中有什么应用?
大致理解为数学中的概率学,推测是可以呈现出智能的效果

7、采用SprigngCloud之后,代码开发,日志,异常链,管理,排除故障等方面应有什么调整?
代码开发:耦合度比较低。不会影响其他模块的开发。减轻团队的成本,可以并行开发,配置比较简单,基本用注解就能实现;
日志:借助ELK+Kafka进行分布式的日志收集;
异常链:使用Hystrix组件进行熔断或服务降级;
管理:Eureka可以实现服务注册与发现,Zuul实现服务的路由和服务过虑等工作;
排除故障:借助分布式日志收集工具,确定服务端的位置进行调整

8、Git分支应如何管理?版本管理,单元测试,持续集成,持续部署Docker,这些步骤应如何减少人工干预?
(1)创建分支:git branch <分支名>
(2)切换分支: git checkout <分支名>
(3)删除分支:git branch -d <分支名>
可以试着建一个临时的分支,完成测试后在合并到master中,docker部署的话可以使用docker-compose.yml进行配置,写好多个容器之间的调用关系。

9、在TCP的连接时,三次握手,四次挥手。为什么会挥手次数比握手次数多?如果TCP连接异常中断后,服务器的Socket应什么时候关闭?
①三次握手是为了确保可以开始正常通信了,四次挥手,要告知没有数据要发送了,这就是多的一次。
②应该是有配置,具体的没有涉及

10、Java Serializable的作用,Equals,==的区别?
Serializable的作用
①对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。
②可以将对象持久化到介质中,就像实现对象直接存储。
③允许对象自定义外部存储的格式。
Equals,==的区别
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

11、实体类为未来参与排序等集合的操作操作,一般要重新哪些方法?有哪些注意点?
需要排序的对象需要实现comparable接口,然后重写compareTo方法,但是方法会增加耦合度,在项目中不同位置使用的时候要根据不同需求反复修改排序规则。更好的方法可以通过匿名类,new一个Comparator类,然后实现compare方法

12、跨域的含义
要了解跨域,先要说说同源策略。所谓同源是指,域名,协议,端口相同,有一个不一样则是跨域。

13、接口保证幂等性,如何做的
①对于每个请求必须有一个唯一的标识,举个例子:订单支付请求,肯定得包含订单 id,一个订单 id 最多支付一次。
②每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录个状态啥的,比如支付之前记录一条这个订单的支付流水。
③每次接收请求需要进行判断,判断之前是否处理过。比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId 已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。

15、@transcation事务应放置在什么位置,在项目中如碰到事务什么原因不生效?
① 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
②不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
③3.使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。方法只能是public修饰
项目中如碰到事务问题:在公司自己内部系统,需要Oracle转为MySQL,在保存方法中出现回滚异常,最终发现是没有设置主键的自增,应为Oracle没有默认的主键自增功能。

16、Jackson在反序列化中,如果对象是双向关联,如何进行处理?
使用 @JsonIgnoreProperties 注解
在实体类声明处加上@JsonIgnoreProperties(value={“hibernateLazyInitializer”,“handler”})注解;

17、SpringBoot异常的设计的原理
BasicErrorController,这个类是默认处理/error请求的,前者返回ModelAndView,后者返回json数据;
项目中自定义一个异常处理类加上@ControllerAdvice注解,通过@ExceptionHandler触发不同的处理方法。

18、扫码登录的原理
①:用户访问淘宝网页版,服务器为这个会话生成一个全局唯一的 ID,上面的 URL 中 lgToken 就是这个 ID,此时系统并不知道访问者是谁。此时和浏览器建立长连接,实时监测二维码状态。(1000为未过期,1004为二维码过期状态)突然间发现淘宝好像使用的jsonp解决跨域问题的。
②:用户打开自己的手机淘宝并扫描这个二维码,并提示用户是否确认登录。
③:手机上的淘宝是登录状态,用户点击确认登录后,服务器就得到了用户以及全局唯一ID,服务器将这个 ID 和用户 淘宝号绑定在一起,在后台重新生成令牌。
④:通知网页,这个 ID 对应的账号为用户 ,网页版加载用户 的信息,至此,扫码登录全部流程完成

19、是否有自己的Git地址
https://gitee.com/eric_chensu
用来搭建分布式配置中心的

20、在应用系统中,如何实现主数据管理?
我上家公司的话会有专门的实施人员对数据进行维护,后台数据的话,我们会定期的备份

21、如阅读过源码,分析一下该源码给你的体会?是否参加过开源代码?
源码中会使用到很多的泛型,可以扩展我们的思路,这是变相增加我们经验。但是暂时未参加过凯源代码。

22、前后端分离开发,日志应该如何进行记录,在出现问题的时候,方便定位问题?
之前项目开发中使用日志记录API是log4j,设置参数为log4j.rootLogger=INFO,CONSOLE,FILE
log4j.addivity.org.apache=true
分为控制台和文件两个部分,客户端可以在浏览器上发现出现问题的url,然后到后台对方法进行debug调试对比参数等问题

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值