阿里巴巴Java 123面经整理

以下为牛客网精选面试题,网上资料整理解答。

阿里巴巴Java 123面经整理

1面(48分钟):基础+项目
面试基本介绍:
自我介绍;
项目介绍;
遇到的最大困难是什么?怎么解决的?你觉得你能怎么优化这个项目?

面试题目:
1)讲一下JVM?
jvm概述:
jvm就是java虚拟机,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
在这里插入图片描述
程序计数器: 一个cpu(内核)同一时刻只能处理一个线程,为了线程能正确的轮询,每个线程都有一个计数器,记录执行的位置,线程私有
虚拟机栈: 方法执行时的内存模型,每个方法创建时都创建一个栈帧,存储局部变量,操作数栈,动态链接,方法出口等。局部变量包括(基本类型和对象的引用)线程私有
本地方法栈: 与虚拟机栈作用一样,区别就是虚拟机栈为执行java方法服务,本地方法栈为执行native方法服务
堆: 所有对象和数组都在堆上分配,存放的具体的对象的实例,区域比较大。垃圾回收的主要管理区域线程共享
方法区: 存储加载的类信息,常量,静态变量线程共享
常量池: 方法区的一部分,一个类中除了有版本,字段,方法,接口等描述信息(类信息),还有常量,存储的字面量和符号引用

2)讲一下JVM的分代回收以及具体算法?
分代回收意义:分代即在JVM运行时数据区中的java堆中,按照对象的生命周期分为新生代和老年代。所以,按照生命周期和在堆中的位置不同,在GC的时候应当采取不同的回收策略,可以提高回收效率。
具体算法:新生代存活对象较少,一般使用复制算法。老年代存活对象较多,一般使用标志清除法和标志压缩法。

3)讲一下JVM的垃圾收集器,G1和CMS有啥区别?
堆空间上分配的不同:
CMS收集器:将堆空间分成Eden、Servivor、old,并且他们是固定大小,JVM启动的时候设定且不能改变。
G1收集器:将堆空间分成多个大小相同的Region区域,逻辑上分Eden/Servivor、old,且大小是可变的,每次会根据GC的信息做出调整。
压缩策略的不同:
CMS:存在minor GC、full GC,且CMS的youngGC依赖并行GC(ParNew)去完成,只有老年代使用CMS GC去完成。
G1:区分三种策略,minor Gc、mixed GC 、 full GC, 而minexGC会回收整个yong区,回收部分old区。
可预测停顿模型:CMS和G1都是最求最低停顿时间,而CMS可以建立可可预测的停顿时间模型,能让使用者明确指定一段长度为M毫秒的时间片段内,消耗在垃圾回收上的时间不超过N毫秒。

4)讲一下一个变量从产生到结束所经历的过程,讲一下字符串常量的过程?
变量类型:局部变量(栈帧)、常量、静态变量
局部变量:局部变量随着方法的调用产生和结束,在调用方法的时候回创建栈帧,而栈帧里存在局部变量表,当方法调用结束的时候栈帧销毁,局部变量随着销毁。
常量/静态变量:一般存放在方法区,而方法区的周期与堆相似,声明并赋值后直接放入常量池,之后通过可达性分析判断常量是否存在引用链,如不存在移除常量池。

5)讲一下线程安全问题产生的原因?
前提
1:多个线程操作同一个数据
2:操作共享数据的线程代码有多条
当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算
就会导致线程安全问题的产生。
解决思路:
就是将多线程操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,
其他线程不可以参与运算的。
必须要当前线程吧这些代码都执行完后,其他线程才可以参与运算。
在java中 用同步代码块就可以解决这个问题
同步代码块的格式
synchronized(对象){
需要被同步的代码
};

6)讲一下乐观锁和悲观锁?
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它自己拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

7)乐观锁是怎么保证一致性的?
编程使事务TranscationTemplate 并且用带版本号的乐观锁。

        表中加version字段,表示版本。

先确定要修改记录的version值位 100
在TranscationTemplate的执行方法中,执行SQL语句:UPDATE TABLE SET COL1=’’,VERSION=VERSION+1 WHERE COL2=’’ AND VERSION = 100;
并且获取返回值,也就是修改掉的条数。
如果条数为1,表示修改成功,也就是可以往下走了。
如果条数不为1,表示修改失败,也就是不可以往下走。

     ----- 问题,没法回滚了。

8)Integer和int有啥区别,integer中有哪些特殊的函数?
(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。
特殊函数

public static int parseInt(String s, int radix)throws NumberFormatException
public static int parseInt(String s) throws NumberFormatException

    public static Integer valueOf(int i) 
    public static Integer valueOf(String s, int radix) throws NumberFormatException
    public static Integer valueOf(String s) throws NumberFormatException
     
    Integer a = new Integer(3);
    a.intValue();
     
    System.out.println(Integer.toBinaryString(-7));
    1111111111111111111111111111100

9)讲一下数据库的隔离等级?
1.READ UNCIMMITTED(未提交读) - 这就是事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。
2.READ COMMITTED(提交读) - 这就是小华的事务执行到一半,而小明看不到他执行的操作,所以看到的是旧数据,也就是无效的数据
3.REPEATABLE READ(可重复读) - 总结:虽然读取同一条数据可以保证一致性,但是却不能保证没有插入新的数据
4.SERIALIZABLE(可串行化)- SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别

