zoukankan      html  css  js  c++  java
  • java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别

    1、什么是跳表?

    跳表实际上就是多层链表

     

    跳表可用在让链表的元素查询接近线性时间

    代码结构及java实现参考博客园随笔

    2、判断两棵二叉树是否相同?(结构相同,内容相同)

    思路:(1)先定义树节点TreeNode:{

    Int val;

    TreeNode left;

    TreeNode right;//左右节点

    TreeNode(int x){val=x;}

    }

    (2)判断两个树是否为空树的情况,再判断两个节点所指的值val是否相同,再递归,循环比较左节点或右节点是否相同(参看博客园随笔)

    3、冒泡排序的实现

    For(i=0;i<a.length-1;i++){  //循环冒泡的次数

       For(j=0;j<a.length-i-1;j++){  //循环比较的次数

           If(a[j]>a[j+1]){

               Int temp = a[j];

               a[j] = a[j+1];

               a[j+1]=temp;

            }

       }

    }

    4、Cookie和session的区别

      Cookie是客户端保持状态的方案

      session是服务端保持状态的方案,只有访问jsp、servlet等程序,服务器才会创建session,访问静态资源不会创建。可以在服务器上通过request对象的getSession方法得到session。浏览器禁用或不支持cookie时,可以通过URL地址重写实现session(HttpServletResponse类的encodeURL(String url)方法),在地址中附加Sid参数作唯一标识

    5、熟悉哪些设计模式

    (1)线程安全的单例模式:懒加载+synchronized

    关键字:线程安全

     

    缺点是效率低

    还有一种饿汉方式:在类装载的时候就实例化静态实例,再用静态getInstance方法返回

    (2)工厂模式:使用场景:jdbc连接数据库、降低对象的产生和销毁

    关键字:父接口+子实现类+第三方构建实例的类

    实现过程:1 定义父接口及公共方法

     

    2 定义实现父接口的子类

     

    3 定义含有根据子类名创建子类实例的create方法的工厂类

     

    return human; }

    Class.forName即让虚拟机查找并加载指定的类

    4 根据创建子类实例的类来创建子类实例

     

    创建子类实例时,用到向上转型

    (3)模板方法模式

    关键字:抽象父类(基本方法+final模板方法)+ 子实现类(实现基本方法)

    使用场景:重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为;

     

    Main方法中实例化父类,FatherClass fc=new SubClass();

         fc.run();

    (4)原型模式:不通过new来产生对象,而是通过对象拷贝来实现

    关键字:类实现cloneable接口并重写clone()方法

     

    浅拷贝:拷贝目标对象A的所有变量,但变量中对其他类实例的引用B仍然指向原来的地址,即拷贝后的对象A1修改成员变量的值,只影响它本身,而拷贝后的对象修改引用其他类实例的变量的值,会同时影响修改到目标对象

    例:A.set成员变量=aaa,A.setB=bbb

    A1.set成员变量=ccc,A.setB=ddd

    此时输出A.成员变量=aaa’,A.B=ddd

    输出A1.成员变量=ccc,A.B=ddd

    深拷贝:是全拷贝,拷贝后对象的变量相互独立,互不影响,对其他类实例的引用指向拷贝后的对象

    以上面的例子,结果输出应为:

    输出A.成员变量=aaa’,A.B=bbb

    输出A1.成员变量=ccc,A.B=ddd

    (5)代理模式

    1 静态代理(聚合式,体现在代理类实例化了被代理类):

    关键字:父接口+子实现类+代理实现类

     

    2 动态代理:主要用来做方法的增强,在不修改目标代理类源码的情况下,增强方法

    实现动态代理的关键技术是反射,jdk动态代理的反射主要体现在invoke方法参数method反射调用的是被代理对象的方法

    第一种动态代理:JDK动态代理的实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口

    关键字:接口+子类+实现InvocationHandler接口和调用Proxy.newProxyInstance的代理类

     

    Proxy的静态方法newProxyInstance(ClassLoader cl, Class<?> interface, InvocationHandler h)

    InvocationHandler接口的唯一方法invoke(Object proxy,Method m,Object[] args)

    第二种动态代理:cglib动态代理(继承式)

    关键字:实现MethodInterceptor接口的代理类

     

    (6)策略模式

    关键字:抽象父类+子实现类(多个)+上下文(维护一个对策略类对象的引用)

     

     

    策略与简单工厂模式结合的例子

     

    6、抽象类与接口的区别

     

  • 相关阅读:
    14.4.9 Configuring Spin Lock Polling 配置Spin lock 轮询:
    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
  • 原文地址:https://www.cnblogs.com/blackdd/p/8510292.html
Copyright © 2011-2022 走看看