京东面经
京东的面试大约是去年九月份,跟大部分的公司都差不多,一共有是三面,两个技术面,一个HR面。下面我主要分享下两个技术面的经历。
总的来说一面的问题比二面的要简单一点,主要是考察的都是那些比较基础的知识。由于时间比较长,具体的问题的细节有些记不清了,不过总体来说就是考察了下面的知识点。
(1)设计模式 装饰模式和适配器模式的区别?
答:首先从两个设计模式的所实现功能开始讲起,装饰模式是为能够动态的扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。适配器就更好理解了,适配器是对其他对象接口的一种转换行为,将原接口转换为目标接口,以达到适配的效果。再从设计模式的实现方式来讲,具体的内容可以从这里得到,讲的很详细,本文中我就不再赘述了。
(2)Redis的数据类型有哪些?
答:这里被问到 Redis 的内容是因为我在简历中写到到了,对于应届生来说,多学习一点新技术是可以提高自己在面试中的优势的,可以展现自己比较好学,有较强的学习能力,给面试官留下一个好影响。像 Redis 我觉得就是一个比较好的学习目标。首先 Redis 非常火,各大公司都有用到,然后网上能找到好多学习的资料,并且学习起来比较简单,稍微有点基础的同学话一两小时就可以上手,再学一点实现原理方面的知识,应付简单的面试就已经足够了。这里京东问的就比较简单,Redis的数据类型常用的5种:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),还有新加入的 Bitmaps 和 HyperLogLogs。
(3)HTTP请求的结构,消息报头传递了哪些信息?
答:HTTP是计算机网络里常考的知识,面试的时候被问到的概率很大,所以大家应该多了解一下。请求结构,消息报头,状态码都是会经常被问到的地方。HTTP请求由三部分组成,分别是:请求行、消息报头和请求正文。消息报头里传递很多信息,下面给出一个例子
POST /index.php HTTP/1.1 // 请求行
Host: localhost // 消息报头
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
username=aa&password=1234 // 请求正文
消息报头的内容很多,不用全部都答出来,给出5个就差不多了。
(4)JUC包知道吗?AtomicInteger 是怎么实现的?
答:JUC是JDK1.5之后的java.util.concurrent新加入的并发包,提供了很多简单易用的并发工具类,AtomicInteger类就是JUC包席提供的为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类。AtomicInteger的实现原理比较复杂,是通过AtomicInteger类内部的Unsafe类型的变量来实现的。Unsafe类是一个可以执行不安全、容易犯错的操作的一个特殊类。提供了CAS操作(CompareAndSwap,比较并交换,是一个原子操作,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。)。在AtomicInteger类内部对Unsafe类的CAS操作进行了封装,定义了一个compareAndSet方法
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
然后在每次对AtomicInteger类的实例执行修改操作时都会先执行compareAndSet方法,只有当compareAndSet执行成功时才会真正执行修改操作,否则就一直循环下去,AtomicInteger类中的代码如下:
public final int addAndGet(int delta) {
for (;;) {
int current = get();
int next = current + delta;
if (compareAndSet(current, next))
return next;
}
}
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
public final int getAndAdd(int delta) {
for (;;) {
int current = get();
int next = current + delta;
if (compareAndSet(current, next))
return current;
}
}
(5) 最后一个是JVM相关的问题,JVM的垃圾收集器知道哪些,各自的特点是什么?
答:新生代有:Serial收集器,ParNew收集器,Parallel Scavenge收集器,老年代有Serial Old收集器,Parallel Old收集器,还有最经典也是最常用的CMS收集器。当然还有最新的G1收集器。
各自的特点的话就是从回收算法和GC时是否使用多线程来回答了。由于内容比较多,本文就不详细展开了,推荐大家到周志明大神写的《深入理解Java虚拟机》中寻找答案,非常棒的一本书,关于JVM的原理讲的非常清楚,Java程序员找工作必备。
以上就是京东一面中涉及到的主要问题,讲的比较简单,大家要是没看明白的地方可以关注我们的微信号(关注公众号coderTO),在公众号里输入问题进行提问,我们会在24小时内回复您的消息,二面的面经会在下周三之前上线,谢谢大家的关注!
网友评论