10)说一下MVCC?
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问阶段进行控制,
MVCC只工作在REPEATABLE READ和READ COMMITED隔离级别下,在数据库里也有表和行级别的锁定机制, 用于给那些无法轻松接受 MVCC 行为的应用。 不过,恰当地使用 MVCC 总会提供比锁更好地性能。

11)说一聚簇索引和非聚簇索引的有什么不同?
最通俗的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的索引顺序与数据物理排列顺序无关。
举例来说,你翻到新华字典的汉字“爬”那一页就是P开头的部分,这就是物理存储顺序(聚簇索引);而不用你到目录,找到汉字“爬”所在的页码,然后根据页码找到这个字(非聚簇索引)。

优质回答参考链接:http://www.xwood.net/site_domain/_root/5870/5874/t_c278266.html

2面(1h):主要聊项目,基础问得不多
主要怼项目,你做过哪些项目,用过哪些技术?你为什么读研?了解哪些框架?你觉得对你技术提升最高的是哪一件事情,提升了你哪一方面的技术?

1)讲一下Spring AOP和IOC的底层实现?
IOC(Inversion of Control)将程序代码内部对象控制交由外部容器(控制权反转),降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。

2)说一下hashcode的作用?HashMap的底层实现?HashMap和HashTable的区别?
1.hashcode的作用
JVM每new一个Object,会把Object存Hash表,下次做Object的比较或者取这个对象的时候(读取过程),再根据对象的HashCode再从Hash表中取这个对象,提高取对象的效率(若HashCode相同再去调用equal)。
2.HashMap的底层实现
由键值对(key-value)Entity内部类单元组成,通过对Key的哈希值对数组长度取模相当放到一个链表中,形成数组+链表结构存储方式,提供存储和查找效率。
3.区别
HashMap是非synchronized的,并可以接受null,Hashtable是synchronized,意味着Hashtable是线程安全(单线程运行,比HashMap慢),HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。

3)说一下concurrentHashMap和hashTable在性能上的区别?以及这种差异形成的原因?
ConcurrentHashMap是使用了锁分段技术来保证线程安全,将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。
hashTable通过synchronized只能有一个线程进行读写操作。

4)讲一下堆以及堆排序?
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

5)说一下B+tree和二叉搜索树的区别?说一下二叉搜索树和AVL树、红黑树之间的差别?
B+Tree相对于B-Tree(二叉搜索树)有几点不同:
非叶子节点只存储键值信息。
所有叶子节点之间都有一个链指针。
数据记录都存放在叶子节点中。
差别:
AVL树(平衡二叉查找树),解决单支的情况。平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(接近平衡二叉树)
二叉排序树 (BST) 即二叉搜索树
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结构的值
(3) 它的左子树和右子树都是二叉排序树

6)给你两个文件(字符串形式的)如何找出他们之间的不同地方?
利用递归算法,比较两个字符串相同部分,将相同部分置空格,然后比较改变前后字符串取非空格部分高亮显示。

7)知道倒排索引嘛?
倒排索引源于实际应用中需要根据属性的值来查找记录,lucene是基于倒排索引实现的,例如读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页的查找。

3面(35分钟):总共四个问题(其实是两个)

1. 给你50亿行字符串,机器4G内存(只能一台机器),找出重复次数最多的那行字符串?(以行为单位,每行不超过10个字符)
根据50亿和4G的限制,直接想到切割多少份文件后,争取这一份文件大小够加载4G内存进行解析(当然当个文件尽可能接近内存大小,充分利用内存读取速度,提供整体计算时间),大概分为500比较合适(每个文件大概100m左右,加载内存解析够了),让后按照hash(行号)%500进行分配存储,分别对每个文件排序后再存在有序大小字符串文件,通过选择排序逐步递归筛累计结果。

2. 一个圆上三个点形成钝角的概率是多少?
3/4;
1:在圆上任意取第一个点A;
2:再任意第二个点B,有AB重合、AB在同一条直径上两个特殊点,
但对于圆上的无数个点来说,B取到上面两个特殊点的概率为0;
所以可以使AB能够不重合且不在同一直径上的概率为1;以下叙述将不考虑上述两个特殊点;
由上所述,A、B两点的取法可以看做是任意取,概率为1;
3:再任意取第三点C,C有与A重合、与B重合两个特殊点,同上,可以忽略不计
设原点为O,则AO交圆于点D,BO交圆于点E,则C在弧DBAE时(D、B、A、E四点除外),三角形ABC为钝角三角形;
由AB的长度从趋近于零,到趋近于直径,弧DBAE的长度由趋近于圆周长1,到趋近于半圆周1/2,
所以弧DBAE的平均长度为(1+1/2)/2 = 3/4;
所以三角形ABC为钝角三角形的概率为3/4

3. 假如两个点和圆心形成的圆心角已经是直角,那么第三个和这两个点形成钝角的概率是多少?(接上一题)

4. 快速排序的平均复杂多少?最坏情况是什么?
平均情况,O (nlogn);
最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n)。

发布了18 篇原创文章 · 获赞 4 · 访问量 924

猜你喜欢

转载自blog.csdn.net/weixin_43698561/article/details/104176147