花旗金融2020春招面经(offer)

面试刚开始是英文自我介绍、英文介绍项目、英文交流几个问题

接着是Java基础知识、数据库知识,面试官很好,很多问题并不会太为难你,还会询问你的工作意向。

面完大概3天就来了offer 

面试问题和答案主要整理如下

  1. Java集合类

 

 

  • collection 接口常用的子接口有:List 接口、Set 接口
  • List 接口常用的子类有:ArrayList 类、LinkedList 类
  • Set 接口常用的子类有:HashSet 类、LinkedHashSet 类
  1. HashTable和HashMap的区别,取哈希的方式有什么不同。
  1. 继承的父类不同

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

  1. 线程安全性不同

Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。

  1. 是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,

Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

  1. key和value是否允许null值

   Hashtable中,key和value都不允许出现null值。

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

  1. 两个遍历方式的内部实现上不同

   Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式

  1. Hash值不同

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

hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算

  1. 内部实现使用的数组初始化和扩容方式不同

HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。

   Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

  1. HashMap的底层

HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

HashMap是非线程安全的,只是用於单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。

HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

   HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。

当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。

  1. Jdk1.7和jdk1.8中HashMap的区别
  2. Hashmap的负载因子为什么是0.75

加载因子越大,对空间的利用更充分,但是查找效率会降低(链表长度会越来越长);

加载因子太小,那么表中的数据将过于稀疏(很多空间还没用,就开始扩容了),对空间造成严重浪费。系统默认加载因子为0.75.

  1. HashMap的初始容量是多少、怎么自己设置、扩容方式

HashMap共有四个构造方法。构造方法中提到了两个很重要的参数:初始容量和加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中槽的数量(即哈希数组的长度),初始容量是创建哈希表时的容量(从构造函数中可以看出,如果不指明,则默认为16),加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 resize 操作(即扩容)。

HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容  

扩容是是新建了一个HashMap的底层数组,而后调用transfer方法,将就HashMap的全部元素添加到新的HashMap中(要重新计算元素在新的数组中的索引位置)。 很明显,扩容是一个相当耗时的操作,因为它需要重新计算这些元素在新的数组中的位置并进行复制处理。因此,我们在用HashMap的时,最好能提前预估下HashMap中元素的个数,这样有助于提高HashMap的性能。

  1. 10万个数据用ArrayList怎么存
  2. TreeMap的底层、效率

TreeMap集合是基于红黑树(Red-Black tree)的 NavigableMap实现。该集合最重要的特点就是可排序,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

1.  往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。

 2.  往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键的比较规则定义在CompareTo方法上。

3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器。

  1. AVL的最大高度差、B+树

结点的左右子树最大高度差是1,如果大于等于2 就不平衡。

  1. 数据结构的应用?

使用栈实现回退、撤销的问题

使用栈和hashmap实现括号匹配、表达式求值

使用树实现决策树。

使用队列解决排队优先级问题。等

  1. AVL树和二叉树的区别?

AVL树是二叉树的特殊形式,

    1. 结点有序,是特殊的二叉查找树。
    2. AVL要求尽量节点的左右子树尽量保持平衡,是左右子树尽量保持平衡的二叉查找树。便于查找效率。
  1. JDK1.8的新特性

1·特殊的接口:接口里面的方法可以有方法体。

2·方法的调用:可以使用::调用方法。

3·lambda表达式:语法超级简单,被python,scala逼出来的语法。

4·数据流编程:Spark特性和方法特别像。

  1. 接口的默认和静态方法

Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或虚拟扩展方法或防护方法)。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。

  1. 四大函数式接口、使用方法

Supplier供给型接口、

Consumer消费型接口、

Predicate断定型接口、

Function函数型接口

  1. Cloneable使用方法

Clone方法是可以创建对象的一种方式。使用clone方法复制对象。由于clone方法将最终将调用JVM中的原生方法完成复制也就是调用底层的c++代码,所以一般使用clone方法复制对象要比新建一个对象然后逐一进行元素复制效率要高。

  1. 对微服务的理解

微服务关注的是服务的大小,是具体解决某一问题的一个组件,可独立部署执行。

微服务架构是一种架构模式,它把一个单一的应用开发为一组小型服务的方法。每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用 HTTP 资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理。

  1. UNIONUNION ALL的区别

union会自动压缩多个结果集合中的重复结果

union all则将所有的结果全部展示出来,不管是不是重复

  1. Try catch finally的执行顺序、各种情况
  2. 同步代码块、静态同步代码块
    使用static关键字修饰的代码块称为静态代码块,一般用于初始化类的静态属性和对象创建前的环境。静态代码块在类装载时会自动执行,换言之,一旦触发类,其中的静态代码块便会最先得到执行,并且只执行一次,与创建的对象个数无关。
  3. Finally关键字的作用
  4. Arraylist和linkedlist的区别
  5. ArrayList的最大容量、扩容方式

与物理内存和所存储的对象类有关,

扩容方式,初始为16,增加1.5倍

 

数据库三大范式:

第一范式:就是原子性,字段不可再分割

第二范式:就是完全依赖,没有部分依赖;
【表中必须有一个主键;没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分】
注意,符合第二范式的关系模型可能还存在数据冗余、更新异常等问题。

第三范式:就是没有传递依赖

数据库的设计范式是数据库设计所需要满足的规范,数据库的规范化是优化表的结构和优化把数据组织到表中的方式,
这样使数据更明确,更简洁。

 

**事务的四大特性(ACID):

  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

  2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

  3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

  4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章