您的位置:首页 > 职场人生

Java面试题总结(后续不断更新...)

2012-10-25 22:26 489 查看
       面试已有4天了吧,也感受了很多,也只有面试的时候在面试官那“咄咄逼人”的提问下你才知道你有几斤几两重。一般面试官都是组长或者项目经理之类的吧,人家能干到这个份上想必是有一手的,你有多大本事人家一问就知道了。但是,术业有专攻,你会的人家不一定会。比如我在我的简历上说了我会Flex技术,但是人家都不知道,问我Flex是啥,我就把我吹牛皮的本事拿出来了,尽管胡扯都没事,人家知道你说的对不对呢?我觉得面试最重要的就是心理素质。就算不会,你也要厚着脸皮笑着说“这个还真不了解”,也许人家很理解呢,主要是看你对待事情的态度,你有多少工作经验会多少东西人家心里应该有个大概的范围。

       这次面试基本没啥笔试题,到现在就做了2次笔试题,一般人家都是拿着简历问你问题,这个我还是有一定优势的,有回领导最后走时说我“你谈吐逻辑性挺好的,是个程序员应该有的素质”,(*^__^*) 嘻嘻……还有我在面试简历上写上了我的CSDN博客链接,没想到一面试官真去看了看,看了之后立刻给了他一好印象,实际上这家公司也想要我,只不过在薪水上没有谈妥,所以就没去。所以我也建议广大程序员们要养成写博客的好习惯,这不仅是写写文章,更主要是一个学习的过程,很多东西心里想的清楚却并不一定能说的明白。好记性不如烂笔头,就是这个道理。

         今晚总结了下面试过程中问得比较多的问题以及不会的问题,希望能为今后的面试打下基础。如果解答不正错的地方欢迎指出来。

----------------------------------------------------------------------华丽的分割线------------------------------------------------------------------

       

     ●Java基础

     
 1.使用Java输出10个不重复的数字,数字范围在1-100之间。


 

       解答:刚看到这道题时我反复思考的是“不重复”这3个字,我想到了Set集合保存的是不重复的数据,然后写了些。面试官看了之后说我写的有问题,让我再写写看。于是我又想了想,重写了一份,面试官看了之后勉强满意。回来我把我写的code在Eclipse运行了一下,发现代码赘余,经过修改后,代码如下,有更简单的或者别的思路的欢迎告知。

package com.ldfsoft.test;

import java.util.HashSet;
import java.util.Set;

public class RandomTest {

public static void main(String[] args) {
numTest();
}
static void numTest(){
Set set= new HashSet();
for(int i=0;i<10;i++){
while(true){
int num=(int) (Math.random()*100);
if(!set.contains(num)){
System.out.println(num);
set.add(num);
break;
}
}
}
}
}


      2.Java中HashMap,TreeMap,LinkedHashMap的区别。

      解答:HashMap与TreeMap我倒是知道,LinkedHashMap我还是第一次听说,只能空着。本人顺便提一下HashTable,这个也面试的较多。查询网上资料,区别如下所示:

       java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMapHashtable LinkedHashMap 和TreeMap

       Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

       Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null,允许多条记录的值为
Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

       Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

        LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

     TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

 

      一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。

        TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

         LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。以下代码实例可以看出HashMap,LinkedHashMap,TreeMap的区别:

 

 

package com.ldfsoft.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class Ceshi{
@SuppressWarnings("unchecked")
public static void main(String[] args) {

//HashMap
System.out.println("------HashMap无序输出------");
HashMap hsMap=new HashMap();
hsMap.put("3","Value3");
hsMap.put("1","Value1");
hsMap.put("2","Value2");
hsMap.put("b","ValueB");
hsMap.put("a","ValueA");
Iterator it = hsMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry) it.next();
System.out.println("Key: " +e.getKey() + "--Value: "
+ e.getValue());
}

//TreeMap
System.out.println("------TreeMap按Key排序输出------");
TreeMap teMap=new TreeMap();
teMap.put("3","Value3");
teMap.put("1","Value1");
teMap.put("2","Value2");
teMap.put("b","ValueB");
teMap.put("a","ValueA");
Iterator tit = teMap.entrySet().iterator();
while (tit.hasNext()) {
Map.Entry e = (Map.Entry) tit.next();
System.out.println("Key: " +e.getKey() + "--Value: "
+ e.getValue());
}

