写点什么

刚从蚂蚁金服 Java 研发岗面试回来(三轮游),我总结的面试经历(附面试题 + 答案)

发布于: 2020 年 10 月 29 日

面试岗位:

后端研发工程师

找牛客大佬要了白金码,跳过死亡笔试,直接视频面试,从 3 点开始,到晚上 8 点结束。

每个面试官给我得感觉都是怎么这么高冷啊。

一面:

写一个题,找一个无序数组的中位数

写了个快排,然后让我找到无序数组第 k 大的一个数,我说先排序再找,实际上可以用快排的 partition 函数。

快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少,nlgn。

操作系统了解么,Linux 和 windows

说说 Linux 的磁盘管理,一脸懵逼

Linux 有哪些进程通信方式,五大件

Linux 的共享内存如何实现,大概说了一下。

共享内存实现的具体步骤,我说没用过

socket 网络编程,说一下 TCP 的三次握手和四次挥手,中间网络不好,面试官都没听清楚,很尴尬

跳过网络,问了项目的一些东西

问我如何把 docker 讲的很清楚,我从物理机,虚拟机到容器具体实现稍微说了下。

问我 cgroup 在 linux 的具体实现方法,不会。

多线程用过哪些,chm 和 countdownlatch 用过

二面:

自我介绍

Java 的集合类哪些是线程安全

分别说说这些集合类,hashmap 怎么实现的,扯了很多

MySQL 索引的实现,innodb 的索引,b+树索引是怎么实现的,为什么用 b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。

MySQL 的事务隔离级别,分别解决什么问题。

Redis 了解么,如果 Redis 有 1 亿个 key,使用 keys 命令是否会影响线上服务,我说会,因为是单线程模型,可以部署多个节点。

问我知不知道有一条命令可以实现上面这个功能。不知道

Redis 的持久化方式,aod 和 rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么,不清楚。

Redis 的 list 是怎么实现的,我说用 ziplist+quicklist 实现的,ziplist 压缩空间,quicklist 实现链表。

sortedset 怎么实现的,使用 dict+skiplist 实现的,问我 skiplist 的数据结构,大概说了下是个实现简单的快速查询结构。

了解什么消息队列,rmq 和 kafka,没细问

写题时间到。第一题:写一个程序遍历。

第二题:写一个插入树节点到一颗排序树的插入方法,使用递归方式找到插入位置即可。

第三题:一个有向图用邻接矩阵表示,并且是有权图,现在问怎么判断图中有没有环。

我说直接 dfs 走到原点即为有环,刚开始写的时候我又问了一嘴是不是只要找到一个就行,面试官说是的,然后我说这样应该用 bfs,有一次访问到原节点就是有环了。

面试官问我不用递归能不能做这个题,其实我都还没开始写。然后我就说没有思路,他提示我拓扑图。我没明白拓扑图能带来什么好处。现在一想,好像当访问过程中找不到下一个节点时就说明有环。做一个访问标记应该就可以了。

第四题:一个二叉树,找到二叉树中最长的一条路径。

我先用求树高的方式求出了根节点的左右子树高度,加起来便是。

然后面试官提示需要考虑某个子树深度特别大的情况,于是我用遍历的方式刷新最大值,用上面那个方法遍历完整个树即可。

面试官说复杂度比较高,但是由于时间问题就说结束了。

三面:

介绍一下项目

你谈到的并发技术,chm 和 countdownlatch 怎么使用的

为什么要这么处理,使用线程池是不是也可以。我说也可以

操作系统的进程通信方式,僵尸进程和孤儿进程是什么,如何避免僵尸进程,我说让父进程显示通知,那父进程怎么知道子进程结束了,答不会。

计算机网络 TCP 和 UDP 有什么区别,为什么迅雷下载是基于 UDP 的,我说 FTP 是基于 TCP,而迅雷是 p2p 不需要 TCP 那么可靠的传输保证。

操作系统的死锁必要条件,如何避免死锁。

写一个 LRU 的缓存,需要完成超时淘汰和 LRU 淘汰。

我说用 lhm 行不行,他说用 linkedlist 和 hashmap 可以。

