面试:面经笔记 2017.6

按牛客网讨论区笔经面经的发表时间排序。

 


 

今天斩获今日头条 实习offer 特来分享

 
1. mysql引擎索引
mysql两种存储引擎:InnoDB和MyISAM
区别:(1.事务;2.锁;3.效率;4.查询/插入更新)
 
2. map底层实现
3.最小堆;
 
4.http协议
  HTTP是超文本传输协议 Hyper Text Transfer Protocol, 它主要负责web server和web浏览器之间的通讯,HTTP协议把web client (浏览器)的请求发送到一个web server, 并把网页内容从web server返回到浏览器。常用请求包括get和post两种。
  HTTPS 是安全超文本传输协议 Secure HTTP, 主要用于在web server和web 浏览器之间进行隐私数据的传输
 
5.java多线程
6.缓存数据库 比如redis。
todo
 
 

 

BAT面经,暑假前趁热来一发吧

百度(offered)
百度一面
1 手写ArrayList
 
2 手写 进制转换算法,求出一个数的二进制数1的个数

A、十进制转换其他

  十进制转成二进制 
  Integer.toBinaryString(int i) 

  十进制转成八进制 
  Integer.toOctalString(int i) 

  十进制转成十六进制: 
  Integer.toHexString(int i)

B、其他转换十进制

  二进制转十进制 
  Integer.valueOf("1010",2).toString()

  八进制转成十进制 
  Integer.valueOf("125",8).toString() 

  十六进制转成十进制 
  Integer.valueOf("ABCDEF",16).toString() 

 求二进制1的个数?

num&(num-1)的结果即为把最右边的1置零;

 
3 equals和==
(1.基本类型;2.基本类型封装;3.String;4.普通对象;)
 
4 多线程方式、 threadlocal,各种 synchronized和lock
synchronized和lock异同?
(1.属性;2.trylock;3.释放;4.线程交互)
  1)lock是接口,syn是Java中的关键字;
  2)lock的tryLock方法可以选择性获取锁,能够规避死锁;而syn会一直获取下去;
  3)syn发生异常或者同步块结束的时候,会自动释放锁;而Lock必须手动释放unlock;
  4)syn线程交互,用到的是同步对象的wait/notify/notifyAll方法;lock得到一个Condition对象,调用Condition对象的await/signal/signalAll;
 
5 设计模式、 spring类加载方式、实例保存在哪、 aop ioc反射机制
定义bean的方式?
1)XML配置方式;2)注解方式;
bean存储?
利用java反射机制,生成bean实例,实例化的单例bean放入HashMap存储,id作为key;
参考: bean存储和管理
aop?ioc?
反射机制?
反射机制实际上就是动态的加载一些类,这些类在编译时不需要加载,但运行时再调用。
反射是在运行时获取类信息,通过动态的调用来改变程序行为。
 
 
6 类加载器双亲委派模型,热部署
类加载器ClassLoader?
(三类、加载的类库、实现)
系统提供的类加载器包括三类:启动类加载器Bootstrap、扩展类加载器Extension、应用程序类加载器Application。
启动类加载器Bootstrap,加载JDK/jre/lib下的类库,也就是Java的核心库;启动类加载器是用原生代码而不是java实现的,并不继承自java.lang.ClassLoader,除此之外基本上所有的类加载器都是java.lang.ClassLoader类的一个实例。启动类加载器是无法被Java程序直接引用的。
扩展类加载器Extension,加载/lib/ext目录的扩展库;可以被开发者直接使用。
应用程序类加载器Application,加载Java应用类路径ClassPath所指定的类。
 
双亲委派模型?
(流程、优点、举例)
工作流程是:如果如果一个类加载器收到了类加载的请求,不会首先自己去加载,而是把请求委托给父加载器去完成,依次向上。只有当父加载器在搜索范围中没有找到所需的类时,即无法完成加载,子加载器才尝试加载该类。
双亲委派模型优点是Java类随着类加载器具备了待友优先级的层次关系,对于保证Java程序稳定运作很重要。例如Object类在lib的rt.jar中。
 
