JAVA面经之回忆版-慢慢更新

回忆版:

1.continue和break在循环中的区别?

continue是跳出当前循环,break是结束循环

2.finally和catch?

无论是否catch都会走向finally

3.HashMap和ConcurrentHashMap

底层源码:

JDK1.8都是由数组+链表+红黑树构成,底层将<key,value>封装成一个Node,然后计算key的哈希值,ConcurrentHashMap包含一个table数组,类型是node数组,用了volitale关键词修饰,保证了多线程哈希表的可见性,是线程安全的。

4.Spring全家桶

       4.1 SpringMVC的模式?

        SpringMVC分为三部分,Model层放dao、service、entity等,主要处理业务逻辑。View层负责前端页面的展示,包括jsp、html等。Controller层负责调用业务、接受请求。运行模式:把web包丢入tomcat,启动tomcat会加载web.xml文件,后面解析请求。

        4.2 SpringBoot是什么?为什么要用SpringBoot?

            SpringBoot是一套开源的框架,为了简化Spring应用的开发,可以自动配置,快速开发,并且可以嵌入微服务。

         4.3Spring的两大核心,IOC和AOP?

        IOC是控制反转,在没有IOC之前,要想得到一个已经定义的对象,需要new一个新的对象而用了IOC之后,把这个对象放到一个容器里,比如@Service,@Controller,@Component就是IOC。然后通过DI注入,也就说@AutoWired。

        AOP是面向切面编程,就是不改变源码的情况下,通过预编译和动态代理来对业务进行隔离,降低耦合度。比如日志,性能检测等。

5.SpringCloud组件?

       5.1什么是注册中心?nacos,euraka

在微服务中,一个大型服务有很多微服务,那么多服务的实例,消费者如何知道每一个的地址?或者当一个服务宕机之后,别的服务万一还在调用,不是出现问题了吗?为了解决这个问题,要用到注册中心。服务启动时把ip、端口号注册到注册中心中,服务调用者去注册中心调用这个微服务。

                5.1.1nacos的服务注册与发现机制?

                服务的消费者要去nacos订阅服务,就是发现。他可以通过轮询,负载均衡,挑选一个实例进行订阅。

        5.2什么是负载均衡?Ribbon

负载均衡就是把用户发送的注册中心的请求在服务列表中轮询,选择响应时间小的一个,避免服务器崩溃

        5.3什么是远程调用?feign

 封装服务的接口,然后进行跨服务调用。

        5.4什么是服务保护?

如果一个服务出现了超过50%的接口失败率或者更多,就会触发服务降级或熔断,禁止使用这个服务直到修好。

        5.5什么是网关? Spring Cloud Gateway

application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/myservice/**
        - id: my_route2
          uri: http://localhost:8082
          predicates:
            - Path=/myservice2/**

在这个配置中,我们定义了两条路由规则:

  • 当请求路径匹配/myservice/**时,转发到http://localhost:8081

  • 当请求路径匹配/myservice2/**时,转发到http://localhost:8082

6.项目中主要用redis做了什么?为什么不用mysql

       用redis存储登录信息或临时信息,还用了延时队列解决订单超时问题。首先无需占用数据库资源,其次因为不存在磁盘上,读写速度快。而且,redis是单线程模型,在处理高并发问题时性能更出色,如果用mysql要加锁。

        6.1说一下redis的延时队列?

                redis延时队列不是专门的MQ,可以处理简单的超时任务,使用方法是创建一个阻塞队列和延时队列,有延时任务就添加到延时队列里,当消息到期后,会从延时队列转到阻塞队列被消费者接收。

7.项目中的难点?

        1.商城中用户同时下单导致的商品超卖,库存被扣成负数。而且会重复生产订单,导致后续的业务有问题,比如重复发货。

解决方法是:使用redis的分布式锁senNx解决这个问题,获取到锁之后处理订单,如果没有锁就不处理,处理完订单后删除锁。

重复产生订单的解决方法是建一个唯一的订单索引,并结合RabbitMQ,解决同时下单带来的并发问题对后台进行冲击,用户下单后,先不处理业务逻辑,而是把请求封装成消息发送到队列中,消费者MQ取出信息,处理逻辑前先获取redis锁,只有获取到锁的才会执行请求。

        2.合同管理:业务员同时修改合同导致的数据库死锁,出现卡死。

解决方法:使用乐观锁,对于更新的数据更新乐观锁字段。

8.用过什么数据库?

MySql和Oracle。

区别:MySql主要用于中小项目,Oracle用于大项目且安全性高的项目。

从费用来看:Mysql费用低,Oracle费用高。

从选型上看:项目是否存在高并发情况?mysql以表级锁为主,加了索引之后才是行级锁。而oracle是行级锁,且加锁在数据库的数据行上,并发的兼容性好得多。

从类型来看:Oracle是面型对象数据库管理系统,而Mysql是关系数据库管理系统。

9.Mybatis和Mybatis-plus区别?

mybatis是写sql在mapper里然后调用,而mp的功能更多,例如代码生成器,分页插件等。并且可以继承basemapper实现简单的crud。

10.SQL题

1.统计商品购买额最多的前五个

SELECT 商品名,(购买量*购买数) AS BUY from 商品表 order by buy desc group by 商品名 limit 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值