030 平安面试小节
发布日期:2021-08-16 13:28:07 浏览次数:51 分类:技术文章

本文共 3425 字,大约阅读时间需要 11 分钟。

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

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.隔离级别

  

 

转载于:https://www.cnblogs.com/juncaoit/p/10529289.html

转载地址:https://blog.csdn.net/weixin_30807779/article/details/98249020 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:分类器应用
下一篇:【Leetcode】【Easy】Symmetric Tree

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月16日 16时41分10秒