[转]面试总结

基础部分:
statement和PreparedStatement的区别
statement是针对一次性存取操做时用的对象
PreparedStatement是针对批量存取效率高,
由于PreparedStatement是预编译 而 statement是每次执行相关数据库都要进行一次sql编译前端

XML的解析方式?
DOM和SAX
DOM解析是一行一行来解析因此效率低,可是不耗内存
SAX解析是一会儿所有加载到内存中,效率高,可是耗内存java

mysql的索引构建?
1)普通索引:index
容许出现相同的索引内容mysql

2)惟一索引:unique
不能够出现相同的值,但能够有null值正则表达式

3)主键索引:primary_key
不能够有相同的值,且不能够有null值,一个表只能有一个primary_key索引redis

4)全文索引:fulltext
全文索引能够针对值中的某个单词算法

索引的建立:
1)ALTER TABLE 适用于表建立完毕后添加索引
ALTER TABLE 表名 ADD 索引类型(index,unique,primary_kry,fullText)索引名(字段名);
索引名字能够不要,不要索引名的话,当前索引名就是该字段名,
好比: ALTER TABLE student ADD INDEX name (sname);
或 ALTER TABLE student ADD INDEX (sname);spring

2)CREATE INDEX 可对表增长普通索引或UNIQUE索引---注意!只能添加普通索引和惟一索引
好比: CREATE INDEX 索引名 ON 表名 (字段名)
CREATE UNIQUE INDEX 索引名 ON 表名 (字段名) sql

3)还能够在建立表的时候添加索引
CREATE TABLE `test1` (
`id` smallint(5) UNSIGNED AUTO_INCREMENT NOT NULL, -- 注意,下面建立了主键索引,这里就不用建立了
`username` varchar(64) NOT NULL COMMENT '用户名',
`nickname` varchar(50) NOT NULL COMMENT '昵称/姓名',
`intro` text,
PRIMARY KEY (`id`),
UNIQUE KEY `unique1` (`username`), -- 索引名称,可要可不要,不要就是和列名同样
KEY `index1` (`nickname`),
FULLTEXT KEY `intro` (`intro`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='后台用户表';数据库

索引的删除:
1) DROP INDEX 索引名 ON 表名
2) ALTER TABLE 表名 DROP INDEX 索引名
-- 这两句都是等价的,都是删除掉表中的索引;

ALTER TABLE 表名 DROP PRIMARY KEY -- 删除主键索引,注意主键索引只能用这种方式删除 编程

查看索引:
show index from 表名; \G;

组合索引与前缀索引: 注意!这两种称呼是对创建索引技巧的一种称呼,并不是索引的类型;
组合索引:
多个字段使用一个索引,若是sql查询语句中where条件有索引值中的第一个字段,则会使用该索引,反之不会

前缀索引:
若是索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操做,可使用前缀索引方式进行索引
好比:一个字段的长度是50,可是通常这个字段中的数据不会有那么长,那咱们建立索引的时候能够 字段名(估计长度)

单列索引与组合索引的区别:
单列索引适用于单个字段的查询,好比查询条件后只有一个字段,那mysql会很快的根据索引查询到结果,
可是若是查询条件有多个,那mysql只会去它认为最有效的那个索引进行查询,其余的条件仍是会全表扫描,速度慢
组合索引适用于多个字段的查询,好比查询条件后面有多个字段,那mysql将无需任何扫描直接查询到结果,
可是查询条件中只有索引中其余字段却没有第一个字段的时候,是用不到这个索引的;

什么语句会不走索引?
查询条件的字段参与运算的不走索引 好比: WHERE 'age'+10=30
查询条件模糊查询中占位符在左边的不走索引,好比: WHERE 'uname' LIKE '%康%'
正则表达式不参与索引
查询条件中字符串与数字的比较不走索引, 好比: WHERE 'a'=1
查询条件中带OR的也不走索引 好比: WHERE dname='xxx' or loc='xx' or deptno=45
若是mysql估计全表扫描比使用索引快,也不会走索引

数组部分:
数组的初始长度:
基本数据类型的数组长度为0,引用数据类型的长度为null

集合部分:
说说集合?
答:集合分为单列集合和双列集合。
单列集合的顶层是Collection接口,包括List和Set集合。

List集合又包括ArrayList、LinkedList 特色是元素可重复,有序,有索引,能够经过索引来操做元素
ArrayList底层采用的是数组结构,线程不安全,效率高,查询快,增删慢,初始长度10
LinkedList集合的底层采用的是链表数据结构,线程不安全,增删快,查询慢。

