笔试和面经

笔试和面经

面试Java研发实习生所做的知识准备,及以后的积累

面试MindCoord过程

邮件通知时间也挺准(2021/4/20 – 15:10-15:25, UTC+8),我大概15:08进腾讯会议的,里面只有我一个人。到了10分钟会进来一个小姐姐,确认身份后,会问你对公司的了解,也没有自我介绍。说完自己的了解后,她会以很快且口齿清楚的方式快速介绍MindCoord公司的一些情况。介绍完就开始问问题了,题量和时间都是有限的,如果思考一会儿还是回答不出,就会跳过。下面是我印象中所有问题(不分先后):

技术类问题

  • 进程和线程
  • 什么是Java深拷贝和浅拷贝
  • Java基本数据类型,枚举(穷举?),除了基本类型,其他叫什么类型(引用类型)
  • 编程遇到的错误类型,除0是什么错误类型(RuntimeException)
  • Java四种引用类型
  • finally的用法,fianl的用法
  • 创建多线程的方法(这里问的就是线程创建的方法!!我就只以为是单线程!!)
  • Spring的设计模式
  • 静态方法能不能调用非静态方法,并说明(不能!!我以为能)
  • 数据库的范式(),并详细说一下第一范式
  • 什么是索引,为什么有索引,优点及缺点

非技术类问题

  • 平时娱乐去哪些场所,消费如何
  • 工作中不喜欢和什么样的人合作
  • 对于工作中任务较多,压力较大,怎么看的

总结

面试都是Java基础,MindCoord是美国的一个创业公司,国内信息很少,我也是从官网上收集的信息。

MindCoord Inc. 是一家成立于美国波士顿的新科技企业,拥有自由、开放、包容、多元的全球化团队,囊括了来自世界各地的智慧人才。公司致力于为所有人提供更简单的虚拟空间创作方案,业务涵盖VR、AR、XR等虚拟成像领域,旗下拥有3D动画快速制作短视频APP——PortalHiker、HereFounder等软件产品和机器宠物等硬件产品。我们欢迎想挑战全新领域的科技人才一同加入,在未知的道路上尽情探索,享受发明创造的乐趣。

产品

  • 3D广告:我们通过桌面软件PortalHiker为AR内容制作解决方案提供帮助,该软件可以帮助企业产生可在其网站和移动应用程序上使用的交互式AR体验。
  • PortalHiker是3D和AR内容制作应用程序,既是内容创建引擎又是3D / AR内容社交媒体。作为在移动设备上生成3D内容的最简单方法,PortalHiker允许用户通过将虚拟元素与现实世界相结合来创建和共享他们的创造力。
  • 在各个平台的视频游戏中插入无干扰的品牌广告,为游戏开发人员提供了通过其游戏获利的可能性。

使用增强现实技术来训练患有帕金森氏病的患者再次行走。

技术

  • 捕捉运动:以人为中心的计算机视觉的基础是机器看到和理解人的运动的能力。3D / AR体验或虚拟实时流的形式制作动画内容。将易用性和性能作为重中之重的原因。
  • 3D内容编辑器:生成3D和AR内容。
  • 3D检视器:我们基于网络的3D查看器可在网站上高质量显示3D内容。

规划

  • 每日一个Java学习视频
  • 每日刷题,力扣,牛客等

Java基础

基础语法

  • 自动类型提升

    结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。

    1
    byte/char/short-->int-->long-->float-->double

    特别的:当byte、char、short三种类型的变量做运算时,结果为int型。String特殊

四种引用类型

  • 强引用(StrongReference)
    • 强引用可以直接访问目标对象。
    • 强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象。
    • 可能导致内存泄露?
  • 软引用(SoftReference)
    • 一个持有软引用的对象不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阈值时,才会回收软引用的对象。因此,软引用可以用于实现对内存敏感的高速缓存。
  • 弱引用(WeakReference)
    • 在系统GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收
  • 虚引用(PhantomReference)
    • 一个持有虚引用的对象,和没有引用几乎是一样的,随时可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。

