互联网面试经历

美团笔试题:

  1. 小美的数字卡片
    字典序写出每种排列方式:
    比如1 2 3的方式是1 2 3;1 3 2;2 1 3;2 3 1;3 1 2;3 2 1六种方式
    有重复数组全排列:47. 全排列 II
class Solution {
    List<List<Integer>> result = new ArrayList();
    int[] arr;
    boolean[] used;
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums); // 排序
        used = new boolean[nums.length];
        List<Integer> list = new ArrayList();
        this.arr = nums;
        dfs(list,0);
        return result;
    }
    public void dfs(List<Integer> res,int index){
        if(index==arr.length){
            result.add(new ArrayList<Integer>(res));
            return;
        }
        int pre = -10;
        for(int i=0;i<arr.length;i++){
            if(!used[i]){
                if(i>0&&arr[i]==pre) {
                    continue;
                }else pre = arr[i];
                used[i] = true;
                res.add(arr[i]);
                dfs(res,index+1);
                res.remove(res.size()-1);
                used[i] = false;
            }
        }

    }
}

美团一面

面试官给人的感觉很好,首先把你能想起来的知识点进行一个索引,

  1. java python c之间的语言特性的对比总结
  2. java集合
  3. java多线程
  4. 库存管理系统项目

自己需要补充总结的地方:一个是HashSet,LinkedHashMap,ConcurrentHashMap常用的API的使用,还有不常用的集合都要总结一下他们的区别。再补充一下动态代理,反射,泛型,多态

需要学习的地方:一个是秒杀项目,另一个是框架,JVM,数据库,计算机网络,操作系统面经

自己补充一下面试中回答的不好的地方:

java,python,C之间的区别和关系

多线程的创建和使用(薄弱之处)

四种创建方式
继承Thread类和实现Runable接口:省略
实现Callable接口
线程池的四种创建线程的方式:(创建多线程的区别)

集合的底层实现

HashSet和HashMap:为什么选用HashSet,不直接HashMap
TreeMap

HashMap实现原理

构造器
怎么扩容的
put()实现
get()实现
迭代器实现

ConcurrentHashMap实现原理

怎么解决多线程的并发问题的

LinkedHashMap实现原理

怎么实现顺序遍历的

库存管理系统项目介绍

项目背景:
做了什么:
成果什么:

贝壳一面

计算机网络,操作系统部分基础知识(知识盲区)

垃圾回收算法(知识盲区)(JVM)

线程池的使用,以及参数(知识盲区)

hash碰撞后除了链表还有什么解决方式

开放定址法

当关键字key的哈希地址p=Hash(key)出现冲突时,以p为基础,在产生另一个哈希地址,如果仍然冲突,那么以p为基础再产生另一个哈希地址…直到找到一个不冲突的哈希地址。
Hi = (Hash(key)+ d i {d_i} di)% m 其中i=1,2,3,4…n
d i d_i di称为增量序列,根据增量序列的取值不同,相应的再散列方式也会不同。具体可以分为线性探测再散列,二次探测再散列和伪随机探测再散列。

劣势:
容易产生堆积问题;不适于大规模的数据存储;散列函数的设计对冲突会有很大的影响;插入时可能会出现多次冲突的现象,删除的元素是多个冲突元素中的一个,需要对后面的元素作处理,实现较复杂;结点规模很大时会浪费很多空间;

再哈希法

当哈希地址Hi=ReHash(key)发生冲突时,再计算Hi=ReHash2(key),直到冲突不再产生,这种方法不容易产生聚集,但是增加了计算时间。

链地址法

将Hash地址相同的元素构建为一个链表。

拉链法的缺点:需要额外的存储空间。

建立公共溢出区

将哈希表分为基本表和溢出表两个部分,凡是和基本表发生冲突的元素,一律填入溢出表。

缺点: 如未能命中哈希表 需要遍历查找溢出表 查询效率低

CAS是怎么实现的

CAS有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false

