component-scanbase-package="cn.itcast.bean"/>
注解:
@Component(value="名称")运用构造办法创立对象
@Scope(value="singleton/prototype")单例和多例
@Lazy(value=true/false)延迟创立问题
@PostConstruct指定办法为初始化办法
@PreDestory指定办法为销毁办法
@Autowired注入引用类型,只能按照类型进行匹配
@Resource注入引用类型,如果有name属性值,则按照bean名称进行匹配;如果没有name属性值,则按照类型进行类型匹配
3.数据库优化
此处重点是数据库索引问题,索引可大大提高查询效率,但是大数据量时也会影响效率。
此时她还会问你当数据量很大时索引不行了该怎么解决,就回答读写分离,分库分表。
提前对这两块做下理解,看看京东淘宝解决方式。
索引存储值按索引列中顺序排列。
可以运用B-Tree索引进行全核心字、核心字范畴和核心字前缀查询。
1.数据库优化
●sql级别优化
sql语句书写方式对效率也是有一定影响。
1)使用>=代替>
select*fromempwheredeptno>=10(效率高,由于depto直接定位到10,效率高)
select*fromempwheredeptno>9(先定位到9,然后还要排除9,效率低)
2)如果使用union或者unionall了,此时如果不需要考虑去掉重复数据,尽量不要使用union,由于union默认是去重复,去重复过程,也会影响效率。
3)对groupby子句优化上面:
尽量在groupby前面将数据过滤掉。
selectjob,avg(sal)fromempwherejob='CLERK'groupbyjob(效率高)
selectjob,avg(sal)fromempgroupbyjobhavingjob='CLERK'(效率低)
4)使用视图:
(数据量非常大状况下)
经常被查询列数据,并且这些数据不被经常修改,删除。
●数据表建立索引
索引是迅速搜索核心。
MySQL索引建立对于MySQL高效运营是很重要。
索引分单列索引和组合索引。
单列索引,即一种索引只包括单个列,一种表可以有各种单列索引,但这不是组合索引。
组合索引,即一种索包括各种列。
MySQL索引类型涉及:
普通索引:
这是最基本索引,它没有任何限制。
唯一索引 :
它与前面普通索引类似,不同就是:
索引列值必要唯一,但容许有空值。
如果是组合索引,则列值组合必要唯一。
主键索引 :
它是一种特殊唯一索引,不容许有空值。
组合索引:
将各种字段建到一种索引里。
有个“最左前缀”成果。
建立索引时机:
普通来说,在WHERE和JOIN中浮现列需要建立索引,但也不完全如此,由于MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候LIKE才会使用索引。
在以通配符%和_开头作查询时,MySQL不会使用索引。
SELECT * FROM mytable WHERE username like'admin%' 而下句就不会使用:
SELECT * FROM mytable WHEREt Name like'%admin'
缺陷:
提高了查询速度,但减少了更新速度。
由于更新时要额外保存索引文献。
索引文献在大数据量时会膨胀不久。
因此如果你MySQL有大数据量表,就需要花时间研究建立最先进索引,或优化查询语句。
使用索引技巧和注意事项 :
1)索引不会包具有NULL值列
只要列中包具有NULL值都将不会被包括在索引中,复合索引中只要有一列具有NULL值,那么这一列对于此复合索引就是无效。
因此咱们在数据库设计时不要让字段默认值为NULL。
2)使用短索引
对串列进行索引,如果也许应当指定一种前缀长度。
例如,如果有一种CHAR(255)列,如果在前10个或20个字符内,多数值是惟一,那么就不要对整个列进行索引。
短索引不但
可以提高查询速度并且可以节约磁盘空间和I/O操作。
3)索引列排序
MySQL查询只使用一种索引,因而如果where子句中已经使用了索引话,那么order by中列是不会使用索引。
因而数据库默认排序可以符合规定状况下不要使用排序操作;尽量不要包括各种列排序,如果需要最佳给这些列创立复合索引。
4)like语句操作
普通状况下不勉励使用like操作,如果非使用不可,如何使用也是一种问题。
like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5)不要在列上进行运算
select * from users where YEAR(adddate)<; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因而咱们可以改成
select * from users where adddate<‘-01-01’;
6)不使用NOT IN和<>操作
淘宝分库分表机制:
淘宝依照订单号做拆分,下单有两个维度,买家和卖家。
淘宝将订单表拆分到16个mysql库中,而在每个库中又将订单表拆分为64份,相称于将一张表拆分为1024份,事务进行了分散,很大限度上提高了并发事务解决能力。
因而买家和卖家怎么找到相应表呢?
对于16台服务器,每台服务器64张表只需要2位买家和卖家id后两位数字就可以准拟定位到详细库和表。
订单号中同步存在买家id最后两位和卖家id最后两位。
分别在订单号倒数第3位,4位和最后两位数。
4.RabbitMq消息队列
此处要点是消费者没收到消息该怎么解决。
应用进程之间通信办法
开发语言:
Erlang–面向并发编程语言。
AMQP是消息队列一种合同。
六种模式,只用五种
1、简朴队列
2、Work模式:
两个消费者,能者多劳
3、订阅模式
1、1个生产者,各种消费者
2、每一种消费者均有自己一种队列
3、生产者没有将消息直接发送到队列,而是发送到了互换机
4、每个队列都要绑定到互换机
5、生产者发送消息,通过互换机,到达队列,实现,一种消息被各种消费者获取目
注意:
消息发送到没有队列绑定互换机时,消息将丢失,由于,互换机没有存储消息能力,消息只能存在在队列中。
4、路由模式
生产者为消息指定类型,路由绑定不同队列,队列指定接受类型,只有类型匹配队列才接受。
模式1:
自动确认
只要消息从队列中获取,无论消费者获取到消息后与否成功消息,都以为是消息已经成功消费。
模式2:
手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者反馈,如果消费者始终没有反馈,那么该消息将始终处在不可用状态。
5.SpringIOC和AOP底层实现
IOC底层:
工厂设计模式+XML技术+反射配备
AOP底层:
动态代理
6.SSH中单例多例问题
三层构造各用是单例还是多例,为什么,action层是单例还是多例,什么时候用多例。
单例多例重要看该层有无定义成员变量,定义了成员变量话由于存在多线程共同调用相似变量因此要设立为多例。
scope属性:
bean生命周期
singleton:
单例(默认值)(在初始化配备文献时候创立对象,不是getBean())
prototype:
多例(在getBean()时候创立对象)
结合项目中使用场景:
分层开发时候:
dao对象:
单例
biz对象:
单例
action对象:
必要多例(属性或模型驱动有数据共享,因此必要多例)
7.单例书写及各种模式区别
面试官让我手写出一种单例模式并解释各种模式区别,此处最佳写出双重校验锁模式。
//双重校验锁写法
classSingleDemoProblem4{
privateSingleDemoProblem4(){}
privatestaticSingleDemoProblem4sdp=null;
privatestaticObjectobj=newObject();
publicstaticSingleDemoProblem4getInstance(){
/*设立双重校验锁防止多线程状况下,某个线程进来判断变量为空进入准备创立对象,但还没创立cpu被抢走,
别线程过来发现变量还是空又进来创立对象,成果导致各种线程创立各种对象出来*/
if(sdp==null){
synchronized(obj){
if(sdp==null){
sdp=newSingleDemoProblem4();
}
}
}
returnsdp;
}
}
饿汉式:
在类加载时就创立对象,不论对象用不用都会创立,导致内存挥霍。
但能保证对象唯一性。
懒汉式:
只在使用时候创立对象,多线程下不能保证每次使用对象唯一。
8.SpringBuild和springBuffer区别
联系:
两者都是字符串缓冲区类,作用与功能相似,内部办法也都相似.但使用场景不同.
区别:
StringBuffer是线程安全,但对于多线程效率低下(由于内部用了synchronize核心字保证线程安全,这样必然牺牲了执行效率)
StringBuilder安全性稍差,但对于多线程效率稍高
9.Mybatis中${}和#{}区别
此处要点是注意哪种能防止sql注入,为什么能防止sql注入。
10.线程池问题
问你用线程池引用哪个包。
和线程池关于几种概念:
最大容量:
一种线程池中最多可以保存线程数量;
最小容量:
一种线程池中,至少保存线程数量;
最大存活时间:
一种线程最多可以保持空闲时间;如果超过这个时间,普通这个线程就会被销毁;
线程某些面试问题要多理解。
11.Linux怎么查看文献内容前10行,怎么查看进程
Linux你必定不能说不懂得,说理解一点,然后她会问你某些惯用指令,因此要记住某些惯用指令。
有答不出来就说平时用不多,并且平时不会就会上网查。
1、Netstat–an|grep80查看端口信息
2、Vim中:
/内容直接搜索内容
3、Ps–ef|grepredis查看服务端口进程
4、servicenetworkrestart重启网络服务
5、tail-200fcatalina.log动态显示日记最后200行
6、head-n10catalina.log查看前10行命令
7、tar-zcvfabc.tar.gz*压缩当前目录下所有文献,压缩后文献名为abc.tar.gz
tar-zxvfabc.tar.gz-C/usr/local/xixi/解压到指定目录中记得指定目录前面加–C
8、查找文献
查找是脚本文献(执行文献)whichfilename
查找是二进制文献(执行文献)whereis-bfilename
查找特定文献whereisfilename(运用数据库来查找)
12、eclipse快捷键
Alt+Shift+M任意选中一块代码,自动转换为办法,自动添加参数返回类型。
ctrl+shift+x转为大写ctrl+shift+y转为小写
13、hashmap和hashtable区别
|----:
HashMap:
是开发中使用最多一种map集合类;在它底层使用哈希表保存数据(数据是无序);它键和值容许使用null;是线程不安全;
|---:
LinkedHashMap:
是HashMap子类,重要操作和HashMap同样;不同是,在底层使用哈希表和链表保存数据,哈希表负责保存数据和维护数据唯一性,链表负责记录数据添加顺序;因此它和HashMap不同之处是,它数据是有序(添加和迭代顺序同样);
事实上,在HashSet底层就是使用HashMap实现;LinkedHashSet底层使用是LinkedHashMap实现;
|----:
HashTable:
浮现比较早,在JDK1.1版本就浮现;它重要操作和HashMap同样,不同之处在于,HashTable是线程安全,效率比较低;它不容许使用null做键或值;在实际开发中当前被HashMap取代;
|---:
Properties:
重要保存Key-Value集合,在开发中重要用来操作配备文献(文献中配备信息都是键值对形式)到IO流在学;
|----:
TreeMap:
底层使用二叉树实现,它保存数据,在保存时候键都是有序;
此处还问了一种课堂没讲过实现类可取代hashTable,它是ConcurrentHashMap,这个自己可做下理解。
ConcurrentHashMap与HashTable都可以用于多线程环境,但是当Hashtable大小增长到一定期候,性能会急剧下降,由于迭代时需要被锁定很长时间。
由于ConcurrentHashMap引入了分割(segmentation),无论它变得多么大,仅仅需要锁定map某个某些,而其他线程不需要等到迭代完毕才干访问map。
简而言之,在迭代过程中,ConcurrentHashMap仅仅锁定map某个某些,而Hashtable则会锁定整个map。
HashTable虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者迭代器一致性不同,HashTable迭代器是强一致性,而ConcurrentHashMap是弱一致。
ConcurrentHashMapget,clear,iterator都是弱一致性。
14、ArrayList怎么去重
巧妙运用hashSet不能存储重复元素原理,把arrayList放到hashSet中再放回arrayList即可。
15、说说垃圾解决机制
大体理解,能说出一点即可
当前使用Java虚拟机并不是只是使用一种内存回收机制,而是分代收集算法。
就是将内存依照对象存活周期划分为几块。
普通是把堆分为新生代、和老年代。
短命对象存储在新生代中,长命对象放在老年代中。
对于不同代,采用不同收集算法:
新生代:
由于存活对象相对比较少,因而可以采用复制算法该算法效率比较快。
老年代:
由于存活对象比较多哈,可以采用标记-清除算法或是标记-整顿算法
16、与否写过mysql存储过程
mysql执行语句是要先编译,然后再执行。
这样如果查询并发大时候。
会挥霍诸多资源和时间。
导致mysql进程占用资源过多,症状就是慢。
但存储过程可以把某些特别语句封装成一种办法,再编译好成一种可以执行办法,对外只要接受参数就可以了。
这样就不用再编译。
执行就快了
什么时候会用到?
你觉得你数据库由于同步浮现太多读写操作而变得慢,那么就要用了。
17、JDBC底层环节
18、Jvm机制及类加载过程
栈区,堆区,办法区
类加载顺序:
类加载时先在办法区中为类开辟一种空间,非静态成员加载到非静态区域,静态成员加载到静态区域,为静态成员变量分派空间并赋默认值,然后执行静态代码块或显示赋值,赋值完毕类加载结束。
对象创立过程:
遇到new核心字在堆中开辟一种空间,为非静态成员变量分派空间并赋默认值,执行构造函数先看有无this语句调用其她构造函数,没有就执行隐式三步:
1、执行父类构造函数,2、为非静态成员变量显示赋值,3、执行构造代码块。
结束后执行构造函数体中内容,执行完对象创立结束。
19、抽象类和接口区别
共同点:
都可以有抽象函数,都不能被实例化。
区别:
声明上:
抽象类,class;接口interface
书写成员:
抽象类,书写任何类成员;接口:
只能书写成员变量和函数
有无构造函数:
抽象类,有构造函数;接口:
没有构造函数。
作用上:
抽象类是描述继承体系中共同特性和行为,如果行为不拟定,就定义为抽象函数;接口描述是不属于继承体系共同功能;接口可以用来定义规则。
继承关系上:
抽象类:
单一继承,多重继承;接口:
多继承,多实现。
项目方面
我简历上写得我在项目中承担模块是订单模块和购物车模块,因此自己模块一定要弄清晰。
弄清晰有关技术在你承担模块中运用。
1.购物车模块中未登录状态下把商品放入redis中,那这个key怎么设立?
此处要弄清晰怎么通过cookie来找到相应redis中相应数据。
要懂得一种顾客不同步间在未登录状态下添加商品怎么和之前已经添加进行联系。
顾客未登录,购物车商品保存在cookie,由于cookie对存储数据大小有限制
解决方案:
将数据保存到redis快在cookie中保存一种key,这个key同步关联rediskey
每次取值都经历了转换成List然后遍历,找到相应商品这个过程
rediskeyfield(商品id)value(购物车商品值)
顾客cookie_key=1212101redis_key=REDIS_1212101
2.Httpclient在项目中运用。
用于系统之间接口调用。
3.Redis和rabbitMq在项目中体现。
redis用于缓存,减少与数据库不必要连接次数。
RabbitMq用于修改数据库时及时告知redis更新里面数据。
4.项目中定期模块QuartZ运用。
订单失效时就运用到了定期任务,指定期间未付款自动失效。
Quartz 是一种开源作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。
它提供了巨大灵活性而不牺牲简朴性。
你可以用它来为执行一种作业而创立简朴或复杂调度。
1、Job
表达一种任务(工作),要执行详细内容。
2、JobDetail
JobDetail表达一种详细可执行调度程序,Job是这个可执行程调度程序所要执行内容,此外JobDetail还包括了这个任务调度方案和方略。
3、Trigger代表一种调度参数配备,什么时候去调。
4、Scheduler代表一种调度容器,一种调度容器中可以注册各种JobDetail和Trigger。
当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
5.订单支付模块怎么解决?
此时直接说我不负责支付模块,咱们有负责这个模块,咱们只要调用接口就行。
6.购物商城涉及到多线程吗?
必定设计到多线程,此时就是想问并发怎么解决。