2016-08-29 上午 京东酒店机票部-3轮面试

今天上午去京东面试,经过了三轮面试最终还是被(HR)告知 回家等消息吧.

先说一下 各个 面试官都问了啥吧:

记性不好 我就不一一罗列了,就直接整理一下所有的问题吧.

1.先来个 排序算法 热热身

分析:

2.聊一下 并发库相关,

2.1 说一下 线程安全地队列

分析:ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue

2.2 说一下 线程安全的数据结构 自己知道的

分析:按照 不同的数据结构分类说

数据结构 线程安全的实现类
map ConcurrentHashMap
ConcurrentSkipListMap
set ConcurrentSkipListSet
CopyOnWriteArraySet
list CopyOnWriteArrayList
queue ConcurrentLinkedQueue
ArrayBlockingQueue
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
SynchronousQueue
deue ConcurrentLinkedDeque
LinkedBlockingDeque

2.3 说一下 AtomicInteger 的 实现(具体说一下 自增是怎么实现的线程安全的)

分析:

public final int getAndIncrement() {

return unsafe.getAndAddInt(this, valueOffset, 1);

}

2.4 还问了一下SynchronousQueue,这个我没回答好

分析:

3.map的实现

分析:

3.1hashmap的新节点是添加到什么地方(链头还是链尾)

分析:这个题巨坑啊,还要分版本1.8之前都是添加到链表的头部,1.8之后是添加到尾部

JDK7U79的版本table[bucketIndex] = new Entry<>(hash, key, value, e);

JDK8U60的版本p.next = newNode(hash, key, value, null);

4.2个FIFO队列实现栈的效果,简单来说就是abc逆序打印

分析:2个FIFO队列分别是F1,F2

先把abc依次放到F1,再把ab依次取出并放回到F1,那么F1的顺序现在是bac,

将c放到F2,再将a取出放回F1,那么F1现在的顺序是ab,

再将ab依次从F1中取出放到F2,这时从F2取出的顺序就是 c,b,a

5.sqlserver和mysql的区别

分析:

6.mysql中myisam和InnoDB在索引上的区别

分析:

MyISAM InnoDB
使用前缀压缩技术是的索引更小 按照原数据格式进行存储
通过数据的物理位置引用被索引的行 通过主键引用被索引的行
myisam记录的直接是文件的offset InnoDB寻址要映射到块,再到行
   
  自适应哈希索引,是系统对热点索引
自动创建的内部行为,
用户无法控制或者配置
   
   

6.1MySQL存储引擎MyISAM与InnoDB的优劣(自己引申出来的题)

  MyISAM InnoDB
存储结构 每张表被存放在三个文件:frm-表格定义
MYD(MYData)-数据文件
MYI(MYIndex)-索引文件
所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB
存储空间 MyISAM可被压缩,存储空间较小 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
可移植性、备份及恢复 由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作 免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
事务安全 不支持 每次查询具有原子性 支持 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表
AUTO_INCREMENT MyISAM表可以和其他字段一起建立联合索引 InnoDB中必须包含只有该字段的索引
SELECT MyISAM更优  
INSERT   InnoDB更优
UPDATE   InnoDB更优
DELETE   InnoDB更优 它不会重新建立表,而是一行一行的删除
COUNT without WHERE MyISAM更优。因为MyISAM保存了表的具体行数 InnoDB没有保存表的具体行数,需要逐行扫描统计,就很慢了
COUNT with WHERE 一样 一样,InnoDB也会锁表
只支持表锁 支持表锁、行锁 行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
外键 不支持 支持
FULLTEXT全文索引 支持 不支持 可以通过使用Sphinx从InnoDB中获得全文索引,会慢一点

7.treemap实现原理,如何实现的有序

分析:以二叉树实现treemap,内部组合compare来实现比较和排序,

8.mysql优化

分析:从几个方面来谈

数据库引擎 InnoDB支持事务
数据库字段选择  
索引优化  
查询性能优化  
分表分库  
mysql服务器优化  
操作系统和硬件优化  
主从设置  
   
   

9.一个十亿行记录的文本,如何从中查询是否含有某个字符串

分析:从网上搜到 有人说用

lucene

compass(我没见过这个东西)

用搜索引擎进行搜索 。如:elasticsearch, solar。

10.查询某个压缩包中压缩的文本文件中是否含有某个字符串

分析:

11.如何通过linux命令将一个文件传输到另外一台服务

分析:scp

12.问到了mq,不过我确实是没做过也没看过,所以就没往下问

13.判断链表有环

分析:

方案1:

遍历链表中每一个 节点,然后放到一个 hashmap(我面试当时说的是数组)中,然后key重复了就说明有环.

方案2:

参考下面代码,利用temp2 步子大,跑得快,可以 套temp1的圈,总会有碰到 的时候(这个时候不一定就是 交叉的那个环点).

public static boolean hasLoop(Node n) {

// 定义两个指针tmp1,tmp2

Node tmp1 = n;

Node tmp2 = n.next;

while (tmp2 != null) {

tmp1 = tmp1.next; // 每次迭代时,指针1走一步,指针2走两步

tmp2 = tmp2.next.next;

if (tmp2 == null)

return false;// 不存在环时,退出

int d1 = tmp1.val;

int d2 = tmp2.val;

if (d1 == d2)

return true;// 当两个指针重逢时,说明存在环,否则不存在。

}

return true; // 如果tmp2为null,说明元素只有一个,也可以说明是存在环

}

14.写一段sql,实现类似于if else的功能,比如判断是否含有某条记录,有则更新,无则追加.

分析:这个需要用到存储过程:

15.代码审查,代码走查等,工具

16.单元测试,Junit,mock

17.异常和错误的继承关系,并说几种运行时异常

分析:

18.dubbo服务提供者中的异常设置,消费者捕获后如何处理

分析:

18.1根据不同情况抛出不同的异常信息,包含自定义异常

18.2比如根据不同的自定义异常来判断是否需要回滚或者重试等

猜你喜欢

转载自my.oschina.net/u/658658/blog/825426