Set集合的特色元素是无序的,元素不能够重复。包括HashSet和TreeSet。
HashSet的底层数据结构是哈希表,线程不安全,效率高。使用hashCode和equals来判断元素惟一性,先判断hashCode后判断equals
TreeSet的底层数据结构是二叉树,线程不安全,效率高。可以给元素进行排序。

双列集合的顶层接口是Map,该集合存储的是键值对,一对一对的往里存,并且要保证键的惟一性。包括Hashtable、HashMap、TreeMap。

Hashtable的底层数据结构是哈希表,不能够存储null键和null值,线程安全,效率低。被HashMap替代

HashMap的底层数据结构是哈希表,能够存储null键和null值,线程不安全,效率高。依据是hashCode和equals来保证键的惟一性的。

TreeMap的底层数据结构是二叉树,线程不安全,可以给集合中的键排序。


ArrayList集合元素去重的方法?
答: 先建立个Set集合hashSet,而后再建立个新的list,
用for循环遍历以前有元素的list,在for循环内嵌套一个if判断,
用list.get()索引取出每个元素,在if表达式中使用该元素往Set集合中添加,
若是添加进去会返回true,那就会进入if中,而后用新建立的list添加这个元素,
等遍历完以前的list后,新建立的list中就是去重后的元素

第二种方法是用LinkedHashSet的元素有序并且去重的特性

线程部分:
多线程的用法通常有哪几种?
答: 1.继承Thread类 2.实现Runnable接口 3.线程池

这两种方式的区别?或者说那个更好?
(1)继承Thread类的优势:代码简单,可以直接使用Thread类的方法.缺点:扩展性差,由于java只支持单继承
(2)实现Runnable接口的优势:扩展性强,更灵活些.缺点:代码比较复杂点,不能直接使用Thread类的方法

线程的状态:
新建,就绪,运行(运行时可能阻塞与等待).死亡

sleep和wait的区别?
答:(1)sleep是让线程睡眠,必须给相应的睡眠时间,不须要唤醒,时间到了会自动醒来,休眠时不放弃Cpu的执行权。
(2)wait的是让线程等待,能够传参也能够不传参,传参是在指定的时间后等待,须要被唤醒。等待的时候放弃cpu的执行权。

何时会出现安全性?
答: 多线程,并发,操做同一数据。

项目部分:
项目介绍:
咱们这个商城是一个B2C平台,项目用的是SOA构架,分为表现层和服务层,表现层负责与前端的交互,服务层负责与数据库的交互,
表现层与服务层的之间的通讯用的是DUBBO,注册中心用的是zookeper;
咱们用Nginx服务器作的负载均衡与反向代理,用户在一个请求过来先进入Nginx服务器,Nginx服务器会根据各个应用服务器的访问压力
来把请求分配给相对空闲的应用服务器上,若是须要响应给用户的数据在redis中有,就会直接从redis中获取数据并响应给用户
若是须要响应给用户的数据redis中没有,那表现层就会去注册中心的服务列表找相应的服务,找到须要调用的服务后,zookeper会把该服务
的地址发给表现层,表现层接着拿着这个地址去直接找服务并调用服务,接着服务层会与数据库交互.
我在项目中负责的是商品模块与商城首页的动态展现.


大家项目中有没有用到单例多例的地方?常见的单例和多例说下?
答:暂时没有答案

技术部分:
框架部分:
springMVC:
springMVC是什么?
是个表现层框架

springMVC的执行流程?
(1)发送请求到前端控制器; (2)前端控制器请求处理器映射器查找Handler; (3)处理器映射器向前端控制器返回Handler
(4)前端控制器拿着Handler调用处理器适配器来执行; (5)处理器执行完Handler后返回一个ModelAndView给适配器;
(6)处理器适配器又会把ModelAndView交给前端控制器; (7)前端控制器会请求视图解析器来解析视图(根据逻辑视图名来解析)
(8)解析完毕后会向前端控制器返回View; (9)前端控制器进行视图渲染(视图渲染是将模型数据填充到request做用域中)
(10)前端控制器向用户响应结果

springMVC中的controller是单例仍是多例?
默认是单例,能够经过在@controller以前加上@scope("prototype")来改变成多例;
通常若是不在controller中定义非静态成员变量的话就不用改

spring:
spring是什么?
简单来讲,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

说下IOC?
IOC就是控制反转,是把对象的建立权利交给了spring这个容器来管理;下降了组件之间的耦合性,提升了程序的灵活性和可维护性;
就是经过配置文件(XML或.properties)指定须要实例化的JAVA类(类名的完整字符串)

IOC在项目中的具体应用?
IOC模式将耦合代码从程序中移出,放到统一的XML文件中管理。由IOC容器经过配置文件来管理对象的生命周期、依赖关系等

IOC用的什么设计模式?
工厂模式


说下AOP?
AOP就是面向切面编程,能够经过预编译方式和运行期动态代理实如今不修改源代码的状况下给程序动态统一的添加功能的一种技术
把散落在程序中的公共部分提取出来,作成切面类这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,
只要修改该切面类的代码就行,不用要处处修改; 实现调用某个方法以前或/和以后,自动执行一系列自定义的语句 AOP底层是代理机制
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

AOP在项目中的具体应用?
权限拦截,日志记录,事物处理,异常处理,数据库链接

AOP用的什么设计模式?
动态代理模式

DI的依赖注入放式有哪几种
接口注入, setter注入, 构造方法注入

mybatis:

mybatis是什么?
是一个优秀的持久层框架; 它支持定制化SQL,存储过程以及高级映射;

mybatis的缓存机制?
MyBatis的缓存分为一级缓存和二级缓存,
一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,
使用二级缓存属性类须要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

mybatis的好处是什么?
mybatis的好处是对jdbc作了个简单的封装,相对更加轻量级
把SQL语句放在了单独的XML文件中编写,解决了jdbc的SQL硬编码问题,使用更加灵活,便于维护

其余部分:
freemarker:
介绍:
freemarker是一款用java语言编写的模板引擎;彻底免费;
它能够基于模板技术生成各类文本如:HTML,jsp等

优势:
能够完全的分离表现层和业务逻辑, 能够提升开发效率,
可让开发过程当中人员分工更明确,前端人员只须要专心开发界面,后端开发人员专一系统,负责页面准备要显示的数据

原理:
模板+数据模型
模板负责数据在页面中的表现,数据模型负责逻辑的处理,最终生成的页面就是模板+数据模型

使用步骤:
(1)初始化freemaker配置 (2)建立数据模型 (3)加载模板文件 (4)显示生成后的数据(也就是页面)

经常使用的freemarker的几个标签?

redis:
介绍:
redis是C语言编写的,它是一个可基于内存也可持久化的日志型,Key-Value数据库;非关系型数据库
redis为了保证效率,数据都是缓存在内存中; 也能够持久化在磁盘中,当数据发生改变时,会周期性的把更新的数据写入磁盘

可用场景:
消息队列,数据堆栈,数据缓存等

数据缓存的数据快照机制:
redis有数据快照,开发人员能够经过配置文件定制数据快照的时间间隔,redis会将数据快照自动存放在磁盘中;
若是服务器忽然中止服务,redis也不多会出现数据丢失

redis的数据类型:
共5种:string(字符串),hash(哈希表),list(列表),set(集合)及zset(有序集合)
redis中值的类型还支持:字符串列表,无序不重复的字符串集合,有序不重复的字符串集合,键、值都为字符串的哈希表

项目中哪里用到了redis? 怎么用的? 集群是怎么搭建的?
保存用户session(能够实现session共享); 保存购物车(未登陆保存到cookie,登录后把cookie中购物车保存到redis,删除本地cookie购物车);
有关商品,热销,推荐排序的队列,一般存放在Redis之中

redis的使用方式:
java有个jar包,杰迪斯 调用set 或 push 放入数据

redis怎么存储一对多?
使用list列表存储

Dubbo:
介绍:
Dubbo是一款远程调用技术,通常用来作SOA架构中表现层与服务层的通讯

哪里用到了Dubbo? 怎么使用?
在表现层与服务层通讯的时候用到的,在xml文件中配置

Dubbo的底层是什么?
socket

调用关系:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册本身提供的服务。
服务消费者在启动时,向注册中心订阅本身所需的服务。
注册中心返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

采用了什么设计模式?
工厂模式, 装饰着模式, 观察者模式, 代理模式

zookeper:
介绍:
是注册中心

哪里用到了zookeper? 怎么用?
在表现层与服务层通讯的时候


ActivMQ:
介绍:
是一个消息队列,有两个通知模式,点对点和广播订阅

哪里用到的? 怎么用?
solr索引库的更新

并发问题:
悲观锁与乐观锁:
悲观锁:

乐观锁:
使用数据版本,这是乐观锁的一种实现方式,就是为数据增长版本标识;
通常是往数据库的表中增长一个数字类型的字段(version);
当读取数据时,将version字段一块儿读出,数据每更新一次,对这个version的值加1
当提交跟新时,判断数据表中对应的version值与第一次取出来的version值是否一致,
若是一致则跟新,若是不一致则认为是过时数据,不容许跟新

目前没有答案的问题
为何大家电商项目用redis而不用memcache?

redis的执行流程?

相关文章
相关标签/搜索