网易Java面经汇总

1.自我介绍

2.项目介绍以及细节

3.kafka消息丢失怎么办?

4.说一下Java内存模型

主内存工作内存 – 线程

5.Java内存模型如何保证一致性?

通过锁、volatile、等禁止指令重排序

6.说一下Mysql索引有哪些

B+树索引,hash索引,bitmap

普通索引,主键索引,唯一索引,联合索引等

7.B+树索引怎么实现的

B+树每个节点可以存储很多的值,矮胖,磁盘IO次数少

8.B+树索引和哈希索引都有什么优缺点?

两个都够快,但是hash则更快,B+树更稳定

B+树和B树区别是什么?

B+树能够范围查找,B树节点存储索引少,所以树高度较高,磁盘IO操作更多

为什么用B+树实现索引

因为稳定,磁盘IO少,能够范围查找

9.用过ThreadLocal吗,怎么实现的?ThreadLocalMap怎么保证线程安全的?

 ThreadLocal本身并没有承担存储每个线程中的数据的职责,它是通过操作每个线程内部的一个”-ThreadLocalMap来实现线程之间的隔离,从而保证了线程安全。

10.写一个LRU

LinkedHashMap实现,每次插入时查看链表中有了没,有了就将其放在头部并返回,没有则插入链表头。当链表满了,就删除链表尾部的节点。

LinkedHashMap通过构造器构造,可以指定初始容量,和负载因子。也可以使LinkedHashMap重写removeEldestEntry实现。

11.说一下zookeeper

12.有什么问题要问?

作者:一天儿啊!
链接:https://www.nowcoder.com/discuss/223281
来源:牛客网
2019.08.14网易    30分钟
上来就是自我介绍和实习项目

1.说一下Collection(我说了Set、List及他们的实现类还有底层数据结构)

Set List Queue

2.HashMap和TreeMap差别

HashMap:数组方式存储key/value,线程非安全,允许null作为key和valuekey不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法

默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;

TreeMap:基于红黑二叉树NavigableMap的实现,线程非安全,不允许null,key不可以重复value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出

3.iterator迭代器有add方法吗,为什么?

迭代通常是用于遍历,add操作很少。同时对于无序的list,add操作并不能保证添加后的元素被遍历到,所以迭代器为了维护统一接口没有add方法。而对于有序的List则是提供了ListIterator迭代器专门遍历List,该迭代其中添加了add方法,并且也添加了hashPrevious,previous,previousIndex等方法。

4.最优二叉树遍历方式还有遍历之后啥的

二叉树遍历先序,中序,后序遍历,层次遍历

5.数据库索引、如何建立、分类、项目中应用(我说没有用过,哭)

用过,创建索引

1. 在建表时指定

2. create [UNIQUE] INDEX indexName tableName(username);

3. alter table tableName ADD [UNIQUE] INDEX indexName(columnName);

分类:普通,主键,唯一,联合,全文,空间 或者 聚集索引 非聚集索引

6.ABC表建立组合索引,现在想查where A and C 能用吗?(能不能????)

最左匹配原则

7.IO流分类:IO流中用到了很多设计模式,说一个

装饰器模式:动态扩展一个类的功能而不改变原有的类

适配器模式:

8.并发:synchronized作用范围  (不会)

修饰方法则是整个方法体,包围代码块则是被包围的部分

9.进程死锁的前提(我说计算机操作系统中学过,他说是不是没了解,就说下一题了,我其实知道点想说出来但也不好意思打断,就没说了)

死锁产生的4个条件

(1)互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源

(2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放

(3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放

(4)环路等待条件:是指进程发生死锁后,必然存在一个进程--资源之间的环形链

避免死锁:

非阻塞算法实现的锁,tryAcquire定时获取锁,引入随机性,顺序上锁

10.Exception与error的差别,Exception的分类NullpointerException属于什么

Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

ArithmeticException、除以0

ClassCastException、强转出错

ConcurrentModificationException、迭代器中修改hashMap

EmptyStackException、从空栈中取值

IndexOutOfBoundException、索引越界

NullPointerException 空指针异常,未恰当初始化

11.运行时异常与一般异常的区别

1.定义不同,运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

2.处理方法不同,运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。

对于一般异常,JAVA编译器强制要求用户必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。

3.发生原因不同,运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

不同点:

(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。

(2)一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

12.try-catch-finally中return(脑袋一热说错了,面试官说:你自己回去运行运行)

13.序列化相关

序列化与基本类型序列化

1)将类型int 转换成4byte或将其他数据类型转换成byte的过程叫序列化

     数据---->n byte

2)反序列化

    n个byte 转换成一个数据的过程

    n byte ---> 数据

对象的序列化,反序列化

1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化

2)序列化流(ObjectOutputStream),是过滤流----writeObject

   反序列化流(ObjectInputStream)---readObject

