首页 > 朋友字节一面面经
头像
SayLiHo
编辑于 2021-08-25 12:19
+ 关注

朋友字节一面面经

自己整理的常见面试题及解答
讨论贴
博客

1.进程线程的区别

进程是进行资源分配的最小单位,线程是进行任务分配的最小单位,线程属于进程
进程拥有资源而线程不拥有,线程可以访问隶属进程的资源
线程是独立调度的基本单位,同一进程中线程切换不会引起进程切换,不同进程中线程切换会引起进程切换
创建切换线程会产生极大的系统开销(内存、i/o、cpu),线程只需要设置和保存少量寄存器
线程可以通过同一进程中的数据进行通信,进行通信则需要借助IPC

2.ioc是控制反转,反转的是什么?

反转的是对象的获取方式
一般new对象是主动获取对象 ioc将对象创建好是被动获取对象
将创建对象的控制权交给ioc

3.aop怎么实现?动态代理?说一下

面向切面编程 动态代理
JDK动态代理
如果要代理的对象,实现了某个接口,使用JDK Proxy创建代理对象
Cglib动态代理
没有实现接口的对象,无法使用JDK Proxy进行代理。
Cglib会生成一个被代理对象的子类来作为代理

4.http请求过程

DNS服务器解析域名,浏览器缓存,操作系统缓存,hosts文件,服务器
获取到ip地址,与服务器三次挥手建立tcpip连接
向服务器发送请求
拿到资源
渲染页面

5.https如何实现加密?

采用混合的加密机制。非对称加密传输密钥,对称加密传输信息
浏览器向服务器发起请求
服务器将自己的证书、公钥,加密方式等返回客户端
浏览器检查证书是否是由可信赖的CA机构颁发的,确认证书有效、证书属于网站。如果不是,提示用户,是否继续访问
如果是,客户端使用公钥加密一个随机对称密钥,和加密的URL一起发给服务器
服务器用私钥解密密钥,用对称密钥解密URL,返回数据
浏览器用对称密钥解密返回的数据

6.线程同步?(说了sychronized和lock)问还有没有别的,懵掉

CAS

7.线程状态?

创建 - 就绪 - 运行 - 阻塞 - 等待 - 死亡

8.hashmap底层?

1.7:数组 + 链表
1.8:数组 + 链表 + 红黑树

9.AVL和红黑树的区别?(不会)

AVL是严格的平衡树,在增加或删除节点的时候,旋转的次数比红黑树要多
红黑树用非严格的平衡来减少旋转次数
AVL靠平衡因子旋转,红黑树靠节点颜色以及一些约定旋转
AVL更适合搜索,红黑树更适合增删
红黑树根节点是黑色,叶子节点都为黑色且空,每一个红色节点的两个子节点都是黑色

10.对称加密和非对称加密是什么?

对称加密:加密解密使用同一把密钥
非对称加密:加密解密使用不同的密钥

11.redis的持久化?

RDB:将数据放入硬盘
AOF:将命令保存到AOF文件

12.缓存穿透、雪崩?如何解决?布隆过滤器怎么做的?

缓存穿透:redis没有数据,数据库中也没有
解决:对参数进行合法性校验;将数据库查不到的结果的数据也写入缓存;布隆过滤器
缓存雪崩:大量key同一时间过期
解决:将缓存的失效时间分散开(加随机值);redis高可用;数据预热

13.具体的对称加密和非对称加密算法(不会)

14.tcp四次挥手能否成为3次

15.聚簇索引和非聚簇索引的区别?

聚簇索引的B+树叶子节点的data是完整的数据记录
非聚簇索引的B+树叶子节点的data是主键的值

16.聚簇索引和非聚簇索引叶子结点存储的是什么?

17.Innob是索引采用什么数据结构

B+树

18.B+树和B树的区别

B+树只有叶子节点存放数据,B树每个节点都有数据

19.Innodb默认隔离级别?既然默认隔离级别出现幻读,怎么解决?(MVCC只了解一点)

可重复读
MVCC+Next-key Locking
MVCC:写操作更新最新的版本快照,读操作读旧版本快照,快照存储在Undo日志中
Next-key Locking:锁定一个记录上的索引和索引之间的间隙。锁定一个前开后闭区间。一个索引包含:10,11,13,20。锁定的区间为(-∞,10](10,11](11,13](13,20](20,+∞)

20.事务的ACID?

原子性A:要么全部成功,要么全部失败
一致性C:所有事务读取同一个数据的结果是相同的
隔离性I:一个事务在提交之前,对其他事务不可见
持久性D:一旦事务提交,所做的操作永久保存在数据库中

21.算法:岛屿数量

力扣200

    public int numIslands(char[][] grid) {
        int res = 0;
        for(int i = 0;i < grid.length;i++){
            for(int j = 0;j < grid[i].length;j++){
                if(grid[i][j] == '1'){
                    res++;
                    dfs(i,j,grid);
                }
            }
        }
        return res;
    }
    private int dfs(int i, int j, char[][] grid) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[i].length || grid[i][j] != '1'){
            return 0;
        }
        grid[i][j] = '2';
        return 1
                + dfs(i + 1,j,grid)
                + dfs(i - 1,j,grid)
                + dfs(i,j + 1,grid)
                + dfs(i,j - 1,grid);
    }

更多模拟面试

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