热部署?
热部署,简单点来说,就是我们将打包好的应用直接替换掉原有的应用。
每一个应用程序的类都会被ClassLoader加载,所以,要实现一个支持热部署的应用,我们可以对每一个用户自定义的应用程序使用一个单独的ClassLoader进行加载。然后,当某个用户自定义的应用程序发生变化的时候,我们首先销毁原来的应用,然后使用一个新的ClassLoader来加载改变之后的应用。而所有其他的应用程序不会受到一点干扰。
参考: 热部署
 
 
7 jvm内存模型,内存结构、 堆的分代算法堆的分区gc算法gc过程
JVM内存模型?
JVM内存模型包括5个部分,分为线程共享的和线程隔离的部分。
线程共享的数据区是堆和方法区;
线程隔离的数据区是虚拟机栈、本地方法栈和程序计数器;
  1) 程序计数器:是一个比较小的内存区域,,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。每个程序计数器只用来记录一个线程的行号,所以是线程私有的。(行号指示、线程私有)
  2) 虚拟机栈:一个线程的每个方法在执行的同时,都会创建一个 栈帧,栈帧中存储的有 局部变量表、操作数栈、动态链接、返回地址等,当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。(栈帧)
  3) 本地方法栈:本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是: 虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的
  4) 方法区:方法区是各个线程共享的区域,用于 存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。
  5) 堆区:堆区的存在是为了 存储对象实例,原则上讲,所有的对象都在堆区上分配内存。堆区也是Java GC机制所管理的主要内存区域。
 
堆的分代算法?分区?GC算法?GC过程?
内存分配,主要指的是在堆上的分配。Java内存分配和回收的机制概括的说,就是: 分代分配,分代回收。对象将 根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
算法的选择:在新生代中, 每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。方法区永久代,回收方法同老年代。
年轻代:分区 Eden S0 S1;Minor GC;复制算法:将Eden区和一个Survivor中仍然存活的对象拷贝到另一个Survivor中。
年老代:Full GC 标记整理算法:标记出仍然存活的对象(存在引用的),将所有存活的对象向一端移动,以保证内存的连续。
 
 
8 tcp ip 七层模型 rest接口规范 get和post区别,长度,安全。
七层模型?
自底向上是:物理层、链路层、网络层、传输层、会话层、表示层、应用层;
rest接口规范?
get和post区别?
(1.http规范:幂等、安全;2.应用:参数/保密性、长度 3.总结)
根据HTTP规范:
 1)get用于信息获取,是安全的和幂等的。安全是针对服务端而言,get不会引起数据的变化,例如对数据库的增删改。产生的结果是幂等的,指同一个url和同样的get参数,呈现给用户的结果相同。
 2)post可能引起数据的变化。比如填写表单更新数据。
从应用角度来看:
 1)get请求参数放在URL后面,格式是URL?key1=value&key2=value...即?在URL后面,多个参数用&隔开,可以在链接看到参数。长度方面:理论上HTTP对get参数没有长度限制,但是一般打开链接都是通过浏览器,因此会受到浏览器或者操作系统限制长度,比较常见的限制长度是1024字节。
 2)post请求数据会放在HTTP包中,保密性相对安全。HTTP标准也没有对POST数据进行限制,但是会受到服务端的长度限制,如处理的程序(PHP),服务器引擎(Apache)。
总结:
 1)get适合于查询区分某些特定数据的页面,如商品展示。
 2)由于post的HTTP标准,因此更适合做数据的改变,而且由于应用角度上的数据传递方式,更适合用于登录注册功能页,因为数据不会显示在url中,相对安全一些。
 
 
 
9 tcp ip的 ARP协议,两个同一网络的主机如何获得对方的mac地址。
ARP协议?
(功能、工作原理)
ARP(Address Resolution Protocol)是地址解析协议;
OSI模型把网络工作分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不直接打交道。在通过以太网发送IP数据包时,需要先封装第三层(32位IP地址)、第二层(48位MAC地址)的报头,但由于发送时只知道目标IP地址,不知道其MAC地址,又不能跨第二、三层,所以需要使用地址解析协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。(概括:在不同层,不能传输)
工作原理:
(1.查;2.有,没有-ARP请求;3.不一致,一致-ARP响应;4.收到,没收到)
  0)ARP缓冲区,ARP列表-IP地址和MAC地址的对应关系;
  1)检查ARP列表;
  2)列表没有;发起ARP请求的广播包,包括源主机IP、MAC以及目的主机IP地址;
  3)网络中所有主机收到ARP请求,检查IP和自己IP是否一致,不同则忽略;
  4)相同:1.首先将发送端MAC和IP添加到自己的ARP,如果以及存在则覆盖;2.给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;
  5)源主机收到ARP响应包,将目的主机IP和MAC添加到ARP列表;并开始数据传输;
  6)如果源主机一致没有收到ARP响应数据包,表示ARP查询失败。
 
