IBM
1.面向对象的基本特征,说下多态的内容
答:封装,继承,多态。多态(上转型)重要说下。
2.介绍一下排序算法,介绍一下堆排。
插入,冒泡,快排,希尔,堆排
3.一个人买东西,买200元就有一个100元的代金券,下次再买200可以使用,计算一下折扣率。
在买次数趋于无限大时,折扣是5折。
4.生产者,消费者问题。 wait notify synchronized 给List加锁。
其他总结
6.KMP算法:http://www.cnblogs.com/c-cloud/p/3224788.html
7.vmstat 内存使用情况
8.逃逸分析:https://my.oschina.net/hosee/blog/638573
9.Java 中的native方法:http://blog.csdn.net/wike163/article/details/6635321
10.平衡三进制:
我们用一个等臂天平来称物体的质量,如果我们要称的物体质量范围在1到40克(整数),请问我们最少需要几块砝码可以完成这项物体质量的称量?答:1111 1 3 9 27
11.垃圾回收
两个最基本的java回收算法:复制算法和标记清理算法
复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出
标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
两个概念:新生代和年老代
新生代:初始对象,生命周期短的
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制
1.Serial New/Serial Old
Serial/Serial Old收集器是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial New收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。
2.Parallel New
Parallel New收集器是Serial收集器的多线程版本(参照Serial New),使用多个线程进行垃圾收集。
3.Parallel Scavenge
Parallel Scavenge收集器是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。
4.Parallel Old
Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。
5.CMS
CMS(Current Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。
6.G1
G1收集器是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。
12.HTTP协议通常承载于TCP协议之上,有时也承载 于TLS( 安全传输层协议 )或 SSL( 安全套接层协议Secure Sockets Layer )协议层之上,这个时候,就成了我们常说的HTTPS
13.BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
14. 就说最简单和普遍的HashMap,让你讲讲,你就可以先说说hashMap的设计原理,底层结构(链表+数组)扩容方式等,从这你就可以说说这种设计好在哪里(比如讲一讲put是如何做hash的),这时候你可以说这种hash可能会有冲突,https://my.oschina.net/yangkui/blog/372002 hashMap也是做了相应设计的。
然后面试官会问题你怎么解决冲突?你可以再给他讲讲解决hash冲突的三种通常方式,而hashMap用的是链式法,然后可以说到这样会有隐患就是hash链过长。
面试官再问,你会给他讲解决复杂度高的长链用了红黑树的结构,这里还可以延伸到红黑树的特点或者jdk7和jdk8的不同实现,这时候你可以说解决hash冲突,但hashMap还会有并发和同步的问题。
面试官会让你再讲讲,你可以说说hashtable是线程安全的,怎么实现的(sync函数),并不好,从而引出更好的juc包,说说concurrentHashMap,之后又可以说道锁分段原理,弱一致性迭代器,concurrentHashMap的锁粒度(java7和java8不同),同包的CopyOnWriteArray等等。
你还可以延伸说到锁(重量、轻量、悲观乐观各自实现、底层源码等等)、缓存(因为很多时候Map的结构可以作为缓存,从而可以说到缓存系统的设计,kv原理,分布式缓存redis、memcashed等等)
举这个例子就是想说,一个简单的基础问题可以一步一步有条理有层次的回答,每一层表达完抛个引子,让面试官可以继续问下去,从而让面试官真正了解你的掌握的深度。
美团面试题全网总结:
1.运行时异常及处理方法:
Java分为 Runtime异常和Checked异常,二者都可以用try...catch 进行捕获。
2.抽象类和接口:
相同点:都不能被实例化,用于被其他的类继承,实现。
都可以包含抽象方法,实现接口或继承抽象类的子类必须实现全部抽象方法
不同点:接口体现的是一种规范,而抽象类体现的是一种模板式的设计
接口里面只可以包含抽象方法,静态方法,默认方法,不能为普通方法提供方法的实现,只能定义静态常量。抽象类里面可以包含普通方法,静态常量,普通常量。
接口里面不包含构造器。抽象类里面包含构造器,但是不是用来创建对象,而是用来完成初始化操作。
3.HashMap的put方法源码
在jdk1.7中 hashmap底层结构就是数组+链表的结构,如果发生冲突,即hashcode相同key也相同,但是value不同的话,那么就会放在底层数组的同一个下标处,官方话叫同一个桶内,以链表的形式保存
在jdk1.8中 数组+链表+红黑树的结构 :http://www.cnblogs.com/jzb-blog/p/6637823.html
4.ArrayList,LinkedList的实现以及插入,查找,删除的过程
2017.7.31(最黑暗的7月末 美团跪 == 哇竟然没跪 还有第二次机会)
1.SpringMVC和Struts的区别,什么情况用SpringMVC什么情况用Struts。https://my.oschina.net/youjinli/blog/882484
2.JQuery对于JS的优点。
3.项目中多线程,java中解决多线程,lock同步代码块的区别
4.项目中文件夹的分类。
cvte笔试总结(一面挂):
1.完全二叉树有208个节点,叶子节点的个数
208个节点 那就是有 8层 除去最后一层的节点2^7-1= 127个非叶子节点 208-127=81个叶子节点
2.哲学家进餐问题:http://www.cnblogs.com/vettel/p/3438257.html
2017.8.12 cvte 一面
1.项目介绍
2.内连接 外链接: http://www.cnblogs.com/youzhangjin/archive/2009/05/22/1486982.html
3.List 排序 sort 方法 重写 http://www.cnblogs.com/supperwu/archive/2012/06/13/2548122.html
4.说一下自己擅长的部分