于是我就写了 put 和 get 函数,进行了队头队尾操作。

他说 get 复杂度会不会太高,我瞎掰了半天没找到办法,他说那就这样吧,今天面试到这。

过期淘汰的处理我还没写呢,就说结束了,感觉凉了啊,我说我要不要把剩下逻辑下完,他说不用,心凉了一大截~

然后 HR 小姐姐让我等结果了。

面试经历只是提供给大家一点临时的应付技巧,真正的本领还是要靠平时的学习和积累,只有学习的多了,技术掌握得透彻,才会在面试的时候临危不乱,处变不惊。临时抱佛脚虽然有时可行,但是,也有抱不住的时候啊。

Java 基础 1

1、面向对象的特征有哪些方面?

2.访问修饰符 public,private,protected,以及不写(默认)时的区别?

3. String 是最基本的数据类型吗?

4、float f=3.4;是否正确?

5、shorts1= 1;s1 =s1 + 1;有错吗?shorts1= 1;s1 += 1;有错吗?

6、Java 有没有 goto?

7、int 和 Integer 有什么区别?

8、&和 &&的区别?

9、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

10、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 220

11、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?

12、 用最有效率的方法计算 2 乘以 8?

13、数组有没有 length()方法? String 有没有 length0 方法?

14、 在 Java 中,如何跳出当前的多重嵌套循环?

15、构造器(constructor) 是否可被重写(override) ?

16、 两个对象值相同(x.equals(y) == true),但却可有不同的 hashcode,这句话对不对?

17、是否可以继承 String 类?

18、 当一个对象被当作参数传递到一一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

19、String 和 StringBuilder、StringBuffer 的区别?

20、重载(Overload) 和重写(Override) 的区别。重载的方法能否根据返回类型进行区分?

21、描述-下 JVM 加载 class 文件的原理机制?

22、char 型变量中能不能存贮一个中文汉字, 为什么?

23、抽象类(abstract class)和接口(interface) 有什么异同?

24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

25、Java 中会存在内存泄漏吗,请简单描述。

26、抽象的(abstract)方法是否可同时是静态的(static) ,是否可同时是本地方法(native) ,是否可同时被 synchronized 修饰?

27、阐述静态变量和实例变量的区别。

28.是否可以从一个静态(static) 方法内部发出对非静态(non-static)方法的调用?

29、如何实现对象克隆?

30、GC 是什么?为什么要有 GC?

31、Strings = new String( "xyz" );创建了几个字符串对象?

32、接口是否可继承( extends) 接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class) ?

33、一个”java" 源文件中是否可以包含多个类(不是内部类) ?有什么限制?

34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否

35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

36、Java 中的 final 关键字有哪些用法?

37.指出下面程序的运行结果

38、数据类型之间的转换:

39、如何实现字符串的反转及替换?

40、怎样将 GB2312 编码的字符串转换为 IS0-8859-1 编码的字符串?

41、日期和时间:

42、打印昨天的当前时刻。

43、比较-下 Java 和 JavaSciprt。

44、什么时候用断言(assert) ?

45、Error 和 Exception 有什么区别?

46、try{}里有一 个 return 语句,那么紧跟在这个 try 后的 finally{}里的代码会不会被执行,什么时候被执行,在 return 前还是后?

47. Java 语言如何进行异常处理,关键字: throws. throw. try. catch.finally 分别如何使用?

48、运行时异常与受检异常有何异同?

49、列出一些你常见的运行时异常?

50、阐述 final、finally、 finalize 的区别。

51、类 ExampleA 继承 Exception,类 ExampleB 继承 ExampleA。

52、List、 Set、 Map 是否继承自 Collection 接口?

53、阐述 ArrayList. Vector、 LinkedList 的存储性能和特性。

54、Collection 和 Collections 的区别?

55、List. Map、Set 三个接口存取元素时,各有什么特点?