10 负载均衡、高并发、高可用的架构
 
11 mysql的引擎区别
MyISAM和InnoDB:(1.事务;2.锁;3.效率;4.查询/插入更新)
 
12 redis缓存,redis的集群部署,热备份,主从备份,主从数据库,hash映射找到知道指定节点。
todo
 
13 了解云计算么,了解云容器docker么,容器和虚拟机的区别。

 
百度二面
1自我介绍 项目中负责哪些 做了哪些
2项目中的数据库备份,主从数据库、集群
 
 
3 数据库索引原理, b+树原理, trie树引申, 二叉查找树的原理
索引?
索引:数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
二叉查找树原理?
对于树的每个节点,大于左子节点的值,小于右子节点的值;
B树?
(把B树和B+树的两张图多熟悉一点)
B树是多路搜索树;B树的结构保证了它是比较平衡的,每个结点的子树都不能过少,且从根到叶的路径长度都相同,这对于提高查找效率非常有利。
  1)每个节点存放M/2-1(上取整)到M-1个关键字;
  2)根节点的儿子树是[2,M];
  3)除根节点外非叶子节点的儿子数是[M/2,M];
  4)非叶子节点的关键字个数 = 指向儿子的指针个数 - 1;

B树的搜索:从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点。

B树的特性:关键字分布在整棵树中;搜索性能等价于在关键字全集内做一次二分查找;

B+树?

B+树是B树的变体,也是多路搜索树;不同的是:

  1)非叶子节点的子树指针与关键字个数相同;

  2)非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)

  3)为所有叶子结点增加一个链指针;

      4)所有关键字都在叶子结点出现;

B+的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+树的特性:

       1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

       2.只会在叶子结点命中;

       3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

trie树?

即字典树/单词查找树;是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

3个基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

参考:Trie树

 
 
4 海量数据中查找一个单词,分布式计算map reduce ,或者用hsah映射筛选部分结果
 
5java的 抽象类和接口区别、java的 hashmap,java的 内存模型,分区,分代 垃圾回收算法。实例、常量放在哪里。
抽象类和接口区别?
(1.变量;2.方法(抽象、public);3.一/多;)
  1)变量:接口的变量默认是final的,而抽象类可以包含非final变量;
  2)方法:接口中的方法默认是public,抽象类方法可以是private/protected/public;接口中只能提供抽象方法,而抽象类中既可以提供抽象方法,也可以提供实现方法;
  3)一个类可以实现很多接口,但只能继承一个抽象类;
hashmap?
(1.结构;2.put/get;3.参数-容量、负载系数、阈值)
(讲到容量是2的n次方的时候可以延伸讲一下原因;)
 
 
6 int 4个字节,double 8个字节。
基本数据类型

整型4种:byte/short/int/long  字节数:1/2/4/8

字符型1种:char  2

浮点型2种:float/double  4/8

布尔型1种:boolean 1/8

 
 
7 多线程中的 wait和sleep区别, notify的作用
wait和sleep区别?
(1.属性;2.锁;3.范围;)
  1)属性:wait()是Object的方法,而sleep()是线程类Thread的方法;
  2)锁:wait会放弃对象锁,进入等待队列,只有调用了notify(),才会结束wait状态,参与竞争同步资源锁;而sleep()只让出了cpu,而不会释放同步资源锁,sleep指定时间后CPU再回到该线程继续往下执行;
  3)范围:sleep可以在任何地方使用,wait只能在同步方法或同步块中使用;
 
 