Java GC

  • 介绍
    • Java在JVM虚拟机上增加了垃圾回收(GC)机制,用以在合适的时间触发垃圾回收,将不需要的内存空间回收释放,避免无限制的内存增长导致的OOM。
  • 如何判断一个对象需要被回收
    • 引用计数
      • Java在GC时会看这个对象是否与其他引用有关联,如果存在引用关系则表示这个对象还有用,不能被回收,如果不存在引用关系则可基本定性为可被回收的对象。优点:效率高;缺点:无法解决循环引用的问题。
    • 可达性分析
      • 为了解决循环引用的问题,Java采用了可达性分析的方式,主要是通过Roots对象作为起点进行搜索,搜索的路径被称为“引用链”,当一个对象到Roots没有任何引用链相连的时,证明此对象不可用,当然被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就会成为可回收对象。能够被回收其实主要看finalize()方法有没有与引用链上的对象关联,如果在finalize()方法中有关联则自救成功,该对象不可被回收,反之如果没有关联则成功被二次标记,就可以称为要被回收的垃圾了。
    • Roots对象
      • 虚拟机栈中引用的对象?
      • 方法区中类静态属性引用的对象?
      • 本地方法栈引用的对象?
    • 4种引用类型

线程

  • sleep方法与wait方法的区别

    • wait:此方法来自于Object类,必须由锁对象进行调用(不是任意对象调用)

      注意:

      • 锁对象需要在哪里存在?锁对象必须在同步中出现。
      • 同步方法的锁对象默认就是字节码对象。
    • sleep:此方法来自于Thread类,是Thread类的静态方法,可以类名加点调用

    • wait方法:

      • 空参数:会让线程进入无限等待状态,进入了无限等待状态后,必须由(其他线程的)notify方法对其进行唤醒。
      • 有参数:效果和sleep类似
    • 区别:wait方法在等待的过程中,释放锁对象;sleep方法在休眠的过程中不会释放锁对象。

  • ConcurrentHashMapHashMap底层数据结构

    • JDK1.7中HashMap由数组+链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
    • JDK1.8中HashMap由数组+链表/红黑树组成,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。转为红黑树后,链表的结构仍然会存在,通过next属性维持,红黑树节点在进行操作时都会维护链表的结构。
    • 原理
      • 如何实现扩容:初始容量16和加载因子0.75。每次扩容都为原来的两倍。当达到其容量的3/4时,会自动进行扩容,如初始为16,存储第12个元素时,这时候会扩容为32,同时,这时需要创建一张新表,将原表的数据移到新表,可以看resize()transfer()方法。表?Entry[] newTable = new Entry[newCapacity];
      • 如何实现存取:HashMap存取时,都需要计算当前key应该对应Entry[]数组哪个元素,通过调用hash()方法,得到hash值,再调用indexFor()得到Entry[]数组下标。如果有两个相同的结果,如果hash相同且key对象为同一个,则为同一个对象,直接在该位置替换原对象;否则为不同对象,这时候发生碰撞了,我们通过链表来存储,可以分析createEntry()方法。
    • JDK1.7中ConcurrentHashMap由分段数组+链表组成。ConcurrentHashMap是由Segment数据结构HashEntry数据结构组成。
    • JDK1.8中ConcurrentHashMap取消了Segment分段锁,采用CAS算法和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似, 是数组+链表/红黑树。(jdk1.6以后对synchronized锁做了很多优化,比如偏向锁、轻量级锁、自旋锁、锁消除、锁粗化等)
    • 如何实现同步:
      • HashEntry用于存储键值对数据,HashEntry内部类里的value ,以及链表next都是volatile修饰的,能保证获取时的可见性。
      • Segment数组中的每个元素包含一个HashEntry数组,HashEntry数组中的每个元素是一个链表结构的元素。Segment数组的每个元素各守护着一个HashEntry数组中的素有元素。当对HashEntry数组的数据进行修改时,必须首先获得对应的Segment数组元素的锁。
      • JDK1.7时实现线程安全的方式:首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问,提高并发访问率。
      • JDK1.8时实现线程安全的方式:synchronized只锁定当前链表或者红黑树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
  • volatile和synchronized区别

    • 线程安全性包括两个方面:可见性,原子性。
    • volatile轻量级,只能修饰变量;只保证数据的可见性,不能用来同步,多个线程并发访问volatile修饰的变量不会阻塞
    • synchronized重量级,可以修饰类、方法、代码段;保证可见性和原子性,多个线程争取synchronized锁对象时,会出现阻塞。