//LinkedHashMap
System.out.println("--LinkedHashMap根据输入的顺序输出--");
LinkedHashMap lhsMap=new LinkedHashMap();
lhsMap.put("3","Value3");
lhsMap.put("1","Value1");
lhsMap.put("2","Value2");
lhsMap.put("b","ValueB");
lhsMap.put("a","ValueA");
Iterator lit =lhsMap.entrySet().iterator();
while (lit.hasNext()) {
Map.Entry e = (Map.Entry) lit.next();
System.out.println("Key: " +e.getKey() + "--Value: "
+ e.getValue());
}
}

}


 

       3. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?  

       解答xml两种形式 dtd  schema,他们的本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等  

      DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问  

     SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问  

     STAX:Streaming API for XML (StAX)  

      4. 写一个Singleton出来。  

  解答: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。  

一般Singleton模式通常有几种种形式:  

  第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。  

 

public class Singleton {
private Singleton(){}
      //在自己内部定义自己一个实例,是不是很奇怪?
      //注意这是private 只供内部调用
      private static Singleton instance = newSingleton();
      //这里提供了一个供外部访问本class的静态方法,可以直接访问  
      public static Singleton getInstance(){
        return instance;   
      }
}


 

    第二种形式:  

 
public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次    
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}


      其他形式:  定义一个类,它的构造函数为private的,所有方法为static的。  

      一般认为第一种形式要更加安全些  

    ●JavaWeb



      1.说说Jsp的9大内置对象。

 

       解答:这个是基础题,面试的较多。

        request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

       response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

       out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

       pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

       session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

       applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

       config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

       page表示从该页面产生的一个servlet实例

 

    ●框架相关

 

       1. 说说struts1与struts2的区别。

 

       解答:不可否认,现在有些公司还在用struts1,那都是一些老项目了,工作中用到了一些,略通皮毛。区别如下所示:

        1、配置文件格式不同

        2、struts1有from类和action类,属性封装from类里,在struts2里只有action类,属性封装action类里

        3、页面调用是struts1 是*.do  struts2 是*.action

        资料来源:http://zhidao.baidu.com/question/349509852.html&__bd_tkn__=6e8f493f2c3c9b37460be16eeeb332aac71fdae38078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157b58f4379d6ea1fd5c0f03de01252778d037cb7a4a06ed757d2ac28fd64a3609705d305ac5120d4540b5a4a39d08fcaccbdc8c0acb3120f746a0

 

      2.说说Hibernate中怎么清除缓存。

 

      解答:这个问题很悲催,我不知道怎么回答。我想了想弱弱的说:可不可以清除浏览器缓存来解决?那位boss听了问了我一句:请问Hibernate是应用在服务端还是客户端?我一听我2了!

查询资料答案如下:

 

一、hibernate一级缓存 

(1)hibernate支持两个级别的缓存,默认只支持一级缓存; 

(2)每个Session内部自带一个一级缓存; 

(3)某个Session被关闭时,其对应的一级缓存自动清除; 

(4)save、update、saveOrupdate、load、get、list、iterate、lock方法都会向缓存中存对象. 

(5)可以从缓存中读数据的只有: get、load、iterate 

(6)Query对象默认情况下不读缓存,如果要使其支持缓存,则要通过语法: 

query.setCacheable(true); 

<property name="cache.use_query_cache">true</property> 

(7)打开query缓存后,只有查询条件与以前的查询完全相同时,才会在缓存中匹配成功. 

(8)Criteria对缓存支持不足; 

(9)一级缓存不能控制缓存中的对象数量,要注意大批量操作数据时可能造成的内存溢出,可以利用清除缓存. 

session.clear() 清除缓存中所有对象 

session.evict(user) 清除指定对象

二、hibernate二级缓存 

* save、update、saveOrupdate、load、get、list、query、Criteria方法都会填充二级缓存 

* get、load、iterate会从二级缓存中取数据 

* session.save(user) 如果user主键使用“native”生成,则不放入二级缓存.(1)开启二级缓存 

<propertyname="cache.use_second_level_cache">true</property>(2)为hibernate指定二级缓存的实现类 

<property name="cache.provider_class"> 