8 设计模式了解哪些,写一个 观察者模式。实现两个接口,一个是主题一个是观察者,并写出对应方法。
观察者模式?
观察者模式包括:抽象主题、具体主题;抽象观察者、具体观察者;
抽象主题,提供attach、detach、notify三个方法;
抽象观察者,提供update方法;
 
 
9写一个 生产者消费者队列的方法,分别写两个类代表生产者和消费者,并且用队列模拟其生产消费。用while循环和wait notify可以实现,但我忘记在队列上加synchronize关键字,于是让我再写一题。写的是:输入一个字符串,输入第一个只出现一次的字符,写出来了。
 
 
10:tcp ip的 四次挥手 子网掩码的作用, 子网掩码(subnet mask)又叫 网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成 网络地址 和 主机地址 两部分。
四次挥手?
(流程;TIME_WAIT状态强调一下;四次挥手原因;)
子网掩码?
todo
 
 
11 :了解linux么,说一下linux的内核锁?没接触过。
12 有没有用过sed 使用shell脚本写一个将文本中的字符替换掉的脚本,大概说了一下用grep || 替换。没再问linux的

百度三面
1自我介绍
2负责模块,哪些模块,项目一的架构,我说太久了忘了,说最近的项目。
3 数据库连接池用的是什么,配置文件呢,数据库驱动怎么下载的,持久层框架呢。
数据库连接池?
c3p0, druid;
配置?
初始化连接数量 initialSize
最大连接数 maxActive
最大空闲连接数 maxIdle
最小空闲链接数 minIdle
空闲时间 maxWait
持久层框架?
MyBatis (和hibernate区别?)
 
 
4为什么要用 数据库连接池,有什么好处。
作用?优缺点?
1)资源重用。避免了频繁创建、释放连接引起的大量性能开销。
2)更快的系统响应速度 。数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。 
 
 
5java的 内存模型,变量和实例存在哪。java栈的作用,java的堆存什么,方法区存什么。java的 分代回收
 
6项目如何部署到云主机上,有什么速度提升,为什么有提升,答主要是设备性能和带宽。
7tomcat的配置,堆得初始大小是多少,答不知道。
8在网易实习的相关事项。
9问遇到过什么难题。
10问台湾交流经历,学习内容。
11问在遇到问题时候的办法。
12抗压能力
13优缺点
14接受加班。
15遇到工作问题,同事不配合怎么办。
16快速上手工作的办法。
先对大的结构有所了解,再深入各个部分。
 
 
17平时学习的方法,举几点。
学习新知识先过一遍基础教程,再在项目中学习,遇到重要的再深入学习。
 
 
18为什么要换工作,个人,女友。详情。
19什么时候能来。
20职业规划
三次面试每一次都是1个小时,只能说面试质量好高。
 
然后通过了。

阿里一面:
1 项目
2 项目中的问题
3 java三大特性
(1.特性;2.优点)
封装、继承、多态;
  封装:封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。优点:1.隐藏对象的属性来保护对象内部状态;2.禁止对象的不良交互提高模块化;
  继承:给对象提供了从基类获取字段和方法的能力。优点:提高代码的重用性;
  多态:指允许不同类的对象对同一消息做出相应。所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
  实现多态的三个条件:
  1)继承:在多态中必须存在有继承关系的子类和父类。
  2)重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  3)向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
  多态的特点:父类对象引用子类;1.可以调用父类方法;2.子类重写父类则调用子类方法;3.只存在子类的方法不可调用,子类重载父类的方法不可调用(重载的方法父类中不存在!);
  多态的优点:可扩充性,可以方便的增加新的子类不影响已存在类的功能特性。
参考: ImportNew多态, 多态
 
 
4 jvm虚拟机 结构、算法、 垃圾回收、分代
 
5 集合类 链表数组 map几种 set等
集合类?
集合类的最顶层接口是Collection和Map接口,Collection代表一组对象,Map是保存键值对;
Collection接口包括List、Set、Queue三个接口;
List接口实现类: ArrayListLinkedList、Vector; Stack继承Vector类;
Set接口实现类:SortedSet(i)、 HashSet、EnumSet; TreeSet实现SortedSet,LinkedHashSet继承HashSet;
Queue接口实现类:Deque(i)、PriorityQueue;ArrayDeque和LinkedList实现Deque
Map接口包括 HashMapTreeMap
Set和List?
Set不允许重复元素、允许一个null值,没有索引;
List允许重复元素、允许多个null值、有索引、按插入顺序显示;
HashSet?
内部实现了hashmap;
 
 
6 二分查找代码
(经典二分、第一个、最后一个、旋转排序最小值、旋转排序tar、)
 
7 mysql相关
(事务、引擎、索引、树)
 