多线程访问这个方法(类方法)就存在线程不安全的问题

指令重排

11没看

数据库

六大范式(Normal form)

关系数据库中的关系是满足一定要求的,满足不同程度要求的称为不同的范式。满足最低要求的称为第一范式,简称1NF;在第一范式的基础上满足进一步要求的称为第二范式,简称2NF,其余范式以此类推。一般来说,数据库只需满足第三范式就行了。

对于各范式之间有如下关系:

  • 第一范式

    • 定义:属于第一范式关系的所有属性都不可再分,即数据项不可分。

    • 理解:1NF强调数据表的原子性,是其他范式的基础

    • 举例:

      1
      2
      |  商品  |
      |名称|数量|

      上表将商品这一数据项又划分为名称数量两个数据项,不符合1NF。应改为如下表所示:

      1
      |商品名称|商品数量|

      但日常生活中仅用第一范式来规范表格是远远不够的,依然会存在数据冗余过大、删除异常、插入异常、修改异常的问题,此时就需要引入规范化概念,将其转化为更标准化的表格,减少数据依赖。

    • 规范化:一个低一级的关系模式通过模式分解可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化。

  • 第二范式

    • 候选码:若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。若一个关系中有多个候选码,则选定其中一个为主码

    • 主属性:所有候选码的属性称为主属性。不包含在任何候选码中的属性称为非主属性非码属性

    • 函数依赖:设R(U)是属性集U上的关系模式,X、Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称Y函数依赖于X或X函数确定Y。

    • 完全函数依赖: 设R(U)是属性集U上的关系模式,X、Y是U的子集。如果Y函数依赖于X,且对于X的任何一个真子集X’,都有Y不函数依赖于X’,则称Y对X完全函数依赖。记作:如果Y函数依赖于X,但Y不完全函数依赖于X,则称Y对X部分函数依赖。

    • 定义:若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。

    • 理解:第二范式是指每个表必须有一个(有且仅有一个)数据项作为主键(primary key),其他数据项与关键字或者主键一一对应,即其他数据项完全依赖于关键字或主键。由此可知单主属性的关系均属于第二范式。

  • 第三范式

    • 定义:非主属性既不传递依赖于码,也不部分依赖于码。
    • 传递函数依赖的概念:在中,若,Z不属于Y,则称Z对X传递函数依赖。记作
    • 理解:第三范式要求在满足第二范式的基础上,任何非主属性**不依赖于*其他非主属性,即在第二范式的基础上,消除了传递依赖*。
  • BC范式(巴斯-科德范式)

    • 定义:关系模式中,若每一个决定因素都包含码,则属于BCFN。
    • 理解:根据定义我们可以得到结论,一个满足BC范式的关系模式有
      • 所有非主属性对每一个码都是完全函数依赖
      • 所有主属性对每一个不包含它的码也是完全函数依赖
      • 没有任何属性完全函数依赖于非码的任何一组属性
    • 举例:有关系模式C(Cno, Cname, Pcno),Cno, Cname, Pcno依次表示课程号、课程名、先修课。可知关系C只有一个码Cno,且没有任何属性对Cno部分函数依赖或传递函数依赖,所以关系C属于第三范式,同时Cno是C中的唯一决定因素,所以C也属于BC范式。
  • 第四范式

    • 定义:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
    • 理解:显然一个关系模式是4NF,则必为BCNF。也就是说,当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值,若有多值就违反了4NF。
  • 第五范式(完美范式)

    • 第五范式有以下要求:
      • 必须满足第四范式
      • 表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。
    • 第五范式是在第四范式的基础上做的进一步规范化。第四范式处理的是相互独立的多值情况,而第五范式则处理相互依赖的多值情况。

