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、抽象类与接口的区别

     

  • 相关阅读:
    Vue.js —— 关闭eslint校验
    彻底搞懂 module.exports/exports/import/export/export default
    JS 中的原型和原型链
    TypeScript-初级-08-声明合并
    TypeScript-初级-07-泛型
    TypeScript-初级-06-类与接口
    TypeScript-初级-05-类
    TypeScript-初级-04-枚举
    TypeScript-初级-03-元组
    TypeScript-初级-02-字符串字面量类型
  • 原文地址:https://www.cnblogs.com/blackdd/p/8510292.html
Copyright © 2011-2022 走看看