java面试总结

        最近在面试,也看了很多面试题,下面总结一下自己在面试中遇到的坑,也方便日后自己复习,其实很多面试题都是在别的面试总结中遇到的,有很多相同的问题,我就不在写答案了,直接给出我觉得解释比较好的人的链接,大家可以自己看了。

第一,基础知识

  1. ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?查看答案
  2. Arraylist 和 Vector 的区别?各种如何扩容?查看答案
  3. HashMap的数据结构是什么?如何实现的?HashMap和HashTable,ConcurrentHashMap的区别 ?查看答案

第二,spring框架问题

  1. Spring AOP实现原理?查看答案
  2. Spring的IOC容器实现原理和初始化流程是什么样的?查看答案
  3. Spring常用的三种注入方式?查看答案
  4. Spring、SpringMVC中常用注解含义及用法,简单的说几个常用的注解,并解释一下含义?查看答案

第三,数据库方面的问题(参考了很多这篇文章

  1. 什么是事务?什么是锁?

    事务:就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将整组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。        锁:在所有的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

  2. 数据库事务的四个特性及含义 

    原子性(A=Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

    一致性(C=Consistency):在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

    隔离性(I=Isolation):隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。

    持久性(D=Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  3. 什么是索引?索引是个什么样的数据结构呢?   
    索引是一种数据结构,可以帮助我们快速的进行数据的查找.索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引.

  4. 索引的作用?和它的优点缺点是什么?
    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
    在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
    为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

    (1)创建索引可以大大提高系统的性能(优点):
    第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
    第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?
    (2)增加索引也有许多不利的方面:(缺点)
    第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
    索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
    (3)一般来说,应该在这些列上创建索引:
    第一,在经常需要搜索的列上,可以加快搜索的速度;
    第二,在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
    第三,在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
    第四,在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
    第五,在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
    第六,在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
    (4)同样,对于有些列不应该创建索引:
    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
    第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
    第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
    第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引

  5. mysql中常见的锁有几种?简单的说一下吧。
    在mysql当中,关于innodb的锁类型总共可以分为四种,包含了行锁和表锁,分别是:
    基本锁 - [ 共享锁(Shared Locks:S锁)和排它锁(Exclusive Locks:X锁)]
    意向锁 - [ intention lock,分为意向共享锁(IS锁)和意向排他锁(IX锁)]
    行锁 - [ record Locks(行锁)、gap locks(间隙锁)、next-key locks(临键锁)、Insert Intention Locks(插入意向锁) ]
    自增锁 - [ auto-inc locks ]
    详细的解读请移步到别人的博客。

  6. 在MySQL中,最常用的两个存储引擎是MyISAM和InnoDB,它们对索引的实现方式有什么不同?
    MyISAM    data存的是数据地址。索引是索引,数据是数据。索引放在XX.MYI文件中,数据放在XX.MYD文件中,所以也叫非聚集索引。
    InnoDB    data存的是数据本身。索引也是数据。数据和索引存在一个XX.IDB文件中,所以也叫聚集索引。
    另加两种存储引擎的区别:
    1、MyISAM是非事务安全的,而InnoDB是事务安全的
    2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁
    3、MyISAM支持全文类型索引,而InnoDB不支持全文索引
    4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM
    5、MyISAM表保存成文件形式,跨平台使用更加方便
    6、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量select操作可选择
    7、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,可选择。

  7. 同时有多个事务在进行会怎么样呢?怎么解决这些问题呢?MySQL的事务隔离级别了解吗?
    1、多事务的并发进行一般会造成以下几个问题:

    脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚.
    不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作.
    幻读: A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据.造成"幻觉".

    2、MySQL的四种隔离级别如下:

    未提交读(READ UNCOMMITTED)
    这就是上面所说的例外情况了,这个隔离级别下,其他事务可以看到本事务没有提交的部分修改.因此会造成脏读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚).
    这个级别的性能没有足够大的优势,但是又有很多的问题,因此很少使用.

    已提交读(READ COMMITTED)
    其他事务只能读取到本事务已经提交的部分.这个隔离级别有 不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数据进行了修改.

    REPEATABLE READ(可重复读)
    可重复读隔离级别解决了上面不可重复读的问题(看名字也知道),但是仍然有一个新问题,就是 幻读,当你读取id> 10 的数据行时,对涉及到的所有行加上了读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题.

    SERIALIZABLE(可串行化)
    这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所以的操作串行执行,这会导致并发性能极速下降,因此也不是很常用.

  8. 表结构设计,为什么要尽量设定一个主键?主键使用自增ID还是UUID?
    1、主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.
    2、推荐使用自增ID,不要使用UUID.
    因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降.
    总之,在数据量大一些的情况下,用自增主键性能会好一些.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值