56、TreeMap 和 TreeSet 在排序时如何比较元素? Collections 工具类中的 sort(方法如何比较元素?

57. Thread 类的 sleep0 方法和对象的 wait0 方法都可以让线程暂停执行,它们有什么区别?

58、线程的 sleep0 方法和 yield0 方法有什么区别?

59、当-个线程进入-个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?

60、请说出与线程同步以及线程调度相关的方法。

61、编写多线程程序有几种实现方式?

62、synchronized 关键字的用法?

63、举例说明同步和异步。

............

部分答案展示


Java 基础 2

多线程、并发及线程的基础问题

1、Java 中能创建 volatile 数组吗?

2、volatile 能使得一个非原子操作变成原子操作吗?

3. volatile 修饰符的有过什么实践?

4、volatile 类型变量提供什么保证?

5、10 个线程和 2 个线程的同步代码,哪个更容易写?

6、你是如何调用 wait ()方法的?使用 if 块还是循环?为什么?

有经验程序员的 Java 面试题

8、什么是 Busy spin?我们为什么要使用它?

9、Java 中怎么获取一份线程 dump 文件?.

10、Swing 是线程安全的?

11、什么是线程局部变量?

12、用 wait-notify 写- -段代码来解决生产者-消费者问题?

13、用 Java 写- -个线程安全的单例模式(Singleton) ?

14、Java 中 sleep 方法和 wait 方法的区别?

15、什么是不可变对象(immutable object) ? Java 中怎么创建一个不可变对象?

16、我们能创建一个包含可变对象的不可变对象吗?

数据类型和 Java 基础面试问题

17. Java 中应该使用什么数据类型来代表价格?

18、怎么将 byte 转换为 String?

19、 Java 中怎样将 bytes 转换为 long 类型?

20、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

21、存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C=(C)B;

22、哪个类包含 clone 方法?是 Cloneable 还是 Object?

23、Java 中++操作符是线程安全的吗?

23、不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。

24、a=a+b 与 a+=b 的区别

25、我能在不进行强制转换的情况下将-一个 double 值赋值给 long 类型的变量吗?

26、3*0.1 == 0.3 将会返回什么? true 还是 false?

27、int 和 Integer 哪个会占用更多的内存?

28、为什么 Java 中的 String 是不可变的(Immutable) ?

JVM 底层与 GC (Garbage Collection)的面试问题

31、64 位 JVM 中,int 的长度是多数?

32、Serial 与 Parallel GC 之间的不同之处?

33、32 位和 64 位的 JVM, int 类型变量的长度是多数?

34、Java 中 WeakReference 与 SoftReference 的区别?

35、WeakHashMap 是怎么工作的?

36、JVM 选项-XX:+ UseCompressedOops 有什么作用?为什么要使用?

37、怎样通过 Java 程序来判断 JVM 是 32 位还是 64 位?

38、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

39、 JRE、 JDK、JVM 及 JIT 之间有什么不同?

3 年工作经验的 Java 面试题

40、解释 Java 堆空间及 GC?

JVM 底层面试题及答案

41、你能保证 GC 执行吗?

42、怎么获取 Java 程序使用的内存?堆使用的百分比?

43、Java 中堆和栈有什么区别?

关于内存的的面试问题和答案

44、"a==b"和”a.equals(b)" 有什么区别?

45、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

46、final、 finalize 和 finally 的不同之处?

47、Java 中的编译期常量是什么?使用它有什么风险?

........................

部分答案展示

面试题总共 1000 多道,没有办法全部为大家展示出来,需要免费领取全部面试题文档朋友,麻烦帮忙转发这篇文章+关注,然后加助理老师 VX:wjj2632646 获取。

Java 并发编程

1、在 java 中守护线程和本地线程区别?

2、线程与进程的区别?

3、什么是多线程中的上下文切换?

4、死锁与活锁的区别,死锁与饥饿的区别?

5、Java 中用到的线程调度算法是什么?

6、什么是线程组,为什么在 Java 中不推荐使用?.

7.为什么使用 Executor 框架?

8、在 Java 中 Executor 和 Executors 的区别?

9.如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长?

10、什么是原子操作?在 Java Concurrency API 中有哪些原子类

11. Java Concurrency API 中的 Lock 接口(Lock interface)是什么?

对比同步它有什么优势?

12、什么是 Executors 框架?

13.什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者消费者模型?

14.什么是 Callable 和 Future?

15.什么是 FutureTask?使用 ExecutorService 启动任务。

16.什么是并发容器的实现?

17.多线程同步和互斥有几种实现方法,都是什么?

18.什么是竞争条件?你怎样发现和解决竞争?

19.你将如何使用 thread dump?你将如何分析 Thread dump? 165

20.为什么我们调用 start0 方法时会执行 run0 方法,为什么我们不能直接调用 run0 方法?

21. Java 中你怎样唤醒一个阻塞的线程?

22.在 Java 中 CydiBarriar 和 CountdownLatch 有什么区别?

23.什么是不可变对象,它对写并发应用有什么帮助?

24、什么是多线程中的上下文切换?

25. Java 中用到的线程调度算法是什么?

26.什么是线程组,为什么在 Java 中不推荐使用?

27.为什么使用 Executor 框架比使用应用创建和管理线程好?

28、java 中有几种方法可以实现-一个线程?

29.如何停止一个正在运行的线程?

30、notify0 和 notifyAIl()有什么区别?

31.什么是 Daemon 线程?它有什么意义?

32、java 如何实现多线程之间的通讯和协作?

33、什么是可重入锁(ReentrantLock) ?

34、当-个线程进入某个对象的一个 synchronized 的实例方法后,其它线程是否可进入此对象的其它方法?

35、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

36、SynchronizedMap 和 ConcurrentHashMap 有什么区别?

37、CopyOnWriteArrayList 可以用于什么应用场景?

38、什么叫线程安全? servlet 是线程安全吗....

39、volatile 有什么用?能否用一句话说明下 volatile 的应用场景? 183

40、为什么代码会重排序?

41、在 java 中 wait 和 sleep 方法的不同?

42、用 Java 实现阻塞队列

43、一个线程运行时发生异常会怎样?

44、如何在两个线程间共享数据?

45、Java 中 notify 和 notifyAll 有什么区别?

46、为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?

47、什么是 ThreadLocal 变量?

48、Java 中 interrupted 和 islnterrupted 方法的区别?

49.为什么 wait 和 notify 方法要在同步块中调用?

50、为什么你应该在循环中检查等待条

51、Java 中的同步集合与并发集合有什么区别? .

52、什么是线程池?为什么要使用它?

53、怎么检测-个线程是否拥有锁?

54、你如何在 Java 中获取线程堆栈?

56、Thread 类中的 yield 方法有什么作用?

57、Java 中 ConcurrentHashMap 的并发度是什么?

58、Java 中 Semaphore 是什么?

59、Java 线程池中 submit()和 execute(方法有什么区别?

60、什么是阻塞式方法?

61、Java 中的 ReadWriteLock 是什么?

62、volatile 变量和 atomic 变量有什么不同?

63.可以直接调用 Thread 类的 run 0 方法么?

64、如何让正在运行的线程暂停一段时间?

65、你对线程优先级的理解是什么?

66、什么是线程调度器(ThreadScheduler)和时间分片(Time Slicing )?

67.你如何确保 main0 方法所在的线程是 Java 程序最后结束的线程?

68、线程之间是如何通信的?

69、为什么线程通信的方法 wait() notify()和 notifyAll()被定义在 Object 类里?

70、为什么 wait(), notify0 和 notifyAll ()必须在同步方法或者同步块中被调用?

71、为什么 Thread 类的 sleep(和 yield 0 方法是静态的?

72、如何确保线程安全?

73、同步方法和同步块,哪个是更好的选择?

74、如何创建守护线程?

75、什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?

...............................

部分答案展示


Spring 面试题






微服务



面试题总共 1000 多道,没有办法全部为大家展示出来,需要免费领取全部面试题文档朋友,麻烦帮忙转发这篇文章+关注,然后加助理老师 VX:wjj2632646 获取。


面试题总共 1000 多道,没有办法全部为大家展示出来,需要免费领取全部面试题文档朋友,麻烦帮忙转发这篇文章+关注,然后加助理老师 VX:wjj2632646 获取。


用户头像

还未添加个人签名 2020.10.09 加入

还未添加个人简介

评论

发布
暂无评论
刚从蚂蚁金服Java研发岗面试回来(三轮游),我总结的面试经历(附面试题+答案)