logo资料库

2019蚂蚁金服面试题及答案.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
一、开场白 简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要 负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模 棱两可不是很清楚的最好不要写,否则会被问的很尴尬) 介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的 技术细节;(主要对自己做过的事情是否有清晰的描述) 二、Java 基础  什么是字符串常量池?JVM 为了提高性能和减少内存开销,在实例化字符 串常量时进行了优化,字符串类维护了一个字符串池,当创建字符串常量时 会首先检查字符串常量池,如果有此字符串值会返回此字符串值得引用,否 则创建实例化一个字符串放入池中。 String 为什么是不可变的?String 类是 final 修饰的,是不变对象,指  向对象的引用可以指向其他对象,但是引用指向的对象状态(属性)不可改变。 与不变变量(指向对象的引用不可改变,引用指向的对象属性可以改变)相对。 String s = new String("xyz");究竟产生了几个对象,从 JVM 角度谈  谈?两个对象,因为是 new 的,会在堆内存中创建一个引用对象以及在常量 池中存放值为”xyz”的常量。
String 拼接字符串效率低,你知道原因吗?因为 string 每做一次”+”  就会创建一个 StringBuilder 对象,append 后就丢弃,创建和销毁对象会浪 费很多时间。  你真的了解 String 的常见 API 吗? Java 中的 subString()真的会引起内存泄露么?不算内存泄漏,本字符传  及引用的源字符串都可被回收。  浅析 Java 中的 final 关键字? final 修饰类不能被继承,修饰方法不能被重写,修饰变量,值不能被修改。  浅析 Java 中的 static 关键字? static 修饰的方法称为静态方法,非静态方法中可以访问静态方法,而静态 方法中不可访问非静态方法,可以通过类名.方法名的方式调用静态方法。静 态变量在内存中只有一份,使用类名.变量名的方式调用静态变量,非静态变 量只能通过对象.属性的方式调用非静态变量。  你对 Java 中的 volatile 关键字了解多少?使用 volatile 修饰的变量, 每次使用时都会去内存中获取最新值。 i++是线程安全的吗?如何解决线程安全性?不是,加同步锁 synchroniz  ed  从字节码角度深度解析 i++ 和 ++i 线程安全性原理?i++是先使用值再 进行加 1,而++i 是先进行加 1 运算后,再使用值。  请谈谈什么是 CAS?CAS 是计算机硬件对并发操作共享数据的支持,cas 算法用来解决并发编程中出现的原子性问题。  从源码角度看看 ArrayList 的实现原理?  手写 LinkedList 的实现,彻底搞清楚什么是链表?  Java 中方法参数的传递规则?值传递和引用传递 Java 中 throw 和 throws 的区别是什么?throw 是语句抛出异常,throws  是方法可能抛出异常的声明。  重载和重写的区别?重载是同一个类中,方法名可以相同,方法的参数列 表(参数个数、参数顺序、参数类型)不同。重写是子类继承父类可以对方法 覆盖。  手写 ArrayList 的实现,在笔试中如何过关斩将?
 finally 语句块你踩过哪些坑?  为什么重写 equals 方法需同时重写 hashCode 方法? hashcode 方法的返回值需要满足两个要求:1、使用 equals 方法判断相等的 两个实例应该返回相同的散列码值。2、在应用程序的单次执行过程中,两次 以上调用对象的该方法应该返回相同值。 重写 equals 方法是一般要重写 hashcode 来保证符合以上两个要求。 equals() 与 == 的区别?equals 比较的是对象的状态,==比较的是对象  的引用是否是同一对象。  StringBuffer 和 StringBuilder 的区别,从源码角度分析? StringBuffer 是线程安全的可变字符串封装类,而 StringBuilder 是非线程 安全的可变字符串封装类。  你知道 HashMap 的数据结构吗?基于 hash 算法  为何 HashMap 的数组长度一定是 2 的次幂?  HashMap 何时扩容以及它的扩容机制? HashMap 的 key 一般用字符串,能用其他对象吗?可以,也允许 null 键和  null 值 HashMap 的 key 和 value 都能为 null 么?如果 key 能为 null,那么它是怎  么样查找值的?可以 HashMap 是线程安全的吗?如何实现线程安全?非线程安全,使用 synch  ronized 关键字  从源码角度分析 HashSet 实现原理?   HashTable 与 HashMap 的实现原理有什么不同? String 方法 intern() 你真的会用吗?  什么是自动拆装箱?基本数据类型转换为包装类成为装箱,反之成为拆 箱。自动例如:往集合中放入基本类型数据,会自动把基本类型数据进行装 箱作为一个对象放入集合中。 String.valueOf 和 Integer.toString 的区别?前者返回将对象转换为 s  tring 类型,后者将制定整数转换为有符号位 String 对象,以 10 进制字符 串形式返回。
