• 030 一次面试小节


      面试的基础不怎么好,然后整理一下吧。

    1.大纲

      arraylist和linkedlist的区别

      set怎么保证唯一性

      hashtable与hashmap的区别

      hashmap的结构

      异常怎么处理的

    2.arraylist和linkedlist的区别

      底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。而之所以称为动态数组,是因为Arraylist在数组元素超过其容量大,Arraylist可以进行扩容(针对JDK1.8  数组扩容后的容量是扩容前的1.5倍),Arraylist源码中最大的数组容量是Integer.MAX_VALUE-8,对于空出的8位

      可以看到,只要ArrayList的当前容足够大,add()操作向数组的尾部的效率非常高的,当向数组指定位置添加yi据时,会进行大量的数组移动复制操作。而数组复制时,最终将调用System.arraycopy()方法,因此add()操作的效率还是相当高的。尽管这样当向指定位置添加数据时也还是比Linkedlist慢,后者添加数据只需要改变指针指向即可。Arraylist删除数组也需要移动数组,效率较慢。
    Linkedlist基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。
      1、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
                     对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

      2.在内存中,arraylist是连续的,linkedList不不连续的。

    3.set怎么保证唯一性

      set保存的就一个value,如果每次进行add时都将新值与原来所有值进行比较,将是一个大大的性能浪费,举例,set中有1000个值了,如果新增一个,那这个值是否要与前1000个进行equals比较呢,相同进行过滤,没有相同则进行加入,这太慢了。
      set用到了哈希方法,先进行取hashcode,在将得到的值插入到指定算出来的地址上,如果下次有相同值对应这个地址,则进行equals比较,相同则过滤,不同则通过解决冲突算法,将该值存入起来。

    4.hashtable与hashmap的区别

      1.它们所继承的类不一样。

      HashTable和HashMap都实现了Map接口,但是它们所继承的类时不同的。HashTable继承了Dictionary类(Dictionary类已经过时),而HashMap则是继承了AbstractMap类。我们来看看它们的函数声明。
     
      2.HashTable是线程安全的,HashMap是线程不安全的。

      根据JDK6的文档,HashTable是同步的,也就是说,它是线程安全的。从接口的实现中我们就可以看到,Hashtable是实现了Serializable;

      HashMap也同样实现了Serializable,但是根据文档所述,HashMap这个类其实是不同步的,也就是说,HashMap是线程不安全的。如果要使用HashMap进行多线程的开发,那么需要手动添加外同步。(可以使用    Collections.synchronizedMap(new HashMap())获取一个线程安全的Map)。

      3.HashTable不允许null作为key和value,而HashMap允许null作为key和value。

      在HashMap中,只能有一条记录使用null作为key(这不是废话嘛 - -!!),但是可以有任意条value为null的记录。意思是,当使用get(key)方法取数据的时候,如果没有,这个key,或者key对应的值为空,那么get(key)返回null。

      现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。也可能是Hashtable开始设计的时候没有遵循驼峰命名法

    5.hashmap的结构

      哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

      

    6.异常怎么处理的

    1. 逻辑异常,这类异常用于描述业务无法按照预期的情况处理下去,属于用户制造的意外。

    2. 代码错误,这类异常用于描述开发的代码错误,例如NPE,ILLARG,都属于程序员制造的BUG。

    3. 专有异常,多用于特定业务场景,用于描述指定作业出现意外情况无法预先处理。

    7.如何排查问题

      本地断点

      服务器上日志

      linux对日志的操作:

      A:查找到日志

      1.按照文件名查找

        (1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找
        (2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf
        (3)find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
        (4)find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件

      B:根据 关键词 查看日志 并返回关键词所在行

      方法一:cat 路径/文件名 | grep 关键词

      demo:

        cat  test.log | grep "http"  # 返回test.log中包含http的所有行

      C:sed -n ‘5,10p’ filename 这样你就可以只查看文件的第5行到第10行。

      D:最好的方式:

      单个文件可以使用vi或vim编辑器打开日志文件,使用编辑器里的查找功能。在查看模式下,符号/后面跟关键字向下查找,符号?后面跟关键字向上查找,按n查找下一个,按N查找上一个。
      多个文件可以使用grep命令,比如 grep ERROR /var/log/messages*。会把匹配到ERROR这个关键字的行和所在的日志文件直接输出到屏幕。
      还可以使用cat命令后面使用grep过滤等方法,不如上面两个实用。上面两个较常用。

    8.linux中的查找错误

      看问题7即可。

    9.数据库传播机制

      事务的传播机制定义在TransactionDefinition接口中,我们也可以通过枚举类Propagation类调用,下面我也附上两个类的源码供参考。

      REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。
      SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。
      MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。   mandatory
      REQUIRES_NEW:创建一个新事务,如果当前事务不存在,把当前事务挂起。
      NOT_SUPPORTED:无事务执行,如果当前事务不存在,把当前事务挂起。
      NEVER:无事务执行,如果当前有事务则抛出Exception。
      NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。   nested
     

    10.数据库的四大特性

      * 原子性(Atomicity)  :强调的事务的不可分割.

      * 一致性(Consistency)    :强调的事务的执行前后,数据库的的完整性保持一致.

      * 隔离性(Isolation)  :强调的事务的并发的访问,一个事务的执行,不应该受到另一个事务的打扰.

      * 持久性(Durability) :强调的事务结束之后,数据就永久的保存的数据库中.
      

    11.隔离级别

      

  • 相关阅读:
    windows下jmeter安装配置
    golang读取json配置文件
    磁盘分区、扇区等概念理解
    linux 命令笔记
    jvm静态分派和动态分派
    java实例初始化顺序
    计算机网络
    文件对比工具Meld
    IaaS、PaaS、SaaS
    USB 驱动常见名词解释
  • 原文地址:https://www.cnblogs.com/juncaoit/p/10529289.html
Copyright © 2020-2023  润新知