关系模式

关系模式是对关系的描述,或者说二维表的表头,设有关系R,属性A1、A2、A3,则表示为,关系数据库中的关系模式是型,关系的值。

  • 什么是关系?

    关系实质上是一张二维表,并满足以下条件:

    • 列不可分性(1NF)
    • 行列无序性(交换列的前后顺序不影响关系模型的语义表达)
    • 实体完整性(唯一)
  • 属性:二维表中的每一列称为属性

  • 值域(域):属性的取值范围

  • 元组(记录):二维表中的一行数据。

  • 关系模式可用五元组表示

    ,其中R:表示关系名,U:表示属性集合,D为U中属性对应域的集合(数据域?),Dom:表示属性域,F:表示函数依赖。

  • 关系模型完整性约束

    • 实体完整性
    • 参照完整性
    • 用户自定义完整性

索引

  • 定义:索引是定义在数据库表基础之上,有助于无需检查所有记录快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一种索引项由索引字段行指针构成。

  • 优点:

    • 提高查询效率
    • 通过创建唯一索引,可以保证数据库中每一行数据的唯一性
    • 在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间
  • 缺点:

    • 创建索引和维护索引耗费时间,且时间随数据量增大而增大
    • 占用物理内存,如果建立聚簇索引,所需空间更大
    • 在对表中的数据进行增删改时需要耗费较多的时间,因为索引也要动态地维护
  • 概念:

    • 聚簇索引:将数据存储与索引放到一块,找到索引也就找到了数据,主文件按照对应字段排序存储,索引文件无重复排序存储。
    • 非聚簇索引:将数据存储于索引分开存储,索引结构的叶子节点指向了数据的对应行,主文件并没有按照对应字段排序存储,索引文件有重复排序存储。
  • 索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。

    大多数情况下都(默认)采用B树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。B树是平衡多叉树,每个节点存放多少个值取决于值所占的空间,这与每一张数据页存放多少条记录与记录信息量有关同理。节点中的值是以非降序进行排列的,节点中的值总是小于等于指向它的结点中的值。

    MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。

  • 使用索引时需要注意:

    • 只对WHEREORDER BY需要查询的字段设置索引,避免无意义的硬盘开销
    • 组合索引支持前缀索引
    • 更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本
  • 索引分四类:

    • index:普通的索引,数据可以重复
    • fulltext:全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样
    • unique:唯一索引,唯一索引,要求所有记录都唯一
    • primary key:主键索引,也就是在唯一索引的基础上相应的列必须为主键

组合索引

  • 为什么要使用联合索引?
    • 减少开销:建立一个组合索引(A,B,C),实际相当于建立了(A),(A,B),(A,B,C)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。但对于大量数据的表,使用组合索引会大大减小开销!
    • 覆盖索引:如果有查询操作,可以直接通过遍历索引取数据,无需查询表,这会减少随机IO操作。减少随机操作是DBA主要优化策略。
    • 效率高:多条件筛选数据。
  • 使用方法:
    • 最左原则(带头大哥不能死,中间兄弟不能断):从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用。上面的组合索引可以支持(A),(A,B),(A,B,C)三种组合进行查找。两个或更多个列上的索引被称作复合索引。