三、Java 多线程  线程的生命周期包括哪几个阶段? 新建、就绪、运行、死亡、阻塞  多线程有几种实现方式? 2 种,extends Thread 和 implements Runnable 接口  请谈谈什么是进程,什么是线程? 线程是最小的执行单元,一个进程至少有一个线程。  启动线程是用 start()方法还是 run()方法?start()方法使线程进入就 绪状态,cpu 分配给该线程时间,该线程才会执行,也就是运行 run()方法。  说说线程安全问题,什么实现线程安全,如何实现线程安全?同步(sync hronized)或加锁(lock),在一个线程执行的时候,共享数据不能被其他线程 修改,保证共享数据的同步性和线程执行的有序性。  sychronized 和 Lock 的区别? 1、synchronized 是 java 内置关键字,Lock 是一个接口。 2、前者不能获取锁的状态,后者可以获取锁的状态(用 tryLock()方法)。 3、前者可以自动释放锁,后置必须用 unlock 手动释放锁。 4、前者容易造成线程阻塞,适合少量同步代码。后者不会造成线程阻塞(调 用 lockInterruptibly()进行中断等待的线程),适合大量同步代码。 5、synchronized 可重入、不可中断、非公平锁,Lock 可中断、接口下 Reen trantLock 实现类是可重入锁、ReentrantLock 和 ReentrantReadWriteLo ck 默认非公平,可设置为公平锁。  sleep()和 wait()的区别? sleep()使线程睡眠不能释放锁,而 wait()可以释放锁.  深入分析 ThreadLocal 的实现原理?线程本地变量 ThreadLocal 在每个线 程中都创建了所使用的变量副本,底层也是封装了 ThreadLocalMap 集合类来 绑定当前线程和变量副本的关系。使用起来都是在线程的本地工作内存中操 作。  你看过 AbstractQueuedSynchronizer 源码阅读吗,请说说实现原理?  谈谈对 synchronized 的偏向锁、轻量级锁、重量级锁的理解?
 通过三种方式实现生产者消费者模式?   JVM 层面分析 sychronized 如何保证线程安全的? JDK 层面分析 sychronized 如何保证线程安全的?  如何写一个线程安全的单例?  通过 AQS 实现一个自定义的 Lock?  ThreadLocal 什么时候会出现 OOM 的情况?为什么?  为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面? 简单的说 wait、notify、notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中,因为锁属于对象。  你真的理解 CountDownLatch 与 CyclicBarrier 使用场景吗?  出现死锁,如何排查定位问题?  notify 和 notifyAll 的区别? notify 通知队列等待时间最长的线程;notifyAll 通知所有等待线程。  线程池启动线程 submit 和 execute 有什么不同?submit 有返回值方便异 常处理,而 execute 没有返回值。 SimpleDateFormat 是线程安全的吗?如何解决?不是,可以使用 Thread  Local 解决,一个线程只实例化一个 SimpleDateFormat 对象。  请谈谈 ConcurrentHashmap 底层实现原理?将 ConcurrentHashMap 容器的 数据分段存储,每一段数据分配一个 Segment(锁),当线程占用其中一个 S egment 时,其他线程可正常访问  使用 synchronized 修饰静态方法和非静态方法有什么区别?  当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可 进入此对象的其方法?不可以,只有当前线程释放此对象此方法锁后,其他 线程获取该锁才可以执行此对象的该方法。 线程池的原理,为什么要创建线程池?创建线程池的方式?对象的复用,减少创 建对象和销毁对象的时间,提高系统响应。方式:1、固定数量的线程池 -newFixedThreadPool 2、大小不固定-newCachedThreadPool 3、单线程-newSingleThreadPool 4、定时线程池-newScheduledThreadPool  创建线程池有哪几个核心参数? 如何合理配置线程池的大小?