8 spring
(IoC、AOP、动态代理、)
 
9 前后端数据交互
10 网络、操作系统
11 用过哪些技术


阿里二面:
1 项目
2 spring springmvc mybatis
3 GitHub上的代码是什么 代码包括 剑指offer 项目一 项目二 游戏项目 校招笔试题 Android项目
4 大三机器人项目
5 实习经历
6 github上某个项目的开发过程
7 学院排名
20分钟直接过了,十分开心,基本没问什么技术问题。

阿里hr面
1自我介绍
2项目经历
3实习经历
4实习经历 具体
5实习为什么找这里
6实习方向,开发方向转变
7评价自己
8缺点
9大学时期获奖
10为什么选择支付宝部门,其他部门呢
11有什么问题
问了好多问题,基本是一个问题接着上一个。hr面也顺利结束
但是作死的事发生了,背景调查的时候时间没谈妥,我本来以为后续会再商讨,结果20天没有一个电话再打进来,由于是总机号码我也打不回去。直到今天流程被回绝,累觉不爱。不得不吐槽一下这坑爹的安排。来年再来,今年实习进不了来年校招再见吧。

 
腾讯校招1面
学校经历
学习方式
项目
找实习的方式
什么是后端开发
女朋友
意向城市
独生子女

http的数据包格式?
 
tcp包含ip么
TCP是传输控制协议,IP是因特网协议;
 
 
tcp的数据包格式?
(就是tcp报头?)
五层:1.源端口16+目的端口16; 2.序列号32; 3.确认号32;4.头部4+保留位6+标志位6+窗口大小16位;5.校验和16+紧急指针16;
 
 
mysql 数据库连接池的驱动参数
DBCP:
driverClassName:连接数据库所用的 JDBC Driver Class, 
password: 登陆数据库所用的密码 
url: 连接数据库的 URL 
username: 登陆数据库所用的帐号 
 
初始化连接数量 initialSize
最大连接数 maxActive 可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8 
最大空闲连接数 maxIdle 最大等待连接中的数量,设 0 为没有限制 (对象池中对象最大个数)  
最小空闲链接数 minIdle 对象池中对象最小个数 
空闲时间(最大等待秒数) maxWait
参考: 数据库连接池参数 
 
数据库连接池如何防止失效?
(设置参数,操作对象/空闲的时候进行验证)
testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为false  
testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为false 
testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为false 
testOnReturn,testOnBorrow这两个参数为true,表示会在每次请求之前和之后进行连接池测试,如果连接失效,就会将这条连接对象销毁,创建一个新的连接对象。
testWhileIdle参数。这个参数为true时候,表示空闲时是进行验证,检查对象是否有效。然后minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每过timeBetweenEvictionRunsMillis秒对连接池进行一次检测,将对象闲置时间超过minEvictableIdleTimeMillis秒的对象进行销毁,创建新的对象来取代。这样就能保证时刻都有正常的连接池对象存在。
 
部署项目时 tomcat 的参数?
 
热加载的原理?
热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。

热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。

对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为;
热加载则是在运行时通过重新加载改变类信息,直接改变程序行为。

热部署原理类似,但它是直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。

 
类加载的原理?
(三个类加载器,双亲委派)
类加载器:
启动类Bootstrap:加载lib下的核心库;
扩展类Extension:加载lib/ext目录的扩展库;
应用程序类Application:加载Java应用类路径ClassPath指定的类;
类加载采用双亲委派机制:
工作流程是:如果一个类加载器收到类加载的请求,不会自己加载,而是首先委托给父加载器完成,依次向上。当父加载器无法完成加载,子加载器才会尝试加载。
优点:使Java类随着类加载器具备了带有优先级的层次关系,对于保正Java程序稳定运作很重要。例如Object类在lib的rt.jar中,防止不可靠甚至恶意的代码代替由父类装载器装在的可靠代码。
 
mybatis的#和$号区别
(1.属性; 2.性能;3.注入;4.表名;5.不变)
1.属性:#{para}是预编译,${para}是字符串替换;
2.性能:预编译的sql可以重复利用;所以#{}性能较优;
3.注入:${}是字符串替换,会存在sql注入问题;比如select * from table where name = ${smith or 1 = 1},这样无论是否匹配,都能查到结果;
4.表名:表名必须使用${tablename},因为预编译的占位符进行变量替换后会带上单引号。而表名不能加单引号;
5.不变:如果插入不改变的字符串,比如order by ${para} 那么就可以用${};
 
