2017美团Java研发面经

1.1 Java基础

1. HashMap不支持同步,HashtablesynchronizedMapconcurrentHashMap同步怎么做的?

  • SynchronizedMap类是定义在Collections中的一个静态内部类。它实现了Map接口,并对其中的每一个方法实现,通过synchronized 关键字进行了同步控制。

·        HashMap实现同步的方法:调用Collections的静态方法Collections.synchronizedMap(Map map);,返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

·        ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。

·        在迭代方面,ConcurrentHashMap使用了一种不同的迭代方式。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数据iterator完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变。

HashMap的底层实现,使用的数据结构是什么?

多线程编程的要点有什么?怎么保证线程间的数据访问的安全性?

线程间通信与进程间通信方式

  • 线程间通信方式:共享内存,消息传递,事件
  • 进程间通信方式:管道,信号量,消息队列,共享内存,套接字, http://www.jianshu.com/p/9218692cb209

静态编译与动态编译

·        静态编译:在编译时确定类型,绑定对象,即通过。

·        动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

Java反射原理(区分静态和动态),注解原理

  • 反射机制的概念:

指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.

·        反射机制的应用:

生成动态代理,面向切片编程

·        反射机制的原理:

                     i.       首先明确的概念: 一切皆对象----类也是对象.所有的类都继承java.lang.class

                    ii.       通过反射类中的方法获取类中的成员变量和方法 :

      • java.lang.reflect.Constructor;
      • java.lang.reflect.Field;
      • java.lang.reflect.Method;
      • java.lang.reflect.Modifier;

                   iii.       其次明白加载: Animal.class在硬盘中时,是一个文件,当载入到内存中,可以认为是一个对象,java.lang.class的对象.

·        好文分享:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html

  • 注解是什么:注解是附加在代码中的一些说明,将类的外部信息与内部成员联系起来,在编译、运行时进行解析和使用。一般注解可以分为三类:Java自带的标准注解,元注解(用于定义注解的注解),自定义注解。
  • 注解原理:注解被编译后的本质就是一个继承Annotation接口的接口,而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1,该类就是HelloAnnotation注解(接口)的具体实现类。
  • 好文分享:http://blog.csdn.net/lylwo317/article/details/52163304

类加载过程

Spring中一个bean的装配过程是怎样的

首先通过自动扫描或者手动装载的方法获取bean的依赖关系,然后通过依赖注入将bean装配到spring容器中

  1. 实例化;
  2. 设置属性值;
  3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
  4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
  5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
  6. 调用BeanPostProcessor的预先初始化方法;
  7. 调用InitializingBean的afterPropertiesSet()方法;
  8. 调用定制init-method方法;
  9. 调用BeanPostProcessor的后初始化方法; http://www.cnblogs.com/xubiao/p/5331238.html

finalfinalize finally 的不同之处?

  • final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。Java 技术允许使用
  • finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。
  • finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

AutoWiredResources注解的比较

设计模式了解什么?

单例模式怎么实现的?饿汉式单例模式下,为什么声明为静态单例对象,这时的static作用是什么?

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为, 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收,

  • 单例模式的实现方式:懒汉单例类和饿汉单例类
  • 懒汉式单例类:在第一次被引用时,才会进行实例化;
  • 饿汉式单例类:这种静态初始化的方式是在加载时就进行实例化。
Public class Singleton{
    //类加载时就初始化
    private static final Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    } 
}

单例模式典型的应用场景

1.    网站的计数器,一般也是采用单例模式实现,否则难以同步。

2.    应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

3.    Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

4.    数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为如果用单例模式来维护,就可以大大降低这种损耗。

5.    多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

6.    操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。

单例模式应用的场景一般发现在以下条件下:

1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。

2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

static的作用

  • 确保只能通过该类提供的方法来获取类的对象。
  • 用public 修改的static变量和方法本质上都是全局的,可以通过类名来直接引用;
  • 若在static变量前用private修饰,则表示这个变量可以在类的静态代码或类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。

G1垃圾收集器是什么?有垃圾收集器还会导致OOM吗?

  • OOM内容溢出:是指程序在申请内存是,没有足够的内存空间供其使用。
  • 内存泄漏:是指不再被程序使用的对象或变量还在内存中占有存储空间,容易引起内存泄露的原因:
    1. 静态集合类
    2. 各种连接:数据库连接,网络连接以及IO连接;
    3. 监听器
    4. 不合理的变量作用域
    5. 单例模式可能造成内存泄漏