CorePoolSoze-核心线程池数量、maxinumPoolSize-最大线程池数量、keepA liveTime-核心池以外的线程存活时间、workQueue-保存待执行任务的阻塞队 列、threadFactory-每个线程创建的地方、handler-饱和策略  synchronized 修饰的静态方法和非静态方法有什么区别? Synchronized static 是某个类的范围,防止多线程同时访问 synchronized static 方法,对类的所有对象实例起作用。 Synchronized 是类对类的当前实例进行加锁,防止多线程同时访问该类的该 实例的所有 synchronized 方法。 四、Java Web  什么是 Servlet,Servlet 生命周期方法? 1、servlet 是基于 java 语言的 Web 服务器端变成技术是 sun 公司提供的一 种用于实现动态网页的解决方案。按照 javaEE 规范,servlet 是运行在 Ser vlet 容器中的 java 类,能处理 Web 客户的 HTTP 请求,返回 HTTP 响应。2、 加载、实例化、初始化(init())、处理请求(service())、销毁(destroy())  什么 Session 和 Cookie,它们之间有什么联系? Session 技术是指使用 HttpSession 对象实现会话跟踪的技术,是一种在服 务器端保持会话跟踪的解决方案。cookie 技术是一种在客户端保持会话跟踪 的解决方案。  JSP 的八个隐含对象有哪些? 1、与 Input/Output 有关:request、response、out 2、与 Context 有关:s ession、application、pageContext 3、与 Servlet 有关:page、config  JSP 的四个域对象的作用范围? 1、页面域:生命周期是指页面执行期间。2、请求域:生命周期是指一次请 求过程。3、会话域生命周期是指某个客户端与服务器所连接的时间(包含多 次请求)。4、应用域:生命周期是指服务器开始执行服务到服务器关闭为止。  Post 和 Get 请求的区别? get 主要用于获取/查询资源信息,请求的参数会在 url 上以明文显示,传输 数据大小有限;post 常用于更新资源信息,传输数据量较大。  转发和重定向有什么区别? 1、请求转发只能转发给同一个 Web 应用中的组件,而重定向可以重定向到当 前应用程序中的其他资源、同一个站点上其他应用程序的资源、其他站点
的资源。 2、请求转发浏览器地址栏不改变(服务器内部处理),重定向浏览器地址栏改 变(重新发起一个新请求)。 3、请求转发调用者与被调用者共享同一个请求对象和响应对象,而重定向调 用者和被调用者使用各自的请求对象和响应对象。   JSP 自定义标签,如何实现循环打印功能? Http1.0 和 Http1.1 的区别是什么? 1、Http1.1 支持长连接(持久连接)和流水线处理(可以发送多个 http 请求 和响应、多个请求和响应可以重叠,可以同时进行)2、增加了 host 字段, 请求信息和响应信息都应支持 Host 头域。3、加入一个新的状态码 100,客 户端事先只发送一个只带头域的请求,如果服务器因权限拒绝请求,就回送 响应码 401,如果收到请求就回送响应码 100。  拦截器与过滤器的区别? 1、拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。 2、拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。 3、拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起 作用。 4、拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。 5、在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器 初始化时被调用一次。 五、JVM 面试题 JVM 内存区域如何划分?分配给 jvm 的内存区域称为运行时数据区,包含  方法区、堆、栈、寄存器、常量池  JVM 堆中对象是如何创建的?通过 new 关键字来创建对象。 JVM 对象的结构?1、对象头(运行时数据(哈希值、GC 分代年龄、锁状态  标志等)、类型指针(存储对象的类元数据的指针))2、实例数据(存储对象 的有效信息)3、对齐填充 JVM 垃圾回收-如何判断对象是否是垃圾对象?两种算法(1、引用计数算  法(不常用)--对象中添加一个引用计数器,有引用此对象就加一,反之减一
2、可达性分析算法--定义一个名为"GC Roots"的对象作为起始点,这个"GC Roots"可以有多个,从这些节点开始向下搜索,搜索所走过的路径称为引用 链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则 证明此对象是不可用的,即可以进行垃圾回收)  JVM 垃圾回收算法有哪些?1、引用计数算法 2、可达性分析算法 JVM 垃圾收集器有哪些?1、Serial 收集器(单线程、收集垃圾时停止所有  线程、运行在 Client 模式下的虚拟机默认新生代收集器)2、Serial Old 收 集器(单线程、标记整理算法)3、ParNew 收集器(多线程、运行在 Server 模 式下的虚拟机首选的新生代收集器)4、Parallel Scacenge 收集器(新生代收 集器、采用复制算法、并行多线程)5、Parallel Old 收集器(标记整理算法、 多线程)6、Concurrent Mark Sweep 收集器(标记清除算法、获得最短回收停 顿时间为目标)7、G1 收集器(基于标记整理算法、不产生空间碎片、精确控 制停顿) JVM 内存是如何分配的?运行时数据区(方法区、堆、栈、寄存器、常量  池)  从一道面试题分析类的加载过程? JVM 双亲委派机制?ClassLoader 实例都会有一个父 ClassLoader,当被  要求寻找一个类或资源时,ClassLoader 实例就会委托给他的父 ClassLoade r,并层层向上委托。 JVM 可以作为 GC Root 的对象有哪些?1、虚拟机栈(栈帧中本地变量表)  中引用的对象 2、方法区中类静态属性引用的对象 3、方法区中常量引用的对 象 3、本地方法栈中引用的对象。  请写出几段可以导致内存溢出、内存泄漏、栈溢出的代码?  哪些情况会导致 Full GC?1、System.gc()的调用。2、老年代空间不足 (只有在新生代对象转入及创建大对象、大数组时才会出现不足的现象)。3、 永生区空间不足 4、堆中分配很大的对象(需要大量连续内存空间的 java 对 象成为大对象)。5、HandlePromotionFailure(Minor GC 之前,虚拟机先检 查老年代最大连续空间是否大于新生代所有对象总空间,大于就进行 Minor GC,小于就查看 HandlePromotionFailure 是否设置为 true,false 就进行 Fu ll GC)  频繁 GC 问题或内存溢出问题,如何定位? 六、SQL 性能优化  数据库三范式是什么?1、第一范式:当关系模式 R 的所有属性都不能在分 解为更基本的数据单位时(1、每一列属性都是不可再分的属性值 2、两列的属 性相近相似或一样,尽量合并属性一样的列)。2、第二范式:如果关系模式 R
分享到:
收藏