记录一次面试题

1、Spring中ioc的概念

提到ioc那就不得不提控制反转和依赖注入

控制反转:原本我们创建对象时需要调用对象的构造方法,手动进行对象创建,现在,我们将对象的创建销毁交由spring容器来做,它通过反射来创建对象,我们用完之后对对象进行销毁。

依赖注入:通常的业务模块都需要调用两个或两个以上的对象来完成业务逻辑,我们在完成我们的业务代码时,只需要通知spring在这里需要调用另一个对象的方法,spring就会像打针一样在这里注入依赖对象的实例,等待我们调用。对象注入的方式有三种:构造器注入,setter方法注入和接口注入

2、bena的默认作用范围

bean的作用范围取值有五种(scope属性控制):

singleton:单例,也是默认值

prototype:  多例,比如让Spring接管struts2的action的时候就必须配置此属性

request:  一次请求以及此次请求的转发

session: 作用范围是一次会话

globalsession:  作用范围是一次全局绘画,比如多台服务器之间需要共用同一个bean的时候就需要此属性。

扫描二维码关注公众号,回复: 6989840 查看本文章

默认是singleton,所以spring中对象默认是单例

3、索引的概念和作用,Mysql里主要的的索引结构,哈希索引和B+树索引比较

索引:是一个数据结构,用来快速访问数据库表格或者视图里的数据,需要存储空间。

作用:

①减少了数据检索的时间

②保证了数据的唯一性

③表与表之前的参照完整性

④减少了在分组、排序的检索时间

(1),INDEX(普通索引):ALTER TABLE 'table_name' ADD INDEX index_name('col')

最基本的索引,没有任何限制

(2),UNIQUE(唯一索引):ALTER TABLE 'table_name' ADD UNIQUE('col')

与“普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。

(3),PRIMARY KEY(主键索引):ALTER TABLE 'table_name' ADD PRIMARY KEY('col')

是一种特殊的唯一索引,不允许有空值。

(4),FULLTEXT(全文索引):ALTER TABLE 'table_name' ADD FULLTEXT('col')

仅可用于MyISAM和InoDB,针对较大的数据,生成全文索引很耗时耗空间

组合索引:ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3')

为了更多的提高mysql效率可建立组合索引,遵循“最左前缀”原则。创建复合索引应该将最常用(频率)做限制条件的列放在最左边,一次递减。组合索引最左字段用in是可以用到索引的。相当于建立了col1,col1col2,col1col2col3三个索引

建立索引之后查询会变快,对数据的增,删,改操作会变慢

hash索引:查询某一条记录时会很快,因为时hash结构散列分布,并且键-值对应。但是也应此它不用于范围查询和排序

B+树索引:B+Tree所有索引数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。这样做是为了提高区间效率,例如查询key为从18到49的所有数据记录,当找到18后,只要顺着节点和指针顺序遍历就可以以此向访问到所有数据节点,极大提高了区间查询效率。

4、线程创建方式,线程框架,线程池概念,线程池有哪些?线程池工厂有哪些线程池类型?线程池参数

(1)、继承Thread类

(2)、实现Runnable接口

(3)、实现Callable接口通过FutureTask包装器来创建Thread线

(4)、使用ExecutorService、Callable、Future实现有返回结果的线程

 多线程框架Executor,jdk1.5之后引入

线程池,是一种线程的使用模式,它为了降低线程使用中频繁的创建和销毁所带来的资源消耗与代价。
通过创建一定数量的线程,让他们时刻准备就绪等待新任务的到达,而任务执行结束之后再重新回来继续待命。

这就是线程池最核心的设计思路,「复用线程,平摊线程的创建与销毁的开销代价」。

相比于来一个任务创建一个线程的方式,使用线程池的优势体现在如下几点:

(1)、避免了线程的重复创建与开销带来的资源消耗代价

(2)、提升了任务响应速度,任务来了直接选一个线程执行而无需等待线程的创建

(3)、线程的统一分配和管理,也方便统一的监控和调优

线程池的实现天生就实现了异步任务接口,允许你提交多个任务到线程池,线程池负责选用线程执行任务调度。

Java通过Executors提供四种线程池,分别为:

[ newFixedThreadPool()方法 ]

该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变,当有一个新的任务提交时,线程池中若有空闲线程,则立即处理。

若没有空闲线程,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。

[ newSingleThreadExecutor()方法 ]

该方法返回一个只有一个线程的线程池。

若多多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出顺序执行任务。

[ newCachedThreadPool()方法 ]

该方法返回一个可具实际情况调整线程数量的线程池,线程池的线程数量不确定,但若有空闲线程可以复用,则会有优先使用而可以复用线程。若所有线程均在工作,又有新的任务提交,则会创建新的现场处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

[ newSingleThreadScheduledExecutor()方法 ]

该方法返回一个ScheduleExecutorService对象,线程池大小为1

ScheduleExecutorService接口在ExecutorService接口之上扩张了在给定时间执行某任务的功能,如:在某个固定的延时之后执行,或者周期性执行某个任务。

newScheduleThreadPool()方法 ]

该方法返回一个ScheduleExecutorService对象,但该线程池可以指定线程数量

int corePoolSize
核心线程数量,线程池将长期保证这些线程处于存活状态,即使线程已经处于闲置状态。除非配置了allowCoreThreadTimeOut将不会保证长期存活于线程池内,在闲置超过keepAliveTime后被销毁。

int maximumPoolSize
线程池内的最大数量,线程池内维护的线程不得超过该数量,大于核销线程数量小于最大线程数量的线程将在闲置超过keepAliveTime后被销毁。

long keepAliveTime
保证存活时间,若线程数超过了corePoolSize,线程闲置时间超过了保证存活时间,该线程将被销毁。另外unit指的是保活时间的单位。

BlockingQueue workQueue
阻塞队列,存放等待执行的任务,线程从workQueue中取任务,若无任务将阻塞等待。可以传入限制容量大小的队列或无限拓展队列。

ThreadFactory threadFactory
创建线程的工厂。

RejectedExecutionHandler handler
处理线程池及队列满载后的拒绝请求处理器。

猜你喜欢

转载自www.cnblogs.com/lm-book/p/11264770.html