递归与迭代的区别

1. 递归

·        递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.

一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.

·        使用递归要注意的有两点:

    1. 递归就是在过程或函数里面调用自身;
    2. 在使用递归时,必须有一个明确的递归结束条件,称为递归出口.

·        递归分为两个阶段:

    1. 递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
    2. 回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.

·        递归的缺点:由于递归引起一系列的函数调用,并且有可能会有一系列的重复计算,递归算法的执行效率相对较低.

2. 迭代

·        迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.

递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.

·        好文分享:http://blog.csdn.net/swliao/article/details/5337896

2.1Linux,操作系统

MemCache

·        Memcached介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

·        工作原理

Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。下图展示了memcache与数据库端协同工作情况:

1.    检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。

2.    如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。

3.    保持缓存的新鲜性,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

redis原理,redis的常用数据类型

·        Redis介绍

Redis 是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串) list(链表)set(集合)zset(有序集合)。这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。为了保证效率,数据都是缓存在内存中。

·        好文分享:http://www.cnblogs.com/work115/p/5584646.html

linux怎么查看端口和系统负载情况

  • ps:查看进程,ps aux 或者 ps -elf,常和管道符一起使用,查看某个进程或者它的数量;
  • netstat:查看端口,netstat -lnp用于打印当前系统启动了哪些端口,netstat -an用于打印网络连接状况;

netstat的原理

缺页中断是什么

  • 缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。

抖动是什么,原因是什么,怎么解决

  • 抖动现象,指如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将很频繁地产生缺页中断,这种频率非常高的页面置换现象称为抖动。
  • 原因:页替换算法不合适,运行的进程数过多,主内存过小
  • 解决办法:好的页替换算法;减少运行的进程数;增大内存。

常见的页面置换算法有哪些

Linux系统的特点是什么?

进程是什么?线程是什么?两者区别,什么是多进程和多线程?为什么要有多进程和多线程?

说一说linux的常用命令

  • cd,ls,grep,find,pwd,ifconfig,netstat,ps,cp,mv,mkdir,chmod,rm,kill,cat,vi,whereis,locate,wget,curl,
  •  

操作系统是在慕课网上看的是北京大学陈向群老师讲的《操作系统原理》

3.1 项目

项目介绍

项目中遇到的最大困难是什么?怎么解决的?

如何准备招聘会的?看什么书,做什么题?做题形式,做题内容

4.1 网络协议

http请求的过程

访问百度的过程

HTTP协议

404错误是什么?为什么404是服务器找不到资源却是客户端报错呢?

5.1MySQL

数据库引擎的对比

mysql默认隔离级别

mysql 的隔离级别有四种:读未提交,读已提交,可重复读,可串行化。大多数的数据库系统的默认事务隔离级别都是:Read committed,而mysql的默认事务隔离级别是:Repeatable Read

mysql是用共享锁还是排他锁(属于行锁)

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。

·        共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

·        排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据进行读取和修改。

mysqlInnoDB引擎默认的修改数据语句

  1. update,delete,insert都会自动给涉及到的数据加上排他锁,
  2. select语句默认不会加任何锁类型。
  3. 加排他锁可以使用select ...for update语句,
  4. 加共享锁可以使用select ... lock in share mode语句。

B+,B-

6.1 算法

将一个数组的奇数和偶数分开

已知前序和中序求后序

上台阶(剑指offer原题)

洗牌算法

链表反转

二叉树的层序遍历(画图演示)

二叉树的后序遍历,递归,非递归两种

在二叉搜索树中查找给定的值

三窝狼过河

10亿个手机号码中找一个给定号码是否存在?要求快速(布隆过滤器)

7.1 其他

为什么选择我们公司?为什么做软件开发?(和专业不相符)

有什么问题要问?

8.1 最后提问

公司对应届生的要求是什么?对我的建议在公司的工作体验是什么?

和公司相关的问题都可以提。

 

总结

美团今年确实是扩招,要大量扩大业务范围,如果提前准备好,最后进去的机会很大。很可惜,我是提前批的电话面试,当时还是8月底,9月初,第一个秋招面试的机会,而且电话面确实不如现场面的好,所以两面之后就没有下方了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值