org.hibernate.cache.OSCacheProvider 

</property>(3)为OSCache缓存创建配置文件(需要hibernate_Advance_Surpport_lib) 

src/oscache.propertiescache.capacity=1000 指定缓存可以容纳多少对象

(4)指明哪些类需要放入二级缓存,需要长期使用到的对象才有必要放入二级缓存 

<class-cache class="entity.PetInfo" usage="read-only"/> //不允许更新缓存中的对象 

<class-cache class="entity.PetInfo" usage="read-write"/> //允许更新缓存中的对象或在orm文件中: 

<class name="entity.PetInfo" table="PetInfo" schema="dbo"catalog="epet"> 

<cache usage="read-only"/></class>(5)如果需要清除二级缓存,使用下面语法 

sessionFactory.evict(User.class) 清除所有user 

sessionFactory.evict(User.class,Id) 清除指定user

 

资料来源:http://www.24xuexi.com/w/2011-04-29/89139.html

 

       ●Oracle/MySql数据库



        1.写出Oracle中查询前十条数据的sql语句

         解答:SQL语句为:select * from table  where rownum< =10

         2.写出Oracle中查询第11条至20条的sql语句

         解答:SQL语句为select * from (select t.*,rownum r from table t where rownum <=20) where r>=10

         3.说说Oracle与mysql有哪些区别吧。

        解答:我当时说了两点:1.Oracle有“伪列”rownum,而mysql则没有2.mysql是通过auto_increment实现自增,而Oracle则是通过序列或者触发器来实现自增。面试官说这就够了,(*^__^*)…

        ●html/JavaScript/Jquery



        1.说说javascript中onload()与jquery中的ready()的区别。

 

        解答:js中的onload我倒是经常用,至于jquery的ready()我倒是第一次听说,结果可想而知。查询资料解决如下:

 

        ◆执行时机:window.onload方法是在网页中的所有的元素(包括元素的所有关联文件)都完全加载到浏览器之后才执行。而通过jQuery中的$(document).ready()方法注册的事件处理程序,只要在DOM完全就绪时,就可以调用了,比如一张图片只要<img>标签完成,不用等这个图片加载完成,就可以设置图片的宽高的属性或样式等。

        ◆$(document).ready()方法可以多次使用而注册不同的事件处理程序,而window.onload一次只能保存对一个函数的引用,多次绑定函数只会覆盖前面的函数。

 

资料来源:http://blog.csdn.net/ymjring/article/details/7733129

 

       2.(待解决)使用javascript或jquery实现如下功能:网页加载完毕时,把网页的第一个输入框置为焦点(focus),按回车键时,置第二个输入框为焦点,以此类推,直到最后一个输入框。假设并不知道输入框的id值。

 

        解答:这个问题我到现在也没有想明白。我不解的地方是“按回车键时,置第二个输入框为焦点”,期望有志之士能解决这个问题。

         ●Eclipse/MyEclipse

         1.说几个Myeclipse的快捷键,ctrl+c,ctrl+v之类的就免了

         解答:我想这个主要考对IDE工具的熟练度吧,我说了如下几个:

         Alt+/   代码提示键

        Ctrl+shift+r     打开资源管理器,可查找出文件

        Shift+Ctrl+Enter 在当前行插入空行

       Ctrl+k  快速定位到下一个 

       Ctrl+shift+k   快速定位到上一个 

       ●思考题



          1.说说你是怎么优化前台页面、后台代码及数据库的。

           解答:这个面试时总共遇到两次,结果我也答不好,哥才工作多久啊,这个还真没有什么体会,期盼高人的指点

           2.开发过程中你是怎么控制内存的.

           解答:又是一道头疼的问题,我当时是敷衍说了几句,貌似这个与硬件搞到一起了,期盼高人解答。

          3.假设有一个网站运行了一段时间速度愈来愈慢了,你怎么解决?

           解答:这个问题到现在还在思考的,我当时的说的是重启服务器,面试官笑了,生产环境你也敢重启服务器?呵呵,这个现在看来当然行不通的,期盼高人指点。

 

            后续整理中,未完待续......

        这是本人学习的结果,允许转载,欢迎交流,但转载务必给出本文章的链接地址:http://blog.csdn.net/youqishini/article/details/8113008,谢谢~

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: