• 陆金所面试题


    今天下午去陆金所面试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 动态参数时需要注意,使用${}而不用#{};

  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/daiwei1981/p/10022279.html
Copyright © 2020-2023  润新知