zoukankan      html  css  js  c++  java
  • 9月20号面试总结(shangyun)

    1.二分法查找实现

     

     

    2.HashMap和Hashtable的区别
    1、继承的父类不同

    Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

    2、线程安全性不同
    3、是否提供contains方法
    HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
    4、key和value是否允许null值
    Hashtable中,key和value都不允许出现null值。
    5、两个遍历方式的内部实现上不同
    Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

    6、hash值不同
    哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

    7、内部实现使用的数组初始化和扩容方式不同
    HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。


    3.Collection和Collections的区别
    Collection是集合类的上级接口,继承与他有关的接口主要有List和Set

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作


    4.ArrayList、Vector、LinkedList的区别
    ArrayList、Vector和LinkedList类均在java.util包下,均为可伸缩数组,即可以动态改变长度的数组

    ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间

    来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。

    1)ArrayList和Vector都有一个初始化的容量大小,当里面存储的元素超过初始的大小时就需要动态地扩充

    它们的存储空间,Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认

    扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。

    2)ArrayList和Vector最大的区别就是synchronization的使用,没有一个ArrayList的方法是同步的,而

    Vector的绝大多数方法(如add,insert,remove,set,equals,hashcode)都是直接或间接同步的,所以Vector

    是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要稍逊于ArrayList

    LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,

    但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器

    对容器的选择:

    当对数据的主要操作是索引或只在集合的末端增加、删除元素时,使用ArrayList或Vector效率比较高,

    当对数据的操作主要为指定位置或删除操作时,使用LikedList效率比较高;当在多线程中使用容器时,

    选用Vector较为安全


    5.List<String>为何不能赋值给List<Object>
    这种转换只能在子类与父类之间转换,虽然Object是String的父类,但是List<Object>和List<String>在编译器看来,是两种完全不同的东西,不允许你这样转换。

    6.Enumernation和Iterator的区别

    7.Iterator和ListIterator的区别
      1. iterator()方法在set和list接口中都有定义,但是ListIterator()仅存在于list接口中(或实现类中);

      2. ListIterator有add()方法,可以向List中添加对象,而Iterator不能

      3. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

      4. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

      5. 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。  


    8.Mybatis的一级、二级缓存,#和$占位符
    Mybatis的接口映射文件UserMapper.xml、参数传递有2种方式、一种是#{}、另一种是${}

    二者有着很大的区别:

    #{} 实现的是sql语句的预处理参数、之后执行sql中用?号代替、使用时不需要关注数据类型、mybatis自动实现数据

    类型的转换、并 且可以防止sql注入

    ${} 实现是sql语句的直接拼接、不做数据类型转换。需要自行判断数据类型、不能防止sql注入

    总结:

    #和$的区别:

    1、

    #是预编译的方式,

    $是直接拼接;

    2、

    #不需要关注数据类型,mybatis实现自动数据类型转换;

    $不做数据类型转换,需要自行判断数据类型;

    3、

    #可以防止sql注入;

    $不能防止sql注入;

    4、

    如果只有一个参数,默认情况下,

    #{}中可以写任意的名字;

    ${}中只能用value来接收。

    9.ajax工作原理
    ajax 的全称是Asynchronous JavaScript and XML
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。
    https://www.cnblogs.com/wanghp/p/6991554.html

    10.二叉树遍历方法

    11.Memcache和Redis的区别
    数据结构:Memcache仅能支持简单的K-V形式,Redis支持的数据更多
    多线程:Memcache支持多线程,Redis支持单线程,CPU利用Memcache利用率更高
    持久化:Redis支持持久化,Memcache不支持持久化
    分布式:Redis做主从结构,而Memcache服务器需要通过hash一致化来支撑主从结构
    虚拟内存:Redis当物理内存使用完时,会将一些很久没有用的内存交换到磁盘,而Memcache采取的LUR策略,将一部分数据刷新叼
    两者进行对比,是因为都是内存数据管理系统,而实际上两者之间区别还是很大,Redis更多的象一个键值对数据,包括数据的持久化,主从架构,数据备份等策略都是为了保证数据安全以及高可用,而Memcache更多的是一个数据缓存系统是为了提升数据的读取效率,所以两者的应用也有所不同,Memcache适合于适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等工作场合,Redis除去做Nosql数据库使用外,还能用做消息队列,数据堆栈和数据缓存等。


    12. 创建多线程的方式 : 4种
    * 1.继承Thread类
    * 2.实现Runable接口
    * 3.实现Callable接口
    * 4.使用线程池创建线程

  • 相关阅读:
    Asp.net的核心对象
    webform在页面生成的代码与事件回传
    计算机专业课程
    代替iframe的方法
    js中斜杠转义
    Uncaught Error: Syntax error, unrecognized expression: |117的js错误
    vs调试时报503错误
    Md5加密方法
    ps批量修改图片
    “Parsing filters unsupported” error during extraction of RAR file
  • 原文地址:https://www.cnblogs.com/WhiperHong/p/11558830.html
Copyright © 2011-2022 走看看