面试时间:2013-9
面试地点:合工大
面试内容:
1. struts2怎么实现的,原理是什么
2. session是怎么实现的?存储在哪里?
3. Java怎么创建链表的?
定义一个结点类,再定义一个list,实现插入结点、删除结点、查询结点。具体实现如下:
///////////////节点////////////////////// class node { public double x; public node next; public node pre; node (double x,node n) { this.x =x; this.pre =null; this.next =n; } node (double x) { this.x =x; } public node getnext() { return next; } public void setnext(node next) { this.next =next; } public node getpre() { return pre; } public void setpre(node pre) { this.pre =pre; } /*public node(double x,node next) { this.x=x; this.next =next; }*/ } ///////////////链表实现/////////////////////// class list { public node head,tail; public int length; list() { head= tail =null; } public boolean isEmpty()//判断是否为空 { return head==null; } public void addhead(double x)// 加入head节点 一般调用一次 { head=new node (x,null); //pt.setnext(head.getnext()); //head.setnext(pt); if(tail==null) tail=head; } public void addtail(double x)// 往后 添加节点 { if(!isEmpty()) { tail.next =new node(x); tail=tail.next ; }else { head=tail =new node(x); } } public void print() { for(node temp=head;temp!=null;temp=temp.next ) { System.out.print(temp.x +" "); } System.out.println(""); } public void addnow(double x,double y)//在特定的位置 插入一个节点 { for(node temp=head;temp!=null;temp=temp.next ) { if(temp.x ==x ) { node now= temp.next ; node ne=new node(y); temp.next =ne; ne.next =now; } } } } ////////////////////////////////////////// public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub list k=new list(); k.addtail(1); k.addtail(2);k.addtail(4);k.addtail(5); k.addnow(2, 3);//在2之后,插入为3的节点 k.print(); } }
JDK提供了一个实现好的链表类LinkedList。
4. 用过哪些List?ArrayList,Vectory,LiskedList,Map,Set等,HashMap怎么实现的? 先是数组, 然后是链表存储,既然是存储在数组的链表中,那么怎么知道存数组的哪个地方呢?那get方法是怎么取值的呢?一步一步遍利数组么?
5. ArrayList和LinkedList的区别
6. int类型的数据时32位的,怎么知道一个32位的二进制数据有多少个1?
7. 互斥、信号量、进程、线程
“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的 线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这 个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”
也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务 并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进 行操作。在有些情况下两者可以互换。
8. 归并不排序的复杂度
9. oracle索引有哪些?
物理分类可以分为B-Tree索引和bitmap索引。
B-Tree索引:B-tree (balance tree)即平衡树,左右两个分支相对平衡。Root为根节点,branch 为分支节点,leaf 到最下面一层称为叶子节点。每个节点表示一层,当查找某一数据时先读根节点,再读支节点,最后找到叶子节点。叶子节点会存放index entry (索引入口),每个索引入口对应一条记录。
bitmap索引:位图索引主要针对大量相同值的列而创建。索引方法:1、首先对列的不同列值建立位图索引;2、根据sql查询语句,得到多个列值对应的位图索引,对这几个位图索引进行与或运算;3、根据运算结果获取结果集rowid。
详见:http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html
10. hash函数相关的
11. 一个数组存储很多英文字母,问:怎么知道26个字母中哪些没有存储?
----------------------------------------
12.“IOC是什么,内部怎么实现,写一下伪代码”、”Aop呢?”。
IOC:控制反转,即DI,依赖注入。也就是说由Spring来管理对象的生命周期以及对象之间的关系。比如对象A中有一个成员变量对象B,当A需要用到B的时候,不用自己去new一个B对象,而是向Spring去申请一个B对象,Spring得到请求后,就会动态创建一个B对象给A,给予的过程就像是打针一样注入,同时A对象的执行依赖于B对象,所以就叫做依赖注入,为什么叫做控制反转呢?因为获得对象的方式反转了(从自己主动new反转为由spring提供)。
IOC内部实现:IOC的实现是基于反射的。
伪代码:
1、写一个Animal接口: 2、实现该Animal接口 3、在applicationContext.xml配置文件中配置关于Animal类的信息 4、自定义一个Bean类,这 个Bean用来存放一个Bean拥有的属性,一个Bean包括id,type,和Properties。 5、接下来spring就开始读取配置文件,将这些Bean存入一个map中,map的key为bean的id,value为这个Bean。 6、ApplicationContext context = new FileSystemXmlApplicationContext("applicaitonContext.xml");//加载配置文件 Anmial animal = context.getBean("animal");//从map中找到该Bean对象,运用反射机制 手动生成animal对象。 7、运用反射机制,从该Bean对象中获取属性和方法信息,并初始化。 8、返回该animal对象给需要它的依赖对象。
AOP:面向切面编程。AOP将系统分成两部分,一部分是核心业务逻辑,另外一部分是横向通用业务逻辑。例如,所有大型系统都要涉及到的持久化管理、事务管理、安全管理、日志管理和调试管理等。
AOP的实现方案——拦截。由“金三角”——拦截器(实现拦截逻辑的对象)、目标对象(即proxy代理的对象)和代理对象(进行拦截的对象)协作完成拦截。
Spring是通过动态代理来实现AOP的,主要分两种方式,一种是JDK动态代理,另一种是CGLib。前者是由JDK自带的动态代码生成技术(反射)实现,可以对实现了接口的类进行处理;后者是对没有实现了接口的类进行处理。
JDK动态代理伪代码:
package alibaba.aop.jdk_proxy; public interface IHelloWorld { public void print(String name); public void write(String sth); } package alibaba.aop.jdk_proxy; public class HelloWorld implements IHelloWorld{ @Override public void print(String name) { System.out.println("HelloWorld "+name); } @Override public void write(String sth) { System.out.println("write "+ sth); } } package alibaba.aop.jdk_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DefaultInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String s1[] = { "kris" }; String s2[] = { "anyone" }; IHelloWorld ihw = new HelloWorld(); System.out.println("start!"); method.invoke(ihw, args); method.invoke(ihw, s1); Object o = method.invoke(ihw, s2); System.out.println("stop!"); return o; } } package alibaba.aop.jdk_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Class clazz = new HelloWorld().getClass(); ClassLoader c1 = clazz.getClassLoader(); Class classes[] = clazz.getInterfaces(); InvocationHandler ih = new DefaultInvocationHandler(); //用InvocationHandler给HelloWorld进行AOP包装 IHelloWorld ihw = (IHelloWorld) Proxy.newProxyInstance(c1, classes, ih); ihw.print("print_test"); ihw.write("write_test"); } }
13.“网络上得到的字节码怎么加载到内存”。.
14.'’代理模式知道吗,用jdk自带的类写个代理模式“。
代理模式就是多一个代理类出来,替原对象进行一些操作。
package alibaba.proxymode; public interface Sourceable { public void method(); } package alibaba.proxymode; public class Source implements Sourceable{ @Override public void method() { System.out.println("the orignal method"); } } package alibaba.proxymode; public class Proxy implements Sourceable { Source source; public Proxy() { this.source = new Source(); } @Override public void method() { before(); source.method(); after(); } private void after() { System.out.println("before proxy"); } private void before() { System.out.println("after proxy"); } } package alibaba.proxymode; public class ProxyTest { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.method(); } }
15”.一笔画访问所有的点,写个算法“、
16.”银行排队算法是什么“。
即面包店排队算法:
顾客进入面包店前,首先抓取一个号码,然后按号码从小到大的顺序依次进入面包店购买面包。
这里假定:(1)面包店按从小到大的顺序发放号码,且两个或者两个以上顾客可能获取相同的号码;
(2)若多个客户抓取到相同的号码,则按客户姓名的字典顺序先后进入面包店购买面包。
计算机系统中,顾客相当于进程,每个进程有一个唯一的标识,用Pi表示,对于Pi和Pj,若有i<j,即Pi先进入临界区,则先为Pi服务。
面包店算法的基本思想:首先设置一个发号器,按由小到大的次序发放号码。进程进入临界区前先抓取一个号码,然后按号码从小到大的次序依次进入临界区。若多个进程抓到相同的号码则按进程编号依次进入。
实现面包店算法所需的数据结构: int choosing[n]; //表示进程是否正在抓号,初值为0。若进程i正在抓号,则choosing[i]=1. int number[n]; //记录进程抓到的号码,初值为0。若number[i]=0,则进程i没有抓号 伪代码如下: // declaration & initial values of global variables Choosing, Number: array [1..N] of integer = {0}; // logic used by each process... // where "(a, b)<(c, d)" // means "(a<c) or ((a == c) and (b<d))" Process(i) { //注意:此处测试的是进程Pi while (true) { Choosing[i] = 1; Number[i] = 1 + max(Number[1],...,Number[N]); Choosing [i] = 0; for (j=1; j<=N; ++j) { while (Choosing[j] != 0) {//保证编号较小的进程先进入临界区 // wait until process j receives its number } while ((Number[j]!=0) && ((Number[j],j) <(Number[i],i))) { //进程Pj是其他线程 // wait until processes with smaller numbers // or with the same number, but with higher // priority, finish their work } } // critical section... Number[i] = 0; // non-critical section... } }
17.“写 个高效的sql语句,数据库随便选”。
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1009qinw/
18.“现在呀,很多人都发重复的帖子,怎么检测出来重复贴,然后把他们删除,写一个算法让它在一个线程中跑,每隔5秒扫 描一次…..”、
数据库中删除重复数据分为部分数据重复的情况和全部数据重复的情况。分析题意,重复的帖子应该只是标题和内容相同就视为相同的帖子,而id不会相同,所以只需要删除标题相同的帖子即可。
package alibaba.exercises; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * 删除重复帖子 * * @author Administrator * */ public class DeleterRepeatingInvitation { /** * @param args */ public static void main(String[] args) { // 不同数据库url格式不同,由数据库厂商自己定义 String url = "jdbc:oracle:thin:@192.168.0.26:1521:tarena"; String driver = "oracle.jdbc.driver.OracleDriver"; String username = "sd1010"; String password = "sd1010"; // 向DriverManager注册驱动 // 会执行驱动类的静态块 // 创建驱动实例并调用DriverManager的注册方法 Connection conn = null; try { Class.forName(driver); // 建立连接 // 尝试使用内部维护的所有驱动对象进行连接 // 直到连上为止,如果都无法连接,抛出异常 conn = DriverManager.getConnection(url, username, password); final String sql = "delete from invitation where id not in (select max(id) id from invitation order by title))"; final Statement smt = conn.prepareStatement(sql); Thread thread = new Thread() { @Override public void run() { super.run(); while (true) { try { smt.execute(sql); sleep(5000); } catch (Exception e) { e.printStackTrace(); } } } }; } catch (Exception e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
19.'’ajax是什么,实现机制'
1、什么事Ajax?
ajax:即Asynchronous javascript and xml,属于客户端技术,可以使javascript访问服务器的JSP、Servlet。
解决问题:提升了用户体验,
如何提升呢?a、页面局部刷新;b、异步发送请求-处理;c、一个页面功能比较复杂,需要多次与服务器资源交互。
ajax应用包含的技术如下:a、XMLHttpRequest对象;b、JavaScript语言;c、XML/DOM/JSON;d、HTML/XHTML/CSS
2、Ajax如何使用?
以JavaScript为基础,用于创建XMLHttpRequest对象,编写响应处理函数,以XMLHttpRequest为核心,使用XML/JSON等格式进行数据传递
ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是页面的部分从服务器获得请求数据。实现方式就利用页面部分刷新数据来给用户更好的体验。其中 XMLHttpRequest 是ajax的核心机制。
20。’'servlet线程安全吗,周期呢“
不安全,是单例多线程的。周期:类加载-》实例化-》服务-》销毁。
21.“CSS3知道吧,谈谈认识,说说盒子模型吧”
是对CSS的一种完善,用模块化的思想对html页面进行渲染。在HTML文档中,每个元素(element)都有盒子模型。盒子模型有四个属性,即内容(content)、填充(padding)、边框(border)、边界(margin)。
22.”了解 Struts2 Spring hibernate 源码吗“
23.”说说红黑树的特点和性能“
红黑树是一种二叉排序树,在二叉排序树上执行插入、查找和删除的时间复杂度为O(log2n);但若是一颗由n个结点组成的线性链,则这些操作的时间复杂为O(n),而红黑树在这种情况下的时间复杂度仍为O(log2n)。
红黑树的特点:
(1)一个结点要么是红色,要么是黑色;
(2)根结点和叶结点都是黑色的;
(3)红色结点的子节点都是黑色的;
(4)每个结点,从该结点到子孙结点的所有路径上包含相同数目的黑色结点。
24.”说说jdk中类的源码“
(1)Objec类;(2)ArrayList;(3)String类;(4)Hashmap类。
25.”写个单例模式吧“
26.”并发的方式知道哪些“
27.”oracle批量处理内部实现“
oracle批量拷贝、Direct-Path、并行DML。
详情:http://blog.csdn.net/javacoffe/article/details/5181570
HR面:
”加入进了阿里巴巴,还考虑其他公司吗“、”你最近还投了其他哪些公司“、”上半年为什么不向阿里投简历“、”比较一下阿里、微软中国、腾讯等公司,技术方面的差异“
--------------------------------------------------------------------------------------------
--------------------------------------
7.说一下你所理解的J2EE是什么?
首先,J2EE(Java 2 Enterprise Edition),它是一种标准,包含一系列基于Java的技术规范以及相关的接口定义,能够更统一、有效地进行企业应用开发。
遵循J2EE标准的框架,是指实现了J2EE包含的技术规范和接口,能够按照J2EE规定的方式工作。
其次,J2EE为了解决传统C/S架构的弊病(客户端显得臃肿,应用第一次部署简单,但后续升级维护困难),采用了多层的分布式应用模型,根据应用逻辑划分为组件,不同组件根据所在层次运行在不同的机器上。该模型划分为四层,分别为运行在客户端上的客户端曾,运行在Web服务器上的web层,运行在EJB服务器上的EJB层以及运行在EIS服务器上的企业信息系统层。其中,很多厂商把web层和EJB层作为一层,即中间层,在发布应用时,将这两层结合在一起发布,称为应用服务层。
最后,web层的组建包含servlet/Jsp以及Javabean,而EJB层的组件为企业级Javabean。struts、spring mvc是基于servlet组件的框架,因此它们可以运行在servlet容器中,也就是说他们是web层框架。而JDBC是J2EE提供关于数据库连接的标准,提供了一个标准、透明的数据库连接的公共编程接口,各开发商根据JDBC的标准来实现其底层的驱动程序。
说到这里我们要介绍一下通常所说的应用服务器(如WebLogic)与Tomcat有何区别。应用服务器提供更多的J2EE特征, 如EJB,JMS,JAAS等,同时也支持Jsp和Servlet.而Tomcat则功能没有那么强大,它不提供EJB等支持。但如果与JBoss(一个 开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。既然应用服务器具有Tomcat的功能,那么Tomcat有没有存在的必要呢?事实上,我 们的很多中小应用不需要采用EJB等技术,Jsp和Servlet已经足够,这时如果用应用服务器就有些浪费了。而Tomcat短小精悍,配置方便,能满 足我们的需求,这种情况下我们自然会选择Tomcat.
百级以及千级的并发量。
首先自我介绍
1. 面试官拿着你的简历,会挑其中的一个项目,然后让你说出这个框架的流程。
2. 画出框架的流程图,会问每一个部分都是干什么用的。
3. 针对2的问题,我们做的都是web项目,在那个框架中,servlet对应的是哪一个部分。
servlert在struts中是作为控制器,也就是MVC中C。
4. 由前两个问题牵引出web.xml文件配置中都有哪些属性,以及它的作用。
5. 对spring了解吗?
6. spring的依赖注入方式有哪几种(注意不是spring的注入方式是依赖注入)?
有三种。分别为1、使用属性的setter方法注入;2、使用构造器注入;3、使用字段(fild)注入(注解方式,即@Autowired和@Resource)。
又可以分为两种,一种是自动注入还有一种是手动注入,1、2是手动注入的方式,3既可以手动也可以自动。
详见:http://blog.163.com/qqabc20082006@126/blog/static/2292852520091125112112902/
7. 有关事务的问题,做项目中做到哪些与事务有关的,事务是怎么控制的,怎么去写?
8. 触发器,存储过程也说了一点.
触发器和存储过程一样也是SQL语句集,但存储过程必须由用户、应用程序或者触发器来显示地调用并执行,而触发器是特定的时候自动地执行或者激活的,与用户和应用程序无关,当一行被插入、更新或者删除时触发器才会执行,同样还取决于触发器是怎么样创建的,当update时使用一个更新触发器,当delete时使用一个删除触发器,当insert时使用一个插入触发器。用数据库触发器是可以保证数据一致性和完整性。
详情:http://blog.csdn.net/madforg/article/details/7300265
9. 项目开发中,如果遇到一个问题,你自己也不知道该用什么技术去解决,怎么去解决,该如何去查?
10. 你有三年项目开发经验,觉得自己比别人有优势的地方在哪?
11. 最后会问对他们公司有什么要了解的,给你个机会,让你去问问题。
1,自我介绍,自己做过的项目,擅长的技术。
2,用过的框架,最擅长的那个?
3,所知道的MVC框架还有哪些?
4,经常去些什么样的网站,对自己将来有什么样的打算,规划。
5,喜欢技术吗,(喜欢)。举个例子来说明你喜欢技术。
6,以前项目中有没有加班,频率、加班时间长度。对加班的看法。
7,以前的项目主中要做什么内容,SE级别,还是开发。
8,在项目组怎样做项目,没有详细设计能做吗?
9,Struts用的什么版本。
10,Struts2用过吗?和Struts1有什么区别。
11,Spring的AOP了解吗,主要用在项目的那些方面。
12,以前的项目规模都是多大的。
1. 首先自我介绍
2. 问最熟悉的项目
3. 画出STRUTS框架响应jsp的流程图.
4. 针对2的问题,我们做的都是web项目,在那个框架中,servlet对应的是哪一个部分
5. 由前两个问题牵引出web.xml文件配置中都有哪些属性,以及他的作用
6. 对spring了解吗
7. spring的依赖注入方式有哪几种(注意不是spring的注入方式是依赖注入)
8. 有关事务的问题,做项目中做到哪些与事务有关的,事务是怎么控制的,怎么去写
9. Struts底层的相关知识
10.项目开发中,如果遇到一个问题,你自己也不知道该用什么技术去解决,怎么去解决,该如何去查
11.你有三年项目开发经验,觉得自己比别人有优势的地方在哪
12.最后会问对他们公司有什么要了解的,给你个机会,让你去问问题
1. 首先自我介绍
2. 在你所用过的框架中你比较喜欢那个
3. 问你做过的这些项目中那个收获最大,收获到了什么
4. ibatis 和 Hibernate 的区别
5. servlet 的生命周期
6. spring 的两个主要特性(AOP 和IOC)
7. 说一下你所理解的J2EE是什么
8. 为什么说JBOSS 符合J2EE的要求,而TOMCAT 不符合J2EE的要求
9. Hibernate 的优点和缺点
10. 你认为在项目中最重要的是什么
11. 要是分给你的任务,你感到完成有困难,你会怎么办
12. 最后你对支付宝有什么要问的
总结: 根据面试官不同,他可能喜欢的人也不同,这个面试官喜欢做事有计划的。
--------------------------------------------
1、花两分钟时间介绍(推销)一下自己?
2、你熟悉JavaEE的哪些技术?比较擅长的是什么?
3、谈谈你最擅长的技术(他上面提到的技术)都包含哪些特性?(注:主要看掌握的深度)
4、说说常用的设计模式有哪些,结合工作中的实例谈谈你是怎么利用这些模式处理实际问题的?
(注:至少能说出4、5个来,能对其中一两个模式结合实例做一下分析)
5、谈谈你对数据库SQL性能优化方面的看法和经验?
6、你对业界的最新技术发展动态有关注吗?最近炒得比较火热的是哪些技术?
-----------------------------------
阿里巴巴java技术架构:
阿里巴巴的主流Java框架是自己写的,同时结合了大量open source的资源。
WEB层 —— 使用webx框架。主要利用velocity模板技术来展现页面。
业务层 —— 主要使用command模式实现。WEB层通过command dispatcher的调用来使用业务逻辑。
数据访问层 —— 使用DAO(Data Access Object)模式。底层使用iBatis来访问数据库。数据采用的是Oracle。数据库操作的SQL语句需要你手工书写相关的SQL代码(对于复杂的SQL语句需要通过DBA的评审)。
在所有层次上,我们都广泛使用了Spring framework。因此你需要对Spring有一定的了解才行。
开发工具,我们采用IDE和命令行相结合的模式。在命令行上,我们用antx工具来组织项目、build项目、发布项目。但我们多数时间会在eclipse集成环境上,开发、调试应用。
版本控制,我们采用了Subversion。但部分项目因为历史的原因,暂时使用CVS,将来必然会迁移到Subversion上。
Subversion有很多种操作方式:通过命令行、通过TortoiseSVN集成工具、通过WEB、通过Eclipse插件。
------------------------------------------
软件测试面试:
面试的主要问题有:
1. 在测试的过程中发现的最有趣的bug是什么?
2. 对这个有趣的bug是怎么处理的?
3. 为什么要做测试(我之前是做开发的)
4. 谈了谈之前我做过的一些项目,印象最深的项目有哪些?并由此进行了一些交流
5. 之前项目中都遇到了什么困难,都是怎么解决的?
-------------------------------------------
阿里人如是说:
欢迎来 阿里巴巴面试.
我们通常会同时安排3个10y左右工作经验的工程师来伺候您.
从j2se到jee到spirng without jee…
从jdbc到ibatis到hbm到…
从bdb到sqlite到mysql到pgsql到oracle…
从jetty到tomcat到resin到jboss到weblogic…
从ioc到di到spring到pico到hivemind到osgi…
从jsp到servlet到webwork到struts2到…
从汇编到c到c++到java到python到ruby到groovy,..
从oo到fp到sicp…
从javacc到bison/yacc/flex到antlr到龙书…
从OOD到Analysis Pattern到PEAA…
从tdd到xp到scrum到其他agile methodologies…
从多线程到多进程到IPC到concurrent programming到操作系统的调度…
从SSL到TLS到PKI到X509…
从CAS到SSO到Federation到OpenID到SAML…
从windows到linux到mac os到hpux到aix…
从6楼的前台MM到8楼的销售MM到10楼的技术MM…
….
….
….
呵呵 在网上认识一些阿里巴巴的人,他们确实对新技术 有些狂热的,面试的人要见多识广还要会忽悠,当然,不能让面试官牵着你的鼻子走,面试的目的是要考察你知道多少东西的,不是考察你不知道多少东西的。