终于到了笔试面试题部分了,经过了之前的部分其实已经可以开始投简历了,但是为了更稳妥,为了能进更好的公司,这部分必须搞定,如果这部分也搞定了还去不了,要么你要太高了,要么那个公司招的不是中级的,是5年以上高级的。
1spring的两大特性是什么
AOP和IOC,AOP面向切面编程,IOC控制反转,
IOC:IOC是一种模式,之前我们学过当要大量创建对象的时候要用工厂模式,有简单工厂,工厂方法和抽象工厂,但是当要创建的对象又多又杂的时候,这么多工厂也无能为力不好管理了,这是IOC登场了,在XML中定义好要创建的对象,就可以灵活的搞定了。也更便于维护。
IOC用到的基本技术是反射,反射会根据类名去创建对象,速度到今天仍然比直接创建要慢很多。
跟IOC一起谈到的就是DI依赖注入了,需要时直接把创建好的对象注入进去,DI和IOC是同一个问题不同角度的描述。
AOP:他的原理还是用到了反射,通过对某一种类的方法名做监控去处理,在前面看设计模式的时候就知道AOP用了代理模式,配置模式有好几种,一般就是XML中配置好。
刚开始用SPRING的时候觉得很难好神奇的东西现在看来就是一个很方便的工具。
2为什么要用ioc?不觉得在spring里面配置bean也很麻烦么?
上面说了啊,你不用IOC那么多对象用工厂模式更麻烦。
3什么是aop?spring是如何做到的呢?
上面也说了,靠代理模式做到的。
4如何控制并发?先通过乐观锁控制,然后使用悲观锁(mysql自带的行级锁),在并发较高的地方先更新版本号,让数据库先锁住这一条数据,防止其他线程进行读写操作等等,然后大致问了下最高并发有多少.
并发的核心是多线程,多线程就涉及到一个对资源的读写,这就是本质上的并发问题,如果保证多个线程对资源读写的准确性和高效性。
常用的有悲观锁乐观锁,悲观锁就是认为别人会修改数据,所以每次拿完数据直到放回去前别人不能修改,然而如果他一直站着这个资源,别的线程一直在等待他返回,这就变成了死锁,而乐观锁适用于读大于写频率的场景,默认比人不会改,写回去的时候看拿到的版本号和系统里的一不一样。
我们公司的并发了不大,几十也就差不多了,一共就几千个客户。
5了解多线程么?java多线程有几种实现方式?(3种)能说一下后两个接口的区别么?
这问题问的乱七八糟的,就是怎么创建线程嘛,以及有什么区别没有
没有返回结果的线程,用继承THREAD和实现RUNNABLE接口两种,后者常用于匿名线程的创建,
new Thread(new Runnable(){ public void run(){System.out.println("running");} }).start(); 这种格式。
两者启动时候会有区别,用THREAD的直接实例对象START,实现RUNNABLE的需要把实例对象传入THREAD实例中再startTHREAD实例。
还有就是有返回值的多线程,这个没用过,JDK5以后出现的,要实现CALLABLE接口,执行线程后可以获得一个FUTURE对象,FUTURE对象.get()即可。
由于CALLABLE接口在UTIL.CONCURRENT包里,需要用线程池ExecutorService e = Executors.newFixedThreadPool(10);,submitt执行。 Future f1 = pool.submit(c1);
6输出的结果是什么?
String ss="abcd";
ss.substring(2);
system.out.println(ss); 应该是abcd
很简单啊,没有赋值回去所以SS并没有变。至于原理
我们再来看看1.7中新的substring实现。前面一堆还是参数检查,直接看最后一句:
return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen);
因为里面是NEW了一个STRING对象啊兄弟。
7MySQL有几种事务隔离级别?着重讲一下每种事务隔离级别会产生的问题与后果。以及MySQL的默认隔离级别是什么?
没用过MYSQL
8聊一聊为什么要离职,对自我评价是什么
1城市2平台 自我评价就是有责任有担当有能力
9int x=2;
int y=3;
请在不引入其他变量的时候将两个值交换。
x = X + Y =5;
Y = X - Y = 2;
X = X - Y = 3;
10请手动证明多边形内角和定理°
在多边形内取一点,连接改点与各顶点,得到N个三角形
因为这n个三角形的内角的和等于n·180°,以O为公共顶点的n个角的和是360°
所以n边形的内角和是n·180°-2×180°=(n-2)·180°.
即n边形的内角和等于(n-2)×180°
11在java里面有一种线程安全的map是什么?(synchronizedHashMap)HashTable和HashMap的区别以及HashTable性能差的原因?锁分段技术?
注意这里问的是MAP有什么,MAP是一个接口,答案有三种:Hashtable、synchronizedMap、concurrenthashmap。
HASHMAP和HASHTABLE的区别我们之前说过,一个线程安全一个不安全,一个K V可为NULL一个不可。
Collections.synchronizedMap返回一个synchronizedMap实例,顾名思义用synchronized实现了同步。
ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。ConcurrentHashMap默认将hash表分为16个桶,诸如get,put,remove等常用操作只锁当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。 上面说到的16个线程指的是写线程,而读操作大部分时候都不需要用到锁。只有在size等操作时才需要锁住整个hash表。 在迭代方面,ConcurrentHashMap使用了一种不同的迭代方式。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数据 ,iterator完成后再将头指针替换为新的数据 ,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变。
HASHTABLE性能差就是因为做了同步,至于区别除了一个是MAP接口 HASHTABLE是DICTIONARY抽象类,自增HASHTABLE是初始11 X2+1,HASHMAP是16X2.
锁分段技术指的是concurrenthashmap用到的,HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
所以上面说了concurrenthashmap把每个桶加锁。
12京东的研发人员共分为4个等级:初级,中级,高级,专家。你感觉你属于那一级别?
中级,但是我的成长是很快的,给我一个平台和机会,我会很快上升到高级。因为之前的公司都被琐事业务所打扰没有时间去提升自己的技术。和思考更深层次的东西。
13你认为的京东商城网站结构,可分几部分等
如果按照分布式说,各种功能后台都有对应的工程,REDIS的运用也是无处不在的,还有大数据,按照移动端手机端还要分,热卖啊,各种活动的肯定也有自己的,以及核心的B2B平台,供商家使用的,后台管理,客服,金融等等太多了。
14数据库调优、tomcat调优
数据库调优这个正好之前一个公司来我们公司宣讲过他们的解决方法,首先要找到当前问题的瓶颈在哪里,再根据用户关注的扩展性,性价比等等不同的方面针对性的调优。比如如果IO主要可以换硬件等,为了数据稳定可以用专门的软件互备等。
具体的还有表和SQL的优化。
TOMCAT调优除了基本的JVM优化和JDK版本以及64位环境,剩下的就是自身参数的配置比如线程池等等了。
15项目为什么要用jquery
肯定是JQUERY好用啊,我们都知道JQUERY对JS做了很好的封装而且以及是目前的主流了,原生JS的使用很少了。
16struts2拦截器与spring 的AOP有什么区别
这个问题可以细说,首先我们之前学过责任链模式,也学过了堆栈,ACTION的处理就是这样ACTION在栈的底部上面是各种拦截器,所以就形成了一个递归调用
action是有ACTIONINVOCATION调用的,在调用前会先遍历拦截器去执行,一个有序链表,通过递归调用,变成了一个堆栈执行过程,将一段有序执行的代码变成了2段执行顺序完全相反的代码过程,从而巧妙地实现了AOP。这也就成为了Struts2的Action层的AOP基础。
而SPRING的AOP是用动态代理和CGLIB实现的,如果一个类实现了动态代理的那个INVOCATIONHANDLER接口就没事,如果没有实现要动态代理的时候就要用CGLIB了。
17ActiveMQ的原理是什么
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者。
jms 的一个标准或者说是一个协议. 通常用于企业级应用的消息传递. 主要有topic 消息(1 对多), queue 消息(1对1)。activemq 是一个jms 的实现, apache 出的.
另外还其它的实现 jboss 。
MQ简介:
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBMWEBSPHERE MQ。
MQ特点:
MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
使用场景:
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
JMS简介:
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
定义:
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
简介:
JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java DatabaseConnectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。
JMS和MQ的关系:
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。
支持JMS的开源MQ:
目前选择的最多的是ActiveMQ。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP
2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持通过JDBC和journal提供高速的消息持久化
7. 从设计上保证了高性能的集群,客户端-服务器,点对点
8. 支持Ajax
9. 支持与Axis的整合
10. 可以很容易得调用内嵌JMS provider,进行测试
11. ActiveMQ速度非常快;一般要比jbossMQ快10倍。
优点:是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。
缺点:ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,二、文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解http://struts2.group.iteye.com/group/wiki/1397-deep-into-struts2-interceptors
MOM :MESSAGE ORIENTED MIDDLEWARE
18约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
http://www.cnblogs.com/timeng/p/3335162.html
19HashMap的优化
http://www.tuicool.com/articles/NN7ZzqJ 初始大一些和负载因子。
20索引和SQL优化
http://www.cnblogs.com/dahuotao/archive/2010/03/10/1682272.html
21concurrentmap容器的使用
http://blog.csdn.net/fg2006/article/details/6404226
22解释一下单例,单例的同步问题
public static Singleton getInstance(){ //对获取实例的方法进行同步 6 if (instance == null){ 7 synchronized(Singleton.class){ 8 if (instance == null) 9 instance = new Singleton(); 10 } 11 }双重同步锁
23list的底层实现
Fail-Fast机制:
我们知道java.util.HashMap不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。
这一策略在源码中的实现是通过modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount。
- HashIterator() {
- expectedModCount = modCount;
- if (size > 0) { // advance to first entry
- Entry[] t = table;
- while (index < t.length && (next = t[index++]) == null)
- ;
- }
- }
在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map:
注意到modCount声明为volatile,保证线程之间修改的可见性。
24oracle的分页
oracle的特殊性质决定ROWNUM不能直接拿来用分页,需要先查出来,再用
即SELECT FROM 带ROWNUM RN别名的子查询where RN取值范围
25REDIS数据库集群
快照和AOF 主从
26JS的跨域传输,AJAX的跨域传输
由来:JS由于安全设计不允许调用跨域的对象
下面两个文章写的很好,,WINDOW.NAME也很好用
http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html
http://www.tuicool.com/articles/BFFrMj
至于AJAX可以用JSONP
由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。
http://kb.cnblogs.com/page/139725/ 一定要看 JSON JSONP的前世今生 JSONP获取远程数据的方式看起来非常像AJAX,但其实并不一样。
只不过JQUERY把JSONP封装到JQUERY的AJAX中去了。
1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
2、但ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。
3、所以说,其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
4、还有就是,jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。
总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变这一点!
27TCP,网络七层协议
http://baike.baidu.com/link?url=yrldloKt8pLDD97lA-MtaersOVGuPwGiyYxJ3w1ihakdgLyMNCcWZkqEhbEIgwGi8SBUuOE4exQZwJYYgdMryEweGknCyKWhEL-Vuc8WVL3 详解
Transmission Control Protocol 传输控制协议
实行标准
28hashmap、ConcurrentHashmap底层实现原理
在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。
http://zhangshixi.iteye.com/blog/672697ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁,可以简单理解成把一个大的HashTable分解成多个,形成了锁分离。如图:
而Hashtable的实现方式是---锁整个hash表
29二面面试官是京东后台库存预测的架构师,问的在数据库中用什么数据储存以毫秒为单位的时间,读写锁,还有最近读的什么java方面的书有什么感想
oracle用timestamp,http://www.cnblogs.com/java-class/p/4742740.html
感觉就是很多内容只有书里更系统,网上都是互相抄的很多错误。开始也看不懂,左一个名词又一个技术的,后来慢慢的知道的多了看起来压力不大了,也慢慢的能看出作者的水平了。
30一个是数据库索引的原理,一个是TCP为什么比UDP稳定
http://blog.csdn.net/kennyrose/article/details/7532032 索引,就是一个查找问题,用了B树
http://www.cnblogs.com/c-gis/archive/2012/07/27/2612175.html
http://www.360doc.com/content/14/0325/09/1317564_363500997.shtml TCP多了三次握手四次挥手
http://blog.csdn.net/whuslei/article/details/6667471/