乐观锁和悲观锁

  • 悲观锁

    总是假设最坏的情况,每次当前线程去拿数据的时候都认为其他线程会修改,所以每次在拿数据的时候都会上锁,这样其他线程想拿这个数据就会阻塞直到其他线程拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronizedReentrantLock独占锁就是悲观锁思想的实现。

  • 乐观锁

    总是假设最好的情况,每次当前线程去拿数据的时候都认为其他线程不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间其他线程有没有去更新这个数据,可以使用版本号机制CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

  • 两种锁的使用场景

    两种锁各有优缺点,不可认为一种好于另一种,乐观锁适用于写比较少的情况下(多读少写场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适(多写场景)。

  • 乐观锁常见的两种实现方式

    • 版本号机制

      一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

    • CAS算法(compare and swap,比较与交换)

      有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数

      • 需要读写的变量值 V
      • 进行比较的值 A
      • 拟写入的新值 B

      当且仅当 V 的值等于A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试

  • 乐观锁的缺点

    • ABA问题:如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 “ABA”问题。

      JDK 1.5以后的AtomicStampedReference类就提供了此种能力,其中的 compareAndSet 方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

    • 循环时间长开销大自旋CAS(也就是不成功就一直循环执行直到成功)如果长时间不成功,会给CPU带来非常大的执行开销如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。

    • 只能保证一个共享变量的原子操作:CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。但是从 JDK 1.5开始,提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作.所以我们可以使用锁或者利用AtomicReference类把多个共享变量合并成一个共享变量来操作。

数据库事务特性(Transaction)

  • 事务

    • 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
    • 四个特点ACID:
      • 原子性Atomicity
      • 一致性Consistency
      • 隔离性Isolation
      • 耐久性Durability
  • 原子性

    • 定义:原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

      1
      2
      3
      4
      5
      6
      7
      8
      begin transaction
      select ... from ...;
      ...;
      update account set ... where ...;
      if Error then
      rollback
      else
      commit
  • 分析:在事务中的增删改查语句,要么都执行,要么就都不执行。

  • 解决方法:在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式地使用start transaction开启一个事务,才能将一个代码块放在事务中执行。保障事务的原子性是DBMS的责任,为此许多数据源采用日志机制。例如,SQL Server使用一个预写事务日志,在将数据提交到实际数据页面前,先写在事务日志上。

  • 一致性

    • 定义:一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

    • 解决方法:保障事务的一致性,可以从以下两个层面入手

      • 数据库机制层面

        在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置。这一点是由SQL SERVER进行保证的。比如转账,则可以使用CHECK约束两个账户之和等于2000来达到一致性目的。

      • 业务层面

        对于业务层面来说,一致性是保持业务的一致性。这个业务一致性需要由开发人员进行保证。当然,很多业务方面的一致性,也可以通过转移到数据库机制层面进行保证。

  • 隔离性

    • 定义:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。(Java多线程锁对象)

    • 分析:这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

      当多个事务并发时,SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性。一般情况下,完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。想要理解SQL Server中对于隔离性的保障,首先要了解并发事务之间是如何干扰的。

    • 事务之间的互相影响:脏读不可重复读幻读丢失更新

    • 脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。

    • 不可重复读:在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

    • 幻读(虚读):当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

    • 丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果

    • 理解SQL SERVER中的隔离级别

      数据库的事务隔离级别(TRANSACTION ISOLATION LEVEL)是一个数据库上很基本的一个概念。为什么会有事务隔离级别,SQL Server上实现了哪些事务隔离级别?事务隔离级别的前提是一个多用户、多进程、多线程的并发系统,在这个系统中为了保证数据的一致性和完整性,我们引入了事务隔离级别这个概念,对一个单用户、单线程的应用来说则不存在这个问题。

      为了避免上述几种事务之间的影响,SQL Server通过设置不同的隔离级别来进行不同程度的避免。因为高的隔离等级意味着更多的锁,从而牺牲性能。所以这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离级别Read Commited符合了多数的实际需求。

      SQL Server隔离事务之间的影响是通过锁来实现的,通过阻塞来阻止上述影响。不同的隔离级别是通过加不同的锁,造成阻塞来实现的,所以会以付出性能作为代价;安全级别越高,处理效率越低;安全级别越低,效率高。

      使用方法:

      1
      SET TRANSACTIONISOLATION LEVEL REPEATABLE READ
隔离级别 脏读 不可重复读 幻读 丢失更新 并发模型 更新冲突检测 内容
未提交读:Read Uncommited 悲观 在读数据时不会检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据
已提交读:Read commited 悲观 只读取提交的数据并等待其他事务释放排他锁。读数据的共享锁在读操作完成后立即释放。已提交读是SQL Server的默认隔离级别
可重复读:Repeatable Read 悲观 像已提交读级别那样读数据,但会保持共享锁直到事务结束
可串行读:Serializable 悲观 工作方式类似于可重复读。但它不仅会锁定受影响的数据,还会锁定这个范围。这就阻止了新数据插入查询所涉及的范围
  • 持久性

    • 定义:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。
    • SQL SERVER通过write-ahead transaction log来保证持久性。write-ahead transaction log的意思是,事务中对数据库的改变在写入到数据库之前,首先写入到事务日志中。而事务日志是按照顺序排号的(LSN)。当数据库崩溃或者服务器断点时,重启动SQL SERVERSQL SERVER首先会检查日志顺序号,将本应对数据库做更改而未做的部分持久化到数据库,从而保证了持久性。
  • 总结:

    事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。

      数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

计算机网络

  • TCP和UDP的区别
TCP UDP
可靠性 可靠 不可靠
思想 面向字节流 面向报文
拥塞控制 慢启动、快速恢复、拥塞避免 不提供拥塞控制
双工性 全双工 一对一、多对一、一对多、多对多
效率 传输效率低 传输效率高
应用场景 准确率要求高,效率要求低 效率要求高,准确率要求低
  • HTTPS握手过程

    • HTTPS简介

      • HTTP:直接通过明文在浏览器和服务器之间传递信息

      • HTTPS:Hypertext Transfer Protocol Secure,超文本传输安全协议。采用对称加密非对称加密结合的方式来保护浏览器和服务端之间的通信安全。

        对称加密算法加密数据+非对称加密算法交换密钥+数字证书验证身份=安全

      • HTTP是运行在TCP层之上的,而HTTPS则是在HTTP和TCP层之间多加了一个SSL/TSL层,SSL层向上提供加密和解密的服务,对 HTTP来说是透明的。

      • Secure Socket Layer,安全套接字层。TLS(Transport Layer Security)安全网络传输协议。HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

    • 对称加密与非对称加密

      • 定义:加密和解密都使用同一种算法的加密方法,称之为对称加密。加密和解密使用不同的算法,则为非对称加密。
      • 分析:对称加密需要一把钥匙就够了。非对称加密算法需要两把钥匙,公钥和私钥,它们是一对。用公钥加密的密文只能用相应的私钥解开,用私钥加密的密文只能用相应的公钥解开。其中,公钥是公开的,私钥是不对外公开的。
      • 对比:两者的主要区别在于密钥的长度不同,长度越长,相应的加/解密花费的时间就会更长,对称加密使用的密钥长度会短一些。SSL结合了这两种加密算法的优点,利用非对称加密算法来协商生成对称加密的密钥,然后之后就用对称加密来进行通信
    • 握手过程(关于HTTP的三次握手,其实就是使用三次TCP握手确认建立一个HTTP连接)

      1. 客户端提交HTTPS请求
      2. 服务器响应客户,并把服务器公钥发送给客户端
      3. 客户端验证公钥的有效性
      4. 客户端验证有效后,会生成一个会话密钥(一个随机数)
      5. 客户端用服务器公钥加密这个会话密钥后,发送给服务器
      6. 服务器收到公钥加密的密钥后,用私钥解密,获取会话密钥
      7. 客户端与服务器利用会话密钥对传输数据进行对称加密通信

      下图为HTTPS加密请求(一次握手)过程

    • CA证书

      CA(Certificate Authority)是负责管理和签发证书的第三方权威机构,是所有行业和公众都信任的、认可的。

      CA证书,就是CA颁发的证书,可用于验证网站是否可信(针对HTTPS)、验证某文件是否可信(是否被篡改)等,也可以用一个证书来证明另一个证书是真实可信,最顶级的证书称为根证书。除了根证书(自己证明自己是可靠),其它证书都要依靠上一级的证书,来证明自己。

    • HTTPS和HTTP的区别

      • HTTPS协议需要到CA申请证书或自制证书
      • HTTP的信息是明文传输,HTTPS则是具有安全性的SSL加密
      • HTTP是直接与TCP进行数据传输,而HTTPS是经过一层SSL(OSI表示层),用的端口也不一样,前者是80(需要国内备案),后者是443。
      • HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
    • 注意

      • HTTPS报文在被包装成TCP报文的时候完成加密的过程,无论是HTTPS的header域也好,body域也罢都是会被加密的。
      • 当使用tcpdump或者wireshark之类的TCP层工具抓包,获取是加密的内容,而如果用应用层抓包,使用Charels(Mac)Fildder(Windows)抓包工具,那当然看到是明文的。
    • HTTPS一般使用的加密与HASH算法如下:

      • 非对称加密算法:RSA,DSA/DSS
      • 对称加密算法:AES,RC4,3DES
      • HASH算法:MD5,SHA1,SHA256

设计模式

单例模式

在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

使用场景:IO 、数据库连接、Redis 连接等。

简单工厂模式

简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,不需要管它内部的具体实现,只要告诉它需求即可得到对应想要的产品实例。

抽象工厂模式

抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让子类去做决定。抽象工厂里只声明方法,具体的实现交给子类(子工厂)去实现,这个时候再有新增品类的需求,只需要新创建代码即可。

软件设计的“开闭原则”?

观察者模式

观察者模式是定义对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新

装饰器模式

装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构

适配器模式

适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作

Spring中都使用的设计模式

  • 代理模式:在AOP中使用
  • 单例模式:bean默认是单例模式
  • 模板方法模式:JDBCTemplate
  • 工厂模式:BeanFactory
  • 观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用
  • 适配器模式:SpringMVC中用到适配器模式适配Controller

中邮消费金融有限公司

笔试

中邮在5月8号发了笔试的邀请,点击网址直接做题,应该是自动用邮箱登录的,现在回忆起来笔试大概分4部分,单选,多选,填空,问答,给了90分钟,但我用了不到30分钟就做完了。题目涉及Java基础,多线程,问答有问线程池?最后一个问答好像是从足够多的日志中拿n条日志,如何快速和低内存拿到?我也是随便想到就答了。

面试

12号打电话通知,13号发邮件,14号早上9:30手机多面APP,两人面试我一个。

  • 3分钟自我介绍,我就介绍了基本情况,花了不到30秒感觉
  • 做过Springboot,那你说说负责什么模块,用到了什么技术,事务处理机制,Springboot IOC?
  • 好像Springboot也不会,来说说Java基础,线程创建方法,聊聊线程池,线程安全
  • List和LinkedList区别,Map和List区别,Map排序?

TCL

40分钟54道Java选择题。基础题,暴露问题基础薄弱。

标识符:就是给类、接口、方法、变量、常量等起名字时使用的字符序列。

0.6333属于float还是double。

数组是对象吗。

线程,Thread的方法getPriority(),stop()?有这些方法吗?

权限修饰符,接口可以用什么修饰符?抽象类、方法,abstract可以修饰哪些?

对称加密算法,非对称加密算法。

Linux常用命令

  • 查看日志文件后100行

    1
    tail -f -n 100 日志文件名

评论