2021年2月11日至2021年2月17日面经分析

2021年2月11日至2021年2月17日面经分析

2021年2月11日至2021年2月17日面经分析

Java后端实习生面经分享

Mybatis用过的命令

这道题目问的应该是用过哪些Mybatis的标签,Mybatis的标签有:

  • insert
  • update
  • select
  • delete
  • foreach
  • sql
  • where
  • if
  • resultset
  • paramaterset

Mybatis注解和xml区别

Mybatis使用注解来引入SQL,比较方便,不需要使用XML文件。但是缺点在于,每次修改之后都需要重新编译。使用XML,就比较麻烦一些,增加了Mapper的XML文件之后,需要修改配置。好处就在于方便修改,修改之后不需要重新编译。

请描述一下JMM

JMM是Java Memory Model的简称,表示为Java内存模型。
所有的变量都保存在主内存中,每个线程拥有自己的工作内存。一个线程对于变量的操作必须在工作内存中进行,所以当一个线程要操作变量时,需要先将变量从主内存中拷贝到工作内存。操作结束之后再将工作内存中的变量刷回到主内存中。所以一个线程无法看到另外一个线程工作空间中的变量拷贝。

线程之间的通讯方式?

全局变量

volatile能有什么作用,为什么能只保证可见性却不保证原子性?

volatile能够保证可见性和有序性,但是不能保证原子性。

volatile在字节码getfield、setfield上使用了内存栅栏,所以可以保证工作空间中的变量会被强制刷回主内存,且保证其他线程的工作空间中的变量过期。所以保证了可见性。但是volatile没有对操作进行上锁,所以它是没有保证原子性的功能的。

分布式锁

分布式锁可以使用redis的setenv实现。
TODO

是否了解索引,简要描述

索引是使用哈希算法或者B+树算法,重新组织数据,以达到快速查找数据目的的一种辅组结构。索引根据算法的不同,可以分为哈希索引和B+树索引,哈希索引能够用于等于查找,时间复杂度可达到O(1)。B+树索引可以用于范围查找,时间复杂度为O(lgn)。

各种索引的区别

根据不同的分类可以分成多种索引。
根据哈希算法的不同,可以分为哈希索引和B+树索引。哈希索引用于等于不等于比较,B+树除了用于等于不等于比较,还可以用于范围比较。
还可以分为聚簇索引和非聚簇索引。一个表只有一个聚簇索引,一般为主键索引。可以用拥有多个非聚簇索引。

集合类都有什么

实现Collection接口的有ArrayList、LinkedList、HashSet、ArrayDeque等等
实现Map接口的有HashMap、TreeMap、HashTable、ConcurrentHashMap等

ArrayList和LinkedList的区别,各自优缺点,适用场景,实现方式

最主要的区别在于底层存储结构的不同,ArrayList的底层存储时数组,数组的特点是访问效率高,时间复杂度O(1)。但是数组长度是固定的,所以在达到阈值时,需要扩容。LinkedList的底层存储时链表,链表的特点是添加删除方便,时间复杂度是O(1),但是查找的时间复杂度是O(n)。

所以如果添加删除频繁的,建议使用LinkedList,如果查找频繁的,建议使用ArrayList。

常用算法都会啥

排序算法:快排、堆排序、归并排序、冒泡排序、插入排序
查找算法:二分查找

排序算法,请描述快速排序和归并排序的思路

快排的思路:找一个基准值,小于基准值和大于基准值的数据分成两部分。再对这两部分结果重复此操作。

归并排序思路:将待排序的内容一分为二,对一分为二的内容递归进行归并排序,得到两个有序的结果,再合并两个有序结果,得到最终结果。

是否了解JUC,请讲出有什么JUC组件

atomic
lock
ConcurrentHashMap
线程池

线程池是否理解,都有哪些参数

线程池就是一个池化技术,线程池中维护了多个线程,方便多线程中获取线程。减少了资源的获取和释放,提高了性能。

有7个核心参数:

  1. 核心线程数
  2. 最大线程数
  3. 线程工厂
  4. 空闲时间
  5. 空闲时间单位
  6. 拒接策略
  7. 工作队列

线程池的核心线程数,最大线程数,队列之间的关系。new新的线程是怎样的逻辑?

在线程池中的线程数量未达到核心线程数时,每提交一个任务,线程池会趋向于新建一个线程。在线程池中的线程数大于核心线程数,却小于最大线程数时,提交任务时,会将任务添加到工作队列。如果工作队列添加失败,则尝试新建一个线程。如果新建一个线程失败,则调用拒接策略。

