陆金所面试题

今天下午去陆金所面试java。问得是java基础与框架,但是自己没有背面试宝典,很多都回答不好。

1.hashmap 与 hashtable 的区别 以及 hashmap的实现原理

arraylist与LinkedList 的区别与原理

ComparableComparator接口是干什么的?列出它们的区别。

经典的java中return和finally问题!

 

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:

 

(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

 

(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

 

 

 

当然还有很多人探讨Finally语句的执行与return的关系,颇为让人迷惑,不知道finally语句是在try的return之前执行还是之后执行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:finally语句是在try的return语句执行之后,return返回之前执行

 最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

 

list 排序 去重 set

2.多线程:volatile 关键字与内存可见性  CAS 算法 同步容器类 ConcurrentHashMap锁分段机制

                object 中 的wait  sleep notify

写一个多线程的生产者与消费者的例子 

方法一:   wait()  和   notify()   通信方法实现
 
看盒子代码
        public class PublicBox { 
           private int apple = 0;     
           public synchronized void increace() { 
               while (apple ==5) { 
                   try { 
                       wait(); 
                   } catch (InterruptedException e) { 
                       e.printStackTrace(); 
                   } 
                  
               } 
               apple++; 
               System. out .println("生成苹果成功!" );
               notify(); 
           }       
           public synchronized void decreace() { 
               while (apple ==0) { 
                   try { 
                       wait(); 
                   } catch (InterruptedException e) { 
                       e.printStackTrace(); 
                   } 
               } 
               apple--; 
              System. out.println( "消费苹果成功!" );
               notify(); 
           } 
          
           public static void main(String []args)
              {
                     PublicBox box= new PublicBox();
                     
                     Consumer con= new Consumer(box);
                     Producer pro= new Producer(box);
                     
                     Thread t1= new Thread(con);
                     Thread t2= new Thread(pro);
                     
                     t1.start();
                     t2.start();
                     
                     
              }
       }
  
生产者代码(定义十次):
 
public class Producer implements Runnable { 
    private PublicBox box; 
 
    public Producer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)  
       {
               try {
                     System. out .println("pro  i:" +i);
                           Thread. sleep(30);
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
            box.increace(); 
       }
        
    } 
}
 
消费者代码(同样十次):
 
public class Consumer implements Runnable { 
    private PublicBox box; 
 
    public Consumer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)
       {
             try {
                     System. out .println("Con: i " +i);
                           Thread. sleep(3000);                // 这里设置跟上面30不同是为了 盒子中的苹果能够增加,不会生产一个马上被消费  
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
            box.decreace(); 
        } 
 } 
}
 
输出如下:
 
pro  i:0
Con: i 0
生成苹果成功!
pro  i:1
生成苹果成功!
pro  i:2
生成苹果成功!
pro  i:3
生成苹果成功!
pro  i:4
生成苹果成功!
pro  i:5
消费苹果成功!
Con: i 1
生成苹果成功!
pro  i:6
消费苹果成功!
Con: i 2
生成苹果成功!
pro  i:7
消费苹果成功!
生成苹果成功!
pro  i:8
Con: i 3
消费苹果成功!
生成苹果成功!
pro  i:9
Con: i 4
消费苹果成功!
生成苹果成功!
Con: i 5
消费苹果成功!
Con: i 6
消费苹果成功!
Con: i 7
消费苹果成功!
Con: i 8
消费苹果成功!
Con: i 9
消费苹果成功!

3.jvm  模型 以及类加载机制  栈内存溢出  内存溢出

s0/s1 优缺点  缺点是浪费了一块存储空间  优点是方便了碎片整理 内存地址

当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。

采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。

4.springMVC 模型原理

1. 用户发送请求到DispatcherServlet 控制器

2. DispatcherServlet 控制器根据请求路径到HandlerMapping映射器查询具体的handler处理器

3. HandlerMapping映射器根据用户请求查找与之对应的HandlerExecutionChain执行链再回传给DispatcherServlet控制器

4. DispatcherServlet控制器根据handler具体的实现方式调用HandlerAdapter适配器

5. HandlerAdapter适配器调用具体的handler处理器处理业务并返回ModelAndViewDispatcherServlet控制器

6. DispatcherServlet控制器将ModelAndView专递到ViewResolver视图解析器

7. ViewResolver视图解析器 返回具体的视图到DispatcherServlet控制器

8. DispatcherServlet控制器渲染视图后响应给用户

5.springIOC   AOP  动态代理机制

l Jdk代理:基于接口的代理,一定是基于接口,会生成目标对象的接口类型的子对象。

l Cglib代理:基于类的代理,不需要基于接口,会生成目标对象类型的子对象。

6.mybatis原理   #、$ 的区别  分页 resulttype与resultmap的区别

 

resultTypesql语句的结果集封装类型   

比如 :    resultType="User"

看出来了吧,resultType和resultMap都映射到了User对象中

说说不同点吧,resultType 和restltMap
restulyType:
1.对应的是java对象中的属性,大小写不敏感,
2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感
3.resultMap:指的是定义好了的id的,是定义好的resyltType的引用
注意:用resultType的时候,要保证结果集的列名与java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
4.type:java 对象对应的类,id:在本文件要唯一column :数据库的列名或别名,property:对应java对象的属性,jdbcType:java.sql.Types
查询语句中,resultMap属性指向上面那个属性的标签的id
parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名加类名,基本数据类型则可以省略
5.一对1、一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同,而这往往是没有报错的。
6.若有意外中的错误,反复检查以上几点,和认真核查自己的sql语句,mapper.xml文件是否配置正确。


另外还有resultMap 元素,它是 MyBatis 中最重要最强大的元素,它能提供级联查询,缓存等功能

 

 原sql语句:

[sql] 
           <span style="font-size:18px;">
           delete from   ups_role_permission_dataparams  where role_id = #{roleId,jdbcType=INTEGER}
         </span>  

在这里用到了#{},使用#时:

1、用来传入参数,sql在解析的时候会加上" ",当成字符串来解析 ,如这里 role_id = "roleid";

2、#{}能够很大程度上防止sql注入;

延伸:

1、用${}传入数据直接显示在生成的sql中,如上面的语句,用role_id = ${roleId,jdbcType=INTEGER},那么sql在解析的时候值为role_id = roleid,执行时会报错;

2、${}方式无法防止sql注入;

3、$一般用入传入数据库对象,比如数据库表名;

4、能用#{}时尽量用#{};

注意:

mybaties排序时使用order by 动态参数时需要注意,使用${}而不用#{};

 

 

posted on 2018-11-26 19:16  伪全栈的java工程师  阅读(3296)  评论(0编辑  收藏  举报