网易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了,希望能过吧。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值