百度(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个基本性质:
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
参考: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接口实现类:
ArrayList、
LinkedList、Vector; Stack继承Vector类;
Set接口实现类:SortedSet(i)、
HashSet、EnumSet;
TreeSet实现SortedSet,LinkedHashSet继承HashSet;
Queue接口实现类:Deque(i)、PriorityQueue;ArrayDeque和LinkedList实现Deque
Map接口包括
HashMap、
TreeMap;
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.源端口16+目的端口16; 2.序列号32; 3.确认号32;4.头部4+保留位6+标志位6+窗口大小16位;5.校验和16+紧急指针16;
testOnReturn,testOnBorrow这两个参数为true,表示会在每次请求之前和之后进行连接池测试,如果连接失效,就会将这条连接对象销毁,创建一个新的连接对象。
testWhileIdle参数。这个参数为true时候,表示空闲时是进行验证,检查对象是否有效。然后minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每过timeBetweenEvictionRunsMillis秒对连接池进行一次检测,将对象闲置时间超过minEvictableIdleTimeMillis秒的对象进行销毁,创建新的对象来取代。这样就能保证时刻都有正常的连接池对象存在。
工作流程是:如果一个类加载器收到类加载的请求,不会自己加载,而是首先委托给父加载器完成,依次向上。当父加载器无法完成加载,子加载器才会尝试加载。
优点:使Java类随着类加载器具备了带有优先级的层次关系,对于保正Java程序稳定运作很重要。例如Object类在lib的rt.jar中,防止不可靠甚至恶意的代码代替由父类装载器装在的可靠代码。
3.注入:${}是字符串替换,会存在sql注入问题;比如select * from table where name = ${smith or 1 = 1},这样无论是否匹配,都能查到结果;
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。
3)SQL语句方面:1.优化SQL语句,减少比较次数;如避免select * from而使用具体的字段列表代替,避免在where中使用!=或<>操作符,否则将放弃索引而进行全表扫描; 2.限制返回条目limit;