java的jdk源码
hashmap的iterator读取时是否会读到另一个线程put的数据?
在遍历Map过程中,不能用map.put(key,newVal),map.remove(key)来修改和删除元素, 会引发并发修改异常ConcurrentModificationException。
 
 
linux的显示文件夹大小 ls -al
linux的查看端口状态 natstat加参数
linux的查看进程的启动时间 linux ps
个人的优缺点
什么问题想问的
校招一面答得不好,主要是网络方面,答得不好。

腾讯散招一面
1自我介绍
2项目
3java的 堆和栈
 
4 内存泄漏发生在哪
堆中?因为对象实例保存在堆中。
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。

1、静态集合类引起内存泄漏:

像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。

例如

Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}

在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。

2.各种提供了close()方法的对象

比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,以及使用其他框架的时候,除非其显式的调用了其close()方法(或类似方法)将其连接关闭,否则是不会自动被GC回收的。其实原因依然是长生命周期对象持有短生命周期对象的引用。

 
5 设计模式 工厂模式 单例模式 举例子
 
 
6 mysql 数据库 实现层级树形结构 引擎 索引 查询优化 多方面
参考: 数据库存储层级结构 (修改后的前序遍历算法,节点左右标数字)
引擎?
MyISAM和InnoDB(1.事务;2.锁;3.效率;4.查询/插入更新)
索引?
(概念、B+树)
查询优化?
(1.数据库:索引、分区;2.I/O:缓冲区;3.SQL语句,条目)
1)数据库方面:1.建立有效的索引;2.对数据库分区(如按时间分区);
2)I/O方面:增加缓冲区;
3)SQL语句方面:1.优化SQL语句,减少比较次数;如避免select * from而使用具体的字段列表代替,避免在where中使用!=或<>操作符,否则将放弃索引而进行全表扫描; 2.限制返回条目limit;
 
 
7微信红包的设计 开发 注意 用户数据的统计 项目相关
8cdg事业群 问题 
 
 

 

二轮 阿里面经 估计走远

6.9
一轮(90min)
1 首先自我介绍
2 介绍做过的项目之类的
3 你最近再看什么书 答 java编发编程艺术
4 说说java 线程安全的实现方式  ThreadLocal 加锁
(1.同步方法;2.同步块;3.ReentrantLock;4.volatile;5.ThreadLocal)
 
 
5 谈谈 ThreadLocal 内置一个map key是当前线程 value是对应的值 实现线程变量私有化
作用:ThreadLocal的作用是为每个线程创建一个变量副本,每个线程可以修改自己所拥有的变量副本,而不会影响其他线程的副本,从而实现线程安全。
实现方式:ThreadLocal内置一个map,key表示当前线程,value是对应的值,实现线程变量私有化。
比较:ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量)。
 
 
 
6 谈谈java中的 锁  synchronized reentrantlock
7对比两者区别 reentrantlock是jdk1.5推出来的 对比 synchronized 能够实现非阻塞是获取锁 以及中断锁 配合Condition能更灵活实现并发编程 但是需要自己收到加锁以及释放锁 synchronized则是隐式释放锁
(1.属性;2.tryLock;3.释放;4.线程交互)ReentrantLock重点。
 
 
8 了解 集合类吗  了解
9 谈谈hashmap 这个就不说 网上一大堆 主要问了hash冲突怎么解决 hashmap使用什么 hash函数尽量避免hash冲突 实现均匀散列
    //Java 8中的散列值优化函数   
    static final int More ...hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); //key.hashCode()为哈希算法,返回初始哈希值
    }

key.hashCode()32位,右位移16位,正好是32bit的一半,自己的高半区和底半区做异或,就是为了混合原始哈希码的高位和低位,以此来加大低位的随机性。并且可以尽量将所有的key均匀分布。

为什么对散列码取余(和len-1与)?

因为散列码范围广,数值很大,而内存有限,数组大小有限。所以需要把所有的散列码约束到有限的数组空间中。---这也是导致冲突的根源。

