面试题及答案汇总

1)简述spring

为解决复杂企业应用而生, 优点在于其分层结构,架构上面7个组成, core, AOP, orm, web, mvc, context, dao

控制反转和依赖注入, AOP 是核心

2)说一下怎么理解spring中的IOC

控制反转

之前是底层控制上层,现在改为上层控制底层,方便底层和上层的解耦。

之前是代码控制权,转为容器控制

参考:https://www.zhihu.com/question/23277575

3)spring中的AOP的实现原理是怎么样的?

AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

AspectJ的静态代理:它会在编译阶段将Aspect织入Java字节码中, 运行的时候就是经过增强之后的AOP对象。

Spring AOP使用的动态代理:所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

4)java的垃圾回收你是怎么理解的?

垃圾回收机制:

1. 引用计数法。这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题

2. 可达性分析法。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程

5)说一下你用过或者了解过的中间件,例如redis, dubbo等

6)springmvc是如何做到一个http请求就能执行到对应的controller方法

spring通过调度器DispatcherServlet进行调度, DispatcherServlet是整个SpringMVC的入口。

对于请求到Controller的映射,比较重要的是HandlerMapping和HandlerAdapter,HandlerMapping是用来查找处理请求的对象,HandlerAdapter是用来处理请求参数。

doDispatch方法的流程。

  1. 获取Handler
  2. 获取Adapter
  3. 执行preHandle方法
  4. 执行Handle方法
  5. 执行PostHandle
  6. 处理返回结果

7)java中针对线程同步是怎么做到的?

1. 同步方法

2. 同步代码块

3.wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

4. notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

5.使用特殊域变量(volatile)实现线程同步

8)有一张订单表,里面有1亿条数据,如何快速统计出每个用户的订单数目

 使用多个库创建多张表,如1024张表(单库或少量库会存在TPS(吞吐量)瓶颈),这样每张表只要保存约100万数据。

然后针对用户id和订单id建立索引, 每个表进行group by统计出结果后再合并统计


9)什么是缓存穿透、缓存雪崩,如何处理?

缓存穿透:是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩:是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

10)jmm的模型,简述一下?


11)获取一个数组的长度,是访问数组的length方法还是length属性? length属性
获取一个字符串的长度,是访问字符串的length方法还是length属性? length方法

12)HashMap的实现原理

根据上面 put 方法的源代码可以看出,当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部——具体说明继续看 addEntry() 方法的说明。

13)mysql中的索引存储结构

B tree(多路平衡树)

14)CurrentHashMap如何实现线程安全的?

通过同步锁

15)了解CAS吗?知道UnSafe类吗?知道AQS吗?简述一下

CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。

java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。

1、通过Unsafe类可以分配内存,可以释放内存;

2、可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;
3、挂起与恢复
4、CAS操作
16)mysql有哪些优化策略
17)dubbo的底层实现原理
19)说一下你的优势
20)说一下你擅长的技术优势
21)有数组[8,2,-1,0,5,9,20,32]请写出算法,顺序排列数组
22)学生表S(S#,SN,SD),其中S#主键,SN为学号,SD为部门,课程表C(C#,CN),其中C#为主键,CN为学号,学生选课表SC(SC#,S#,C#)其中SC#为主键,S#为学生主键,C#为课程主键
请写出以下SQL语句:
    a) 请用嵌套的sql语句,统计课程名称为“税收”的学生的学号,部门


23)写一个单例模式

class Singleton {

private static valitile Singleton singleton = null;

public static sychronized Singleton getSingleton() {

     if (singleton == null) {

          singleton = new Singleton();

     }

  return singleton;

}

private Singleton() {

}

}

24)了解负载均衡吗?自己手动搭建过吗?说下自己的理解

1.DNS负载均衡 

2. 反向代理负载均衡

3. Http重定向负载均衡 

nginx

轮询, 权重, IP hash, URL hash, least_conn

25)有做过分布式系统吗?或者自己手动搭建过集群环境吗?
26)说一个你觉得最好的一个项目?画一下它的整体架构?

27)解释下volatile的关键字的作用,及实现原理。

(1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。保证可见性、不保证原子性。 
(2)禁止进行指令重排序。

28)说一下对象序列化的理解;如何实现两个jvm之间传输java对象

1、什么情况下需要序列化   
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值