上来就直接:你说一下擅长的框架/组件/工具……

集合组件

熟悉JUC中的一个类

ConcurrentHashMap。使用了分段锁的概念,在保证线程安全的同时,保证了效率。

说一下读写锁ReadWriteLock。如果线程A已经有读锁,那么线程B能否获得写锁?

读写锁ReadWriteLock分为读锁和写锁,读锁可以重复获取,写锁不可以。当线程A已经拥有读锁,线程B不可以获取写锁。

线程进入写锁的前提条件

写锁跟读锁和写锁都相斥,所以条件是:

  1. 没有其他线程获取读锁
  2. 没有其他线程获取写锁

linux修改文件权限的命令。chmod+751 具体是什么权限?

修改权限的命令是:chmod

chmod+751表示给文件拥有者读写操作权限,给文件所在的群组读和操作的权限,给其他人操作的权限。

说一下mysql数据库的索引类型

Mysql数据库根据不同分类可以分为不同的索引类型。
根据是否为聚簇索引,分为聚簇索引和非聚簇索引。
根据使用算法,分为哈希索引和B树索引。

联合索引可以只用来查询一个列吗?为什么?

可以,按照最左匹配原则,联合索引可以匹配联合索引中最左侧的列。

说一下spring中bean的四种作用域?他们分别在什么情况下起作用?

  • singleton
  • prototype
  • session
  • require

singleton表示Bean是单例的,什么时候都可以起作用,获取到的是同一个对象。
prototype表示是原型模式,获取到的不是同一个对象。
session表示Bean在一个session中获取到相同的对象
require表示Bean是一个请求中有效。

你有用过ElasticSearch?说一下里面的索引方法。倒排索引和关系型数据库的索引有什么区别?

TODO

一个数据库语句查询太慢,你会从哪些方面去进行优化?

  1. 通过执行计划,判断是否没有用到索引。若没有索引,可以考虑建立索引
  2. 判断是否那个表数据太多 ,若太多数据,考虑对表进行分表分库。

有用过设计模式吗?说一下都有哪些常用的。

用使用过。

  • 单例模式
  • 工厂模式
  • 代理模式
  • 观察者模式
  • 责任链模式

编程题:给定一个数组,返回第二大的那个数。

请说一下spring事务的7中传播行为

说一下spring的AOP机制。

Spring的AOP机制提供了一种将非业务代码从业务代码抽离出来成为一个切面的办法。所以AOP叫做面向切面编程。一般在代码中日志、统计信息等可以使用AOP功能。其底层实现使用了代理模式。

AOP的具体底层是怎样实现的?

AOP在Spring中是使用BeanPostProcessor和动态代理实现的。

说一下HashMap

HashMap使用哈希算法保存数据的一种结构,其获取结果的平均时间复杂度为O(1)。HashMap的底层实现是数组+链表+红黑树。在链表长度等于8时,会转变为红黑树,但这个很难出现的一种情况。

HashMap中的两个参数是怎样影响这个容器的?

HashMap的两个参数分别为容量和负载因子。容量表示HashMap中数组的长度,也就是容量数据的大小。而负载因子表示的是容量的是否比例。例如,容量乘于负载因子等于阈值,一旦HashMap中的数据大小等于负载因子,HashMap就会发生扩容。

String,StringBuilder,StringBuffer的区别是怎样的。

String及其底层数据data,都使用了final进行修饰,表示了String变量是不能被修改的。而StringBuffer和StringBuilder都是可变字符序列。StringBuffer中大部分方法都使用synchronized修饰,所以StringBuffer是线程安全的,StringBuilder不是线程安全的,所以效率要高一些。

