res[k-i-1] = priorityQueue.poll();
}
return res;
}
14.求二叉树,求从根节点到叶节点,全部和最长的路径。
《剑指offer》上有
15.多线程怎么实现几种方式?callable的特点和runnable的区别
三种:extends Thread
implements Runnable
implements Callable
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run()。
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值。
(3)call方法可以抛出异常,run方法不可以。
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。
16.实现Runnable接口和继承Thread类的区别哪个更好为什么?
实现接口更好,
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
17.继承的缺点?
(1)子类和父类的紧耦合;
(2)打破了封装,基类向子类暴露了实现细节;
(3)支持扩展,但是往往以增加系统结构的复杂度为代价;
我们可以在一个新类的定义中使用其他对象。这就是
组合
合 关 系 |
继 承 关 系 |
优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立 |
缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性 |
优点:具有较好的可扩展性 |
缺点:支持扩展,但是往往以增加系统结构的复杂度为代价 |
优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 |
缺点:不支持动态继承。在运行时,子类无法选择不同的父类 |
优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 |
缺点:子类不能改变父类的接口 |
缺点:整体类不能自动获得和局部类同样的接口 |
优点:子类能自动继承父类的接口 |
缺点:创建整体类的对象时,需要创建所有局部类的对象 |
优点:创建子类的对象时,无须创建父类的对象 |
18.在多线程中,i++怎么保证代码不被污染?
使用volatile?我也不知道
19.Synchronized jvm中怎么实现的(
http://blog.csdn.net/kobejayandy/article/details/39975339)
在 HotSpot JVM实现中,锁有个专门的名字:对象监视器。
synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。
1. 线程状态及状态转换
当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程:
Contention List:所有请求锁的线程将被首先放置到该竞争队列
Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List
Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set
OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck
Owner:获得锁的线程称为Owner
!Owner:释放锁的线程
下图反映了个状态转换关系:
20.Lock 用的是什么类 怎么实现的jvm
ReentrantLock可重入锁
21.Volatile 怎么实现
有volatile变量修饰的共享变量进行写操作的时候会多一行包含lock的汇编代码,
lock前缀的指令在多核处理器下会引发了两件事情。
- Lock前缀指令会引起处理器缓存回写到内存。缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据。
- 一个处理器的缓存回写到内存会导致其他处理器的缓存无效。
22.原子类听说过没
java.util.concurrent.atomic的原子类,解决了i++线程不安全的问题,AtomicInteger依赖于volatile和CAS;
JDK
提供了基于反射的类
AtomicIntegerFieldUpdater
、
AtomicLongFieldUpdater
、
AtomicReferenceFieldUpdater
来修改对应的数据。但是使用以上几个类必须满足以下条件:
(1)字段必须是volatile类型的!
(2)字段的描述类型(修饰符public/protected/default /private)是与调用者与操作对象字段的关系一致。也就是说调用者能够直接操作对象字段,那么就可以反射进行原子操作。但是对于父类的字段,子类是 不能直接操作的,尽管子类可以访问父类的字段。
(3)只能是实例变量,不能是类变量,也就是说不能加static关键字。
(4)只能是可修改变量,不能使final变量,因为final的语义就是不可修改。实际上final的语义和volatile是有冲突的,这两个关键字不能同时存在。
23.原子性和可见性的区别
原子性就是指一段代码象原子一样不可再分,一次只能有一个线程执行这段代码,即代码的执行是互斥的。
可见性指一个变量在一个线程中的修改能够被其它所有使用该变量的线程看到。
原子性保证代码之间的互斥,而可见性保证变量的修改能够被其它线程看到。
24. synchronized 是如何去保证可见性的呢?
synchronized 只会保证该同步块中的变量的可见性,synchronized会保证对进入同一个监视器的线程保证可见性。
1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
25.Tcp建立连接的过程?都经历了什么状态
三次握手,SYN_SEND,SYN_RECV,ESTABLISHED;
26.Tcp怎么断开的 都有哪些状态
四次挥手,客户端:FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT,CLOSED;
服务器端:CLOSED_WAIT,LAST_ACK,CLOSED;
27.RST什么情况下会发? 没有收到确认ack? 超时?
在TCP协议中RST表示复位,用来异常的关闭连接;
服务器程序端口未打开而客户端来连接;
请求超时;提前关闭;在一个已关闭的socket上收到数据;
28. 算法代码题:n个数都在1到n-1之间,其中有一个重复,设计找到那个重复的数字。要求:时间复杂度空间复杂度都为O(1)?
29.开发模式lamp,lnmp,nginx和apache的区别,分别适用于哪些开发场景。
LAMP==Linux+Apache+Mysql+PHP
LNMP==Linux+Nginx+Mysql+PHP
Apache由于其跨平台和安全性被广泛使用,相比于nginx,apache有些臃肿,内存和CPU开销较大,性能上有损耗,nginx对于静态文件的响应能力远高apache。
相比于Apache,nginx使用资源更少,支持更多并发连接,效率更高,作为负载均衡服务器。nginx即可对内进行支持,也可对外进行服务。其还是一款非常优秀的邮件代理服务器,安装简单,配置简介。
LNAMP是Linux+Nginx+Apache+Mysql+PHP的组合方式,其特点是利用Nginx来作为静态脚本的解析,而利用 Nginx的转发特性,将动态脚本的解析转交给Apache来处理,这样,能充分利用两种Web服务器的特点,对于访问量需求较大的站点来说,是一个很不错的选择。
30.mysql引擎,区别,数据库索引,索引实现原理,为什么快,索引和主键的区别。mysql的锁机制。
MyISAM,InnoDB;
区别:(1)MyISAM是表级锁,InnoDB支持表级和行级锁;
(2)MyISAM不支持事务,InnoDB支持;
(3)
聚族索引和非聚族索引,主键索引;
原理:
索引是对
数据库表中一列或多列的值进行排序的一种结构。底层通常使用B树或者B+树实现。
因为对于排序后的数据进行查找可以采用二分查找等算法进行快速查找;
区别:主键是表中的一个或多个字段,是行数据的唯一标识,具有唯一性和非空属性;索引是对数据库表中一列或多列的值进行排序的一种结构,索引占用磁盘空间,并且降低添加、删除和更新行的速度。
数据表中只允许有一个主键,但是可以有多个索引。
MySQL的锁机制:MyISAM
支持表级锁,InnoDB支持表级锁和
行级锁,对表数据支持共享读锁和排他写锁
;
InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。在InnoDB中,锁是逐步获得的,就造成了死锁的可能。
31.mvc思想,yii不同于其他框架的东西,它的orm你觉得是怎么实现的。
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面;
模型(Model):就是业务流程/状态的处理以及业务规则的制定;
控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。
YII是PHP的东西,因为不是做这个的,所以不考虑。
32.二分查找,堆排序,写出复杂度,怎么得到的;
33.两个字符数组a和b,求b-a。
以上两题请自行百度。
二分查找时间复杂度是O(lgn),堆排序的时间复杂度是O(nlgn)。
34.git怎么用,git的基本命令,git和svn区别;
只说区别:
(1)GIT是分布式的,SVN不是;
(2)GIT把内容按元数据方式存储,而SVN是按文件;
(4)GIT没有一个全局的版本号,而SVN有;
(5)GIT的内容完整性要优于SVN;
(6)Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
(7)SVN必须先Update才能Commit,忘记了合并时就会出现一些错误,git还是比较少的出现这种情况;
(8)SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成。而 Git可以有无限个版本库;
35.事务和锁,锁可能遇到的问题,悲观锁,乐观锁,说个应用场景;
事务是指访问并可能更新数据库中各种数据项的一个程序执行单元;
锁是为了确保在并发的情况下保证数据的一致性;
死锁;
悲观锁是是对数据被外界修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态;需要数据库提供的锁机制;
乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的方式就是记录数据版本。
36.json本质是什么,xml和json的区别。
JSON其本质是一串有意义的字符串数据交互格式。xml本质是一种DOM结构。对比一下,那
json的
本质就是字符串。
37.涉及Java中的容器、并发、线程池、synchronized、wait\notify、有哪些Lock、get与post;request header中有什么?
前面部分不再赘述。
38.SpringMVC的机制?SpringMVC具体是在哪里做分发的?
参见京东的那篇面经总结。
应该是之前就把配置或注解,生成了一个Map,之后根据path能对应到相应的方法上。 在filter结束后,大概就到了SpringMVC的分发器了。
39.如何判断两个二叉树相等?如果只能跨1、3、5级阶梯,从平地跨到第n级有几种走法(限定内存)
第一个用递归实现,第二个是斐波那契的扩展,f(n)=f(n-1)+f(n-3)+f(n-5);f(1)=1;f(2)=1;f(3)=2;
40.字符串转数字,然后写测试用例。
见《剑指offer》
41.然后问的jvm内存模型、垃圾回收算法。
参见京东的那篇面经总结。
42.mysql中varchar、char等区别。
varchar是可变长字符串;
char是定长字符串;
43.一个双向链表,每两两结点交换,一遍原地交换即可,就是用3个指针,避免断链就行。
44.比如数据库调优、tomcat调优很多底层的东西,
选择合适的数据类型,尽量少使用可变成数据类型;尽可能使用NOT NULL;
适当的使用索引,比如给经常select的列上使用索引;
选择合适的数据库引擎,并设置合适的参数;
使用缓存,缓存查询结果;
避免使用select *,where like "%hhh%",避免使用计算函数;
优化sql,读写分离,分表,分区,分布式。
tomcat调优暂不考虑。
45.java实现栈结构,数组动态分配,map倒序等。
46.手写算法, 考官想到一个 比如观察者模式,设计模型, 让我大概描述,或者手写一下。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
抽象主题角色
:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色
:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体主题角色
:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色
:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
首先定义抽象的观察者:
//抽象观察者角色
public
interface Watcher{
public
void update(String str);}
然后定义抽象的主题角色,即抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):
//抽象主题角色,watched:被观察
public
interface Watched{
public
void addWatcher(Watcher watcher);
public
void removeWatcher(Watcher watcher);
public
void notifyWatchers(String str);}
47. 如何保证多线程动态增加。
48.linux的常用命令,比如查看ls的参数,查看内存使用情况,cpu使用的情况,
top:能够实时显示系统中各个进程的资源占用状况;
pmap:可以根据进程查看进程相关信息占用的内存情况;
49.还有spring的ioc和aop原理,简单算法的比如非波那契数,快速排序,最小生成树等等
ioc是控制反转的意思,IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),他使用来降低程序的耦合性;
依赖注入的三种方式:(1)接口注入(2)构造器注入(3)Setter注入
控制反转(IoC)与依赖注入(DI)是同一个概念,引入IOC的目的:(1)脱开、降低类之间的耦合;(2)倡导面向接口编程、实施依赖倒换原则; (3)提高系统可插入、可测试、可修改等特性。
AOP面向切面编程,就是把一些贯穿在各个模块之间相同的功能抽象出来,然后封装成一个面。
AOP一般都是通过代理来实现,利用代理就有目标对象是什么,拦截哪些点(方法),拦截后要做什么。
JoinPoint(连接点):被拦截到的点.
Advice(通知):拦截JoinPoint之前与之后要做的事。
PointCut(切入点):对joinPoint进行拦截的定义。
Target(目标对象):代理的目标对象。
对于异常处理,日志功能,权限的检查,事务等都是贯穿到各个模块之中,因此进行AOP.
面向切面编程提供声明式事务管理。
最小生成树:一个有 n 个结点的
连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。
http://www.open-open.com/lib/view/open1423884996311.html
50.问设计模式,说知道什么模式,在哪里运用。我就说了mvc、工厂、单例、蝇量。
单例模式参见京东的那篇面经总结。
51.请描述一下插入排序算法。
最外层为for循环,指向未排序的第一个元素,内层为while循环,将未排序的元素插入到已排序的正确位置。
52、跳表
53、spring怎么拦截所有请求 (允许与servlet共存么)
54、数据库表的底层数据结构,为什么增加索引能加快查询速度
55、cookie与session的区别
56、JVM内存优化,为啥xmx和xms设置成一样?避免gc后重新分配堆内存。堆排序,观察者模式。
Xmx和Xms设置成一样
可以加快内存回收速度,
57、dubbo的四个决策者,如果其中的zookeeper或者管理中心挂掉其中一个能否继续工作?为什么?
58.纸上写代码,判断一个树是不是完全二叉树
59.数据库连接池实现
60.equal \ ==\ hashCode方法有何不同,后来主动要求写了两个题:快速排序+设计一个Java的数据库连接池(设计的不好,很多功能没有实现);
61.mysql索引优化,存储引擎类别和底层实现;
62.Mysql的左右连接,分页。
63.怎样用cookie session实现一段时间免登录,
64.然后就是10000个文字的文件让按字数出现顺序排序
65.还问了Memcache/Hibernate的二级缓存,Hashtable的存储形式,讲最近的项目
66.soket超时有哪几种?有什么区别
67.telnet和ping的区别
68.第一个问题是如何不使用中间变量如何交换两个变量
69.在浏览器输入一个url后的事情
1、浏览器通过访问域名查找最近的IP地址,一个例子是如果你想用谷歌浏览器,可以下载 一个最新的host版本,当你通过谷歌访问的时候浏览器会首先查找本地的IP地址,达到可以使用谷歌的目的;
2、浏览器给web服务器发送一个http请 求;
3、服务器给浏览器相应一个永久重定向,比如说我们在地址栏输入baidu,虽然没写完整,但是浏览器会通过永久重定向去加上 http://www.baidu.com,仍然会让用户访问的到,服务器重定向会防止搜索引擎干预,搜索引擎收到301永久重定向就会把http: //baidu.com和http://www.baidu.com看成一个网站;
4、服务器处理请求,如果请求出错就会出现常见的404状态码的情 况;
5、服务器返回http响应;
6、浏览器开始显示HTML;
7、浏览器发送一个获取请求,找到嵌入在HTML中的对象,是图片还是文字,是样式表还是 行为等等;
8、服务器发送异步(AJAX)请求。