sychronized的实现过程以及用处

https://blog.csdn.net/javazejian/article/details/72828483

算法题不难,二叉树的中序遍历非递归实现,但是写的时候判断条件错误

什么情况下会发生OOM

https://blog.csdn.net/lovedingd/article/details/104650249

sychronized怎么升级的

https://juejin.cn/post/6844903913120874510

java的数据区都有什么,(JVM)

在这里插入图片描述

消息队列

项目相关

高并发以及K8s

拼多多一面

OOM,什么时候会发生OOM

Java中的垃圾回收算法

自定义线程池怎么使用

有多个线程请求,怎么解决冲突问题

futureTask使用的什么方法返回的,好像是accept()

消息队列

java中的缓存,redis,kafka,怎么自己设计一个缓存

强引用和弱引用

阻塞队列

数据库索引,如何提高数据库性能

mysql和postgresql的区别。

接口和抽象类的区别

sql怎么优化,可以添加索引

百度一面:

计网相关:

http请求状态码之类

进程和线程区别

事务的四大特性和隔离级别的理解

数据库索引,B+树和B树的优势和区别

扩展:

  • 怎么建索引,建立索引的原则
  • 给一个sql语句判断是否走索引
  • 索引底层数据结构,B+Tree的特点,hash索引和B+Tree索引的区别
    索引为什么能提高查询速度
  • 操作系统了解吗,大概了解到什么程度?
  • 计网TCP、UDP区别,主要是三握四挥(为什么握手是三次,为什么要有TIME_WAIT?)
  • 数据库索引数据结构
  • 事务四大特性
  • MVCC了解
  • http状态码
  • 进程和线程的区别
  • synchronized基于什么实现线程安全?几种用法?
  • lock有哪几类?大概有什么特点?底层是什么?(答到AQS,面试官笑着问,具体实现原理了解吗,我说不了解,我们俩都笑了,然后他说好)
  • MySQL索引相关,底层数据结构,怎么建索引?

爱奇艺一面

快手一面

tcp协议和udp协议,相关面经问题找找
他们之间的区别

华为一面二面三面

交行二面

阿里测开一面

拼多多客户端一面

泛型的优势:

增加了可扩展功能,使得数据类型可以作为参数传递进来。
提供了类型检测机制
提高了代码的可读性,可以直接看出来容器里面的数据类型。

设计模式:

设计模式六大原则:

  • 单一职责原则(一个类不应该承担太多功能,如果一个类承担了太多功能,那么这个类应该被拆分为多个类,否则会不得不将其他不需要的职责全部包含进来,造成代码冗余)将对接进行低耦合,高内聚。
  • 开闭原则(抽象约束,封装变化,将相同的可变因素封装在相同的具体实现类中)
  • 里氏替换原则,子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法,子类可以增加自己特有的方法。
  • 依赖倒置原则,面向接口编程,而不是面向对象编程。
  • 接口隔离原则,将庞大的接口分解为多个粒度小的接口。
  • 迪米特原则,降低子类之间的耦合度。

主要有哪些设计模式以及区别

  1. 单例模式

  2. 工厂模式:

    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
  3. 代理模式:与原始对象实现同一个接口,所以行为相同,代理模式直接转发原始对象对应接口的内容。代理模式可以增加一些额外的工作。额外工作主要是一些辅助功能,并非核心功能。

  4. 装饰器模式:于原始对象实现同一个接口,行为相同,装饰对象在调用原始对象接口前后做一些额外的工作,额外工作会修改原始对象的功能,自身对象主要实现的才是核心功能。

  5. 适配器模式:跟原始对象实现两套不同的接口,完成新旧两套接口的适配工作,所以适配对象跟原始对象行为不同,但是内容是相似的。

  6. 职责链模式:使多个对象都有机会处理请求,中二避免请求的发送者和接收者之间的耦合关系,很多对象对其下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上某一个对象决定处理这个请求。主要用于中间件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值