3)序列化接口(Serializable)

   对象必须实现序列化接口 ,才能进行序列化,否则将出现异常

   这个接口,没有任何方法,只是一个标准

4) transient关键字

    private void writeObject(java.io.ObjectOutputStream s)

        throws java.io.IOException

private void readObject(java.io.ObjectInputStream s)

        throws java.io.IOException, ClassNotFoundException

   分析ArrayList源码中序列化和反序列化的问题

5)序列化中 子类和父类构造函数的调用问题

14.事务spring中的事务

还有点忘了  都是java基础  面试官也不错 全程无黑脸  尽管我啥也不会☹️☹️☹️

作者:ShirySan
链接:https://www.nowcoder.com/discuss/223590?type=2&order=0&pos=2&page=1
来源:牛客网

时间:25分钟

从来没有经历过时间这么短的面试。。。一脸懵逼就结束 

  1. 自我介绍
  2. 项目,根据项目问了http和web socket的区别,http长连接
  3. 项目里面的数据库,文件数据库与关系数据库的差别(没答上),ES查询
  1. mysql索引(我说了B+树,问怎么实现,平衡二叉树带进去强行解释。。。。与B树的差别,优势,)
  2. hashmap的结构。。。这个没答上。。脑子突然死机,直接说忘记了。不过面试官人很好,没有追问
  3. 锁,可重入锁的机制
  4. string buffer 和stringbuilderder 的区别

线程同步

  1. GC机制,GC算法,JVM的简单介绍,吧啦吧啦。。。。。。面试官:好了,我知道你了解这部分了注意精简语言
  2. 了解分布式事务嘛,了解,但是没有大型项目的实战,讲JTA,用MQ,zookeeper保障一致性。。吧啦吧啦。。
  3. 了解哪些设计模式,抽象工厂与工厂模式的区别,责任链模式。。。这个答得很差,忘光了。。。
  1. 闲聊3分钟。。。职业规划,想做的方向是哪一块。。。有没有想问他的问题

。。。。我觉得他应该还会再问问别的啥,让我码个啥代码之类的。。。

嗯,就没有然后了。小哥太善良了。。全程没有怼我。。。说不会的完全不追问

作者:吃apple的小子
链接:https://www.nowcoder.com/discuss/223483?type=2&order=0&pos=3&page=1
来源:牛客网

1.介绍下项目(感觉是个坑)

2.fdfs原理了解吗?

3.springboot原理了解吗?

4.问什么用netty不用nio

5.验证码业务流程,有些改进的地方

6.线程池

7.aqs原理

8.数据库联合索引,为什么要满足最左前缀

9.linux命令

10.tcp为什么三次握手

11.http状态码,101代表什么

12.hashmap何时死锁

基础知识答得还行,就是项目真是个坑。

作者:I.A.B
链接:https://www.nowcoder.com/discuss/222725?type=2&order=0&pos=5&page=1
来源:牛客网

  • 上来先是惯例自我介绍,然后根据简历上的项目问了一些问题,主要是开发期间遇到了什么困难、你的工作职责、项目框架相关的知识之类的,然后问完项目问我有没有实习经历,我说有,然后问了几句实习经历,问的不太多。
  • 然后就是问的一些基础知识,先是问的内存模型、gc、新生代老年代这些,(感觉问的问题都很让人把握不好度…我以为会先问jvm分哪几个区,各个区的概要之类的,结果一上来就问我gc垃圾回收)最后还问了下怎么监控jvm……。然后问我有没有写过自定义注解,自定义注解和接口的区别,这个倒真没有了解过……只说了句注解其实就是一个接口(?)
  • 然后问了锁相关的,synchronized的作用域、与可重入锁的区别这些。然后是泛型,- -也是问我有没有自己写过泛型,我说平时用的比较多写得很少,问了个泛型擦除在哪个阶段。
  • 数据库方面问了下mysql的索引,问我有没有自己配过索引…问我索引的类型(hash表和b+树)、根据功能去分索引,我说聚簇和非聚簇(orz卒),然后问聚簇和非聚簇的区别(神经紧张就想不起来了),又问了什么时候使用联合索引(?orz我都不会聚簇和非聚簇了怎么还问我联合,又卒)
  • 整个面试流程大概50min,本来也没想着自己能进提前批面试的,毕竟笔试阶段十分糟糕,就当提前秋招面试试试水吧…
  • 最后吐槽一下某易的面试官给我的形象确实不太好…中途面试官各种小动作orz。总体来说体验不太好…面试官那边附近好像坐着好几个面试官都在面试,耳机声音比较嘈杂。