参考:知乎-hash函数

 

 
10 谈谈 jvm 这个不说网上一大推
11 gc收集算法   标记清除 复制 标记整理 然后说了一下 gc收集器 果然就问gc收集器了
12 谈谈 gc收集器  说了常见的7种收集器 然后面试官 一个劲的怼 G1收集器 还好我之前好好看了 哈哈哈
GC收集器 todo
 
13 了解 数据库的存储数据的数据结构吗  不是很懂 说不会
14 讲讲你熟悉的nosql数据库  讲了一下redis 感觉他不是很满意
15 操作系统如何读取文件 讲讲具体操作流程 这个就省略了
16 操作系统的内存管理 段页式 然后扩展一下对应的算法
17 虚拟内存的作用
18 在c/s 体系中 c往s请求数据 如何高效实现断点传输 类似迅雷下载可以暂停  答 多线程+请求数据的时候附件一个请求数据的偏移量offset
19 三次握手四次挥手 答。。。。。
20 topK问题  海量日志文件 找出前k个key  文件对16取模(为什么取16大家自己百度一下) 然后存入hashmap 然后利用小顶堆的性质
21 了解java的 classloader吗  答了解 Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib, Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。 Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。然后说了一下双亲委派原则。
22 你有什么想问我的吗 问 您觉得我今天表现怎么样 答 不好说。
6.14
二轮 (42min) 阿里事业搜索部  二面很短
1 面试官自我介绍
2 说说项目中用到了lucene (ps 个人博客用的)
3 对比一下为什么用lucene 而不是直接数据库查询
4 你的博客用lucene性能有提升吗?
5 了解solar吗
6 知道lucene的中文分词器吗 为什么用中文分词器
7 算法 有序重复数值 找出等于或者 超过一半的数字
 
二面面试官对阵lucene就是一阵狂怼我  招架不住 算法题做出来 但是lucene回答不好 估计走远
之前也看了牛客的很多面经 我也把自己的面经写出来希望能帮到大家。
 

怒斩阿里、百度、微软、华为offer

1、阿里云
阿里云是3月份内推的,面试有8轮,前三轮是阿里云我进的这个组面试,第四轮是阿里云大数据组的交叉面试,五六七轮加面的,分别是英文、技术、交叉面(蚂蚁金服)。最后一个就是HR姐姐了。
技术点:
java基础如 concurrent包jvm优化、内存管理、 gc分析、hadoop/spark/impala/lucene/RocksDB/redis这些框架的技术点
算法是大数据归并排序、遗传算法
项目是因人而已,我是报的数据库组,问了很多数据库的知识,B+树怎么索引,LSM的技术,分布式一致性算法,分布式事务这些
英文面比较奇葩,面试官打开了我的( https://github.com/jinhang) 聊了下项目内容,真心奇葩啊。
2、百度
百度也是内推,去的大数据部,两面技术,一面是hadoop的shuffle和mapreduce的技术,spark的blockmanager。
3、腾讯
腾讯比较奇葩了,也是内推,简历评级是S,被微信支付捞了,官网是投的SNG,微信面试逼格太高,特别是c++,最后一面被虐了。都不想提了。
4、微软苏研
也是内推,开始是笔试,几道在线编程题目,还是很难的,后面后安排面试,面了两轮,都是在线写代码,sqrt()是实现,归并排序实现,mapreduce排序,动态规划
5、华为
连着参加了16、17两届软件挑战赛,有名次,发了实习offer,但是比较坑啊,直接是云计算岗位,不是自己投的岗位。华为有性格测试,完了参加了产品推介会和双选会,最后据说后面有提前批。
6、滴滴
是睿思上联系的投的算法岗位,视频面试虐坑,最后不了了知了。
7、中兴
参加了中兴的算法大赛,叫什么迪杰斯特拉派,代码真心没毛病,最后58分,评价是论文里缺少算法证明,原来中兴是paper大赛。同时去了模拟招聘,两轮面试,一面写了个链表排序,linux系统。。二面就是瞎扯。
最后,去了飞天八部数据库技术组。话说真心和腾讯水逆,没做笔试,最后通知线路面试,去了一面就给挂了,最后腾讯qq浏览器的给了两个面试,应该是过了,水逆的公司就不去了。
 

 

转载于:https://www.cnblogs.com/buwenyuwu/p/7197427.html

你可能感兴趣的:(面试:面经笔记 2017.6)