说一下CMS。(标记清除垃圾回收算法

TODO

说一下B+树

B+树不适用的场景是什么?

说一下都有哪些Java容器。

怎样判断一个单向链表是否有环?

使用快慢指针。问:如果两个指针的步长分别是2和4的话能否实现判断有环?思考后回答不行,因为在极限状态下如果环中只有2个节点,且进入环时两个指针分别在两个节点,那么无论怎样循环都不会相遇==》面试官点头

请问这个句子是否有错,如果错了的话错在哪里? List ls = new ArrayList();

说一下java的类加载机制

Java类的加载机制是双亲委派机制,即一个类加载器接收到一个类的加载请求,他首先判断自己是否已经加载过这个类,如果没有加载过,则将这个类的加载请求转给它的父类加载器,所有的类加载器都是如此,直到到达顶层的类加载器,也就是引导类加载器。只有父类加载器不能加载类时,子类加载器才尝试去加载类。

说一下AOP。知道AOP的底层实现是怎样的吗?

BeanPostProcessor + 动态代理

说一下动态代理

动态代理是代理模式的一种,动态表示其代理实现是动态生成的。动态代理的实现通常使用JDK的Proxy和CGLIB。

说一下HashMap

HashMap的底层数据实现是数组+链表+红黑树。

HashMap中为什么要用红黑树来代替链表?

在发生了多次哈希碰撞时,使用红黑树的效率对比链表更加稳定,因为其新增、修改、删除和查找的时间复杂度都是O(lgn)

两个线程交替打印12345…和ABCDE…怎么做?

两个线程 交替打印的操作可以借助锁来实现。

public class TwoThreadsAlternatePrint {

    private static final ReentrantLock lock = new ReentrantLock();
    private static Condition c1 = lock.newCondition();
    private static Condition c2 = lock.newCondition();

    /**
     * 解题思路:使用显示锁
     *
     * @author freedom wang
     * @date 2021-02-22 21:47:36
     */
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    lock.lock();

                    for (int i = 0; i < 27; i++) {
                        System.out.println(i);
                        c1.signal();
                        c2.await();
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    lock.lock();

                    for (char i = 'a'; i < 'z'; i++) {
                        System.out.println(i);
                        c2.signal();
                        c1.await();
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }).start();

    }
}

说一下TCP的连接过程

TCP的连接过程为三次握手过程。
客户端向服务器段发起第一次握手,客户端进度SYN_SENT状态。
第一次握手中,SYN控制位为设置为1,序号被设置为一个随机的初始序号。
服务器端接受到第一次握手,向客户端返回了第二次握手,服务器端进入到SYN_RECV状态。
第二次握手中,SYN和ACK控制位被设置为1,其中确认号为第一次握手的序号值+1,序号值为随机值。
客户端接受到第二次握手,向服务器端发送第三次握手,客户端进入到ESTABLISHED状态。

说一下TCP和UDP的区别吧。他们都分别用于什么场景

知道HTTP和HTTPS的区别吗?

来说一下Mysql的事务都有哪些

我猜这道题目问的其实是Mysql事务的特性有哪些?
ACID

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

mysql的隔离级别都有什么

  • 读未提交
  • 读已提交
  • 可重复读
  • 串行化

说一下mysql索引的结构

结构有:哈希和B+树

我们有一个表t_score,里面有一些字段 stu_id sub_id score 分别代表学生ID,课程ID,得分,请查询总分排名3-5的学生

SELECT stu_id FROM t_score LIMIT 3,2 ORDER BY score DESC

我们有一个m行n列的二维整型数组,现在需要找出从[0,0]到[m,n]的最短路径。路径只能向下或者向右。

   解:这是一个[动态规划]()题目。

2020总结–两次辞职,三次跳槽

对于ACID的理解

  • 原子性:一次事务中的操作要么都成功,要么都失败
  • 一致性:一次事务操作前后的数据保持一致
  • 隔离性:一个事务不会对另外一个事务造成影响
  • 持久性:事务一旦提交,事务的操作结构就会被永久保存。

B树,b+树

B树是平衡的m路搜索树,我们所知道的2-3-4树就是4路的B树。
B+树在B树的基础上发生了改变,非叶子节点只有索引作用。

又问了mysql语句的原子性怎么实现的(没想过)

问了下Redis,mysql数据一致性怎么解决?

Redis为啥是单线程的?

因为Redis是基于内存的操作,性能的瓶颈不在于CPU,而通常在于内存。所以就使用单线程来设计。

然后又问了下GC算法,年轻代,老年代为什么那样设计?有啥好处?

垃圾回收的算法有:标记清理法、标记整理法、分代收集法、复制算法

年轻代中对象创建很多,死亡也很多,所以使用复制算法。老年代中对象死亡较少,所以使用标记清理或者标记整理算法。之所以针对年轻代和老年代使用不同的垃圾回收算法,是根据效率来取决的。

stream底层原理,为啥这么设计?

字节基础架构-内推成功

进程和线程的区别(顺便提了一下协程)

进程切换的过程

Redis 存储在内存中,如何实现快照

Redis 存储在磁盘上,如何确保事务操作的一致性

简要介绍TCP、UDP

对一个链表进行排序操作,要求空间复杂度O(1),时间复杂度尽可能小

为什么要用B+树,B+树有什么优点?

Cookie和Session的区别,如果没有Cookie会怎么样?

coding:构造并合并两个排序链表:

场景题:如何维护一个热度排行,比如日排行,周排行,月排行?

答:堆排序+归并排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值