作者:offer,offer快到碗里来
链接:https://www.nowcoder.com/discuss/223101?type=2&order=0&pos=6&page=1
来源:牛客网

1,自我介绍
2,项目中你负责的模块
3,对dubbo和zooper的了解
4,zooper核心
5,jvm运行原理

JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。

6,类的加载
7,java开发中怎么找到对应文件名加载的
8,线程池原理
9,redis数据库原理,为什么快
10,spring运行原理
目前回忆的大概这些了。

作者:来个大厂offer保命!
链接:https://www.nowcoder.com/discuss/222665?type=2&order=0&pos=7&page=1
来源:牛客网

总共用时约30min

  1. 首先是常规自我介绍
  2. 我看你笔试成绩还不错,基础应该很好吧(就我这也能叫不错???是不是有什么误解????),我们来问点java(以下顺序不一定,太紧张面完忘一半了,全靠回忆)
  3. 讲讲java内存模型(我觉得他想让我讲java内存结构,我讲了每个线程有存储变量的副本后他一脸疑惑,但又顺着我的思路问下去了)
  4. 那你这个int变量被一个线程修改之后其他线程怎么知道呢?(说了volatile关键字)
  5. volatile是怎么样保证有序性和可见性的呢?(忘....忘了)
  6. 你刚才讲的是int变量有副本,那我要是一个对象呢?
  7. 多线程如何修改这个对象的属性?如何保证线程安全?(讲到了synchronized和锁)
  8. synchronized可以修饰哪些地方?同步方法是锁住了什么?(我说要是非static的是锁住了对象,static是锁住类,面试官表情又一脸疑惑....)
  9. 那我现在有一个父类synchronized修饰非static方法和两个子类,现在两个子类调用这个方法会发生竞争吗?(一脸懵,盲猜) static的呢?为啥?(饶了我吧,混子本质暴露了)
  10. 线程池参数?从0开始一直往线程池扔任务(无限个),讲讲这中间发生的过程
  11. 注解有用过吗?@Autowired 和 @Override 有什么区别呢?不是功能上,是本质上(我:.....我不知道啊)
  12. 我现在要在代码中添加打印日志的功能,怎么实现?(说了AOP)
  13. spring中还有一个重要的东西IOC,讲一讲
  14. 我看你项目是秒杀系统,你这个数据库是你设计的吗?有哪几张表?
  15. 订单表里面有哪些字段?哪些字段加了索引?
  16. 我现在要查询某一个商家某段时间内的订单金额,sql语句怎么写?
  17. 你刚才这句SQL要怎么建索引?
  18. 要是查询某个用户某段时间内的所有订单呢?怎么样分页呢?
  19. 你这句SQL可以用两个索引吗?(我:.....我..不太清楚)
  20. 我看你用了Redis,怎么保证数据一致性的?
  21. 差不多就这些了,你有什么要问我的吗?(我:啊?就结束了?不写代码吗?面试官:我们有时候是要写的....)

感觉还是凉凉,一天两篇凉经,我也是服我自己

作者:无口
链接:https://www.nowcoder.com/discuss/222742?type=2&order=0&pos=8&page=1
来源:牛客网

  1. 问了一些在腾讯实习的东西。
  2. k8s上怎么做的RPC
  3. 虚拟ip不是会变吗?怎么找到服务的?
  4. 你们有尝试过Service Mesh之类的东西吗?不敢多说。。。
  5. 讲个熟悉的数据结构
  6. HashMap讲一下原理以及使用场景
  7. 红黑树为什么要在长度为8再变
  8. ConcurrentHashMap的使用场景以及原理
  9. 讲讲MySQL的索引
  10. MySQL的事务类型
  11. Spring是怎么支持事务的
  12. 为什么@Transation注解修饰的方法可以在多线程的方式下互不影响
  13. Connection是存在什么样的数据结构上的
  14. 分布式锁用过吗?用Redis怎么实现
  15. Redis集群怎么搭?怎么分片的?
  16. CAS知道吗?原理是怎么样的
  17. CAS有哪些使用场景?
  18. Atomic在高并发场景下有什么问题,缺点?
  19. CAS线程安全吗?有什么问题?除了线程安全呢?对于CPU呢?
  20. 用过Dubbo吗?稍微讲一下
  21. Paxos算法稍微讲一下
  22. ZooKeeper最少要几个节点,为什么?
  23. 了解哪些开源的组件
  24. CAP知道吗?大概讲一讲
  25. 有什么要问我的?

面试官说问的有点广,有的没答好,但总体海星,好久没写过Java了,希望能过吧。。。。

猜你喜欢

转载自www.cnblogs.com/youngao/p/12016894.html