1.Java的HashMap是如何工做的?
HashMap是一个针对数据结构的键值,每一个键都会有相应的值,关键是识别这样的值。javascript
HashMap 基于 hashing 原理,咱们经过 put ()和 get ()方法储存和获取对象。当咱们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,经过键对象的 equals ()方法找到正确的键值对,而后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每一个 LinkedList 节点中储存键值对对象。css
参考:前端
2.什么是快速失败的故障安全迭代器?
快速失败的Java迭代器可能会引起ConcurrentModifcationException在底层集合迭代过程当中被修改。故障安全做为发生在实例中的一个副本迭代是不会抛出任何异常的。快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。ajax
3.Java BlockingQueue是什么?
Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操做,它等待元素变得可用时来检索,一样等待空间可用时来存储元素。算法
4.何时使用ConcurrentHashMap?
在问题2中咱们看到ConcurrentHashMap被做为故障安全迭代器的一个实例,它容许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap此时能够被使用。这很是相似于Hashtable,但ConcurrentHashMap不锁定整个表来提供并发,因此从这点上ConcurrentHashMap的性能彷佛更好一些。因此当有大量更新时ConcurrentHashMap应该被使用。spring
5.哪个List实现了最快插入?
LinkedList和ArrayList是另个不一样变量列表的实现。ArrayList的优点在于动态的增加数组,很是适合初始时总长度未知的状况下使用。LinkedList的优点在于在中间位置插入和删除操做,速度是最快的。数据库
LinkedList实现了List接口,容许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操做使LinkedList可被用做堆栈(stack),队列(queue)或双向队列(deque)。设计模式
ArrayList实现了可变大小的数组。它容许全部元素,包括null。 每一个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增长,可是增加算法并无定义。当须要插入大量元素时,在插入前能够调用ensureCapacity方法来增长ArrayList的容量以提升插入效率。
6.Iterator和ListIterator的区别
ListIterator有add()方法,能够向List中添加对象,而Iterator不能。
ListIterator和Iterator都有hasNext()和next()方法,能够实现顺序向后遍历,可是ListIterator有hasPrevious()和previous()方法,能够实现逆向(顺序向前)遍历。Iterator就不能够。
ListIterator能够定位当前的索引位置,nextIndex()和previousIndex()能够实现。Iterator没有此功能。
均可实现删除对象,可是ListIterator能够实现对象的修改,set()方法能够实现。Iierator仅能遍历,不能修改。
7.什么是CopyOnWriteArrayList,它与ArrayList有何不一样?
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中全部可变操做(add、set等等)都是经过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操做要慢一些,由于它须要实例的快照。
CopyOnWriteArrayList中写操做须要大面积复制数组,因此性能确定不好,可是读操做由于操做的对象和写操做不是同一个对象,读之间也不须要加锁,读和写之间的同步处理只是在写完后经过一个简单的”=”将引用指向新的数组对象上来,这个几乎不须要时间,这样读操做就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,所以CopyOnWriteArrayList适合使用在读操做远远大于写操做的场景里,好比缓存。
8.迭代器和枚举之间的区别
若是面试官问这个问题,那么他的意图必定是让你区分Iterator不一样于Enumeration的两个方面:
Iterator容许移除从底层集合的元素。
Iterator的方法名是标准化的。
9.Hashmap如何同步?
当咱们须要一个同步的HashMap时,有两种选择:
使用Collections.synchronizedMap(..)来同步HashMap。
使用ConcurrentHashMap的
这两个选项之间的首选是使用ConcurrentHashMap,这是由于咱们不须要锁定整个对象,以及经过ConcurrentHashMap分区地图来得到锁。
10.IdentityHashMap和HashMap的区别
IdentityHashMap是Map接口的实现。不一样于HashMap的,这里采用参考平等。
在HashMap中若是两个元素是相等的,则key1.equals(key2)
在IdentityHashMap中若是两个元素是相等的,则key1 == key2
11.mybatis的优缺点?
优势:SQL写在XML中,便于统一管理和优化
提供映射标签,支持对象和数据库的orm字段关系映射
能够对SQL进行优化
缺点: SQL工做量大
mybagtis移植姓很差
不支持级联
mybatis学习:
12.谈谈SSH整合?
struts(表示层)+spring(业务层)+hibernate(持久层)
struts是一个表示层的框架,主要用于接收请求,分发请求。struts其实属于MVC中的VC层次的
hibernate是一个持久层的框架,主要负责与关系数据库的操做
spring是一个业务层的框架,是一个整合的框架,可以很好的黏合表示层和持久层。
13.maven是什么?有什么做用?
是一个项目管理、构建工具
做用:帮助下载jar 寻找依赖,帮助下载依赖 热部署、热编译
14.WEB 前端优化?
减小HTTP请求的数量(合并css、js、图片)
利用浏览器的缓存机制
利用GZIP压缩机制:只针对文本类资源有效
把CSS文件放在HTML开头
把javascript文件放在HTML结尾
避免CSS表达式(判断浏览器)
使用javascript压缩
减小DNS查找
避免重定向
使用ajax
15.安全性测试
利用安全性测试技术,找到潜在的漏洞
16.事务隔离级别(4种)
Serializable(串行化):一个事务在执行过程当中彻底看不到其余事物对数据库所作的更新(事务执行的时候不容许别的事务并发执行,事务只能一个接着一个地执行,而不能并发执行)
Repeatable Read(可重复读):一个事务在执行过程当中能够看到其它事务已经提交的新插入的记录,可是不能看到其它事务对已有记录的更新
Read Commited(读已提交数据):一个事务在执行过程当中能够看到其它事务已经提交的新插入的记录,并且能看到其它事务已经提交的对已有记录的更新。
Read Uncommitted(读未提交数据):一个事务在执行过程当中能够看到其它事务没有提交的新插入的记录的更新,并且能看其它事务没有提交到对已有记录的更新
17.MYSQL存储引擎(4种)
MyISAM它不支持事务,也不支持外键,尤为是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本均可以使用这个引擎来建立表。
每一个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,可是扩展名分别为:
.frm(存储表定义)
MYD(MYData,存储数据)
MYI(MYIndex,存储索引)
InnoDB
InnoDB存储引擎提供了具备提交、回滚和崩溃恢复能力的事务安全。可是对比MyISAM的存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。
1)自动增加列2)外键约束
MEMORY
memory使用存在内存中的内容来建立表。每一个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问很是快,由于它到数据是放在内存中的,而且默认使用HASH索引,可是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
MERGE
merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须彻底相同,MERGE表中并无数据,对MERGE类型的表能够进行查询、更新、删除的操做,这些操做其实是对内部的MyISAM表进行操做。
18.事务传播特性
1. PROPAGATION_REQUIRED: 若是存在一个事务,则支持当前事务。若是没有事务则开启
2. PROPAGATION_SUPPORTS: 若是存在一个事务,支持当前事务。若是没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 若是已经存在一个事务,支持当前事务。若是没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 老是开启一个新的事务。若是一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 老是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 老是非事务地执行,若是存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:若是一个活动的事务存在,则运行在一个嵌套的事务中. 若是没有活动事务,
19.简述一下你了解的设计模式。
所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题通过证明的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式令人们能够更加简单方便的复用成功的设计和体系结构。将已证明的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中给出了三类(建立型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一块儿造成更大的结构]、行为型[对在不一样的对象之间划分责任和算法的抽象化])共23种设计模式,包括:Abstract Factory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。
面试被问到关于设计模式的知识时,能够拣最经常使用的做答,例如:
工厂模式:工厂类能够根据条件生成不一样的子类实例,这些子类有一个公共的抽象父类而且实现了相同的方法,可是这些方法针对不一样的数据进行了不一样的操做(多态方法)。当获得子类的实例后,开发人员能够调用基类中的方法而没必要考虑到底返回的是哪个子类的实例。
代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不一样,代理能够分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。
适配器模式:把一个类的接口变换成客户端所期待的另外一种接口,从而使本来因接口不匹配而没法在一块儿使用的类可以一块儿工做。
模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,而后声明一些抽象方法来迫使子类实现剩余的逻辑。不一样的子类能够以不一样的方式实现这些抽象方法(多态实现),从而实现不一样的业务逻辑。
除此以外,还能够讲讲上面提到的门面模式、桥梁模式、单例模式、装潢模式(Collections工具类和I/O系统中都使用装潢模式)等,反正基本原则就是拣本身最熟悉的、用得最多的做答,以避免言多必失。
设计模式: