[转]面试总结

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

XML的解析方式?
DOM和SAX
DOM解析是一行一行来解析所以效率低,但是不耗内存
SAX解析是一下子全部加载到内存中,效率高,但是耗内存

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

2)唯一索引:unique
不可以出现相同的值,但可以有null值

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

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);

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

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的执行流程?

posted @ 2017-05-16 11:37  Mr.xiaobai丶  阅读(5415)  评论(1编辑  收藏  举报