zoukankan      html  css  js  c++  java
  • 陆金所面试题

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

  • 相关阅读:
    unity3d-----Collider 组件参考
    Activity使用Dialog样式导致点击空白处自动关闭的问题
    Android中fragment之间和Activity的传值、切换
    android获取屏幕宽高与获取控件宽高
    SQL表两列取一列唯一值的记录
    android addJavascriptInterface 不能生效 解决办法
    Android用ImageView显示本地和网上的图片
    调用webservice时,产生android.os.NetworkOnMainThreadException错误
    EditText输入小数
    ListView 删除item删除不了的问题解决办法
  • 原文地址:https://www.cnblogs.com/daiwei1981/p/10022279.html
Copyright © 2011-2022 走看看