前言:
本人就我自己在面试中遇到的一些问题做了一个总结,在面试过程中有的问题答上来了,有些回答的感觉不尽人意,有些的遇到的问题问我的一脸懵逼。所以写一个文档出来,以激励自己还有不足的地方,遇到一次不会,下次就不要不懂了,要有点进步。
1.哪些情况可以终止当前线程的运行/strong>
A、抛出一个例外时。
B、当该线程调用sleep()方法时。
C、当创建一个新线程时。
D、当一个优先级高的线程进入就绪状态时。
答案:AD
2.下面哪为构造函数的特性定义
A. 在类中声明构造函数时,名称须与类名相同
B. 具有重载特性,可以建立多个相同名称
C. 使用类建立新对象时,会自动执行构造函数,因此在构造函数内设定变量的初始值进行内存的分配
D. 以上都是
3.java关于异常处理机制的叙述哪些正确
A. catch部分捕捉到异常情况时,才会执行finally部分
B. catch部分捕捉到异常情况时,才会执行finally部分
C. 不论程序是否发生异常及捕获到异常,都会执行finally部分
D. 以上都是
答案:B C
4. 下列关于接口的叙述中哪些是错误的
a. 接口中的数据必须设定初值(就是接口中的常量)
b. 接口中的方法都是抽象方法
c. 接口可以声明引用Area
d. 以上都正确
答案:AD
5. Java语言中,方法的重写(Overriding)和重载(Overloading)是多态性的不同表现。下边哪些说法是对的选择两项)
A. 重写是父类与子类之间多态性的一种表现。
B. 重写是一个类中多态性的一种表现。
C. 重载是一个类中多态性的一种表现。
D. 重载是父类与子类之间多态性的一种表现。
答案:A C
6.方法可以进行servlet的调试/strong>
A、使用打印语句;在桌面计算机上运行服务器
B、使用Apache Log4J
C、使用IDE集成的调试器
D、直接查看HTML源码
E、返回错误页面给客户
答案:A B C D E
7.下面关于servlet的功用说法正确的有哪些/strong>
A、读取客户程序发来的显式数据
B、读取客户程序发来的隐式数据
C、生成相应的结果
D、发送显式的数据给客户程序
E、发送隐式的数据给客户程序
答案:A B C D E
8.下面关于session的用法哪些是错误的/strong>
A、HttpSession session = new HttpSession( );
B、String haha = session.getParameter(“haha” );
C、session.removeAttribute( “haha” );
D、session.set Attribute( “haha” );
答案:A B D
9.正则表达式(01|10|1001|0110)*与下哪个表达式一样
A、(0|1)*
B、(01|01)*
C、(01|10)*
D、(11|01)*
E、(01|1)*
答案:C
解释:因为1001,0110里面都包含01,故可省去
10.关于bean的说法不正确的有哪些/strong>
A、具备一个零参数(空)的构造函数(不是必须的)
B、不应有公开的实例变量(字段)
C、所有的属性必须通过getXxx和setXxxg来访问
D、布尔型的属性使用isXxx,而非getXxx
答案:B D
11.下面关于MVC说法错误的有哪些/strong>
A、必须使用复杂的框架
B、使用内建的RequestDispatcher能够很好地实现MVC
C、MVC影响整个系统的设计
D、我们可以用MVC来处理单个请求
答案:A C
12.下面那个Ruable接口的方法
A、run
B、start
C、yield
D、stop
答案:A
13.下面代码运行的结果是什么/strong>
A、编译失败
B、编译成功和程序打出“0”
C、编译成功和程序打出“1”
D、编译成功和程序打出“2”
答案:A
14.下列正确的有()
A、call by value 不会改变实际参数的数值
B、call by reference 能改变实际参数的参考地址
C、call by reference不能改变实际参数的参考地址
D、call by reference 能改变实际参数的内容
答案:ACD
15.执行如下程序代码:
A、0
B、1
C、-1
D、死循环
答案: 这道题只能根据选项来补全代码了,因为代码并不完整,变量a和c的类型没有声明。先来看a,如果a是有符 数,则循环只执行一次,再根据选项可知,c同样为有符 数,选C;如果a是无符 数,a=a-1,第一次循环过后,a变为可以表示的有效范围内的最大无符 数,继续执行循环直到减为0,c和a的初始值都为0,当循环结束时c被减了一圈,同样为0,可以选A。
1.Short s1=1;s1=s1+1;有什么错hort s1=1;s1+=1;有什么错/strong>
答案:对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将 告需要强制转换类型的错误。对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
2.Try{}里面有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候执行,在return前还是后/strong>
根据java规范:在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终
返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是
finally中的代码是必须要执行的,而且是在return前执行,除非碰到exit()。
jsp和servlet有哪些共同点和不同点,之间的联系又是什么/strong>
3.写个singleton出来
首先,单例模式是对象的创建模式之一,此外还包括工厂模式。单例模式的三个特点:
1,该类只有一个实例
2,该类自行创建该实例(在该类内部创建自身的实例对象)
3,向整个系统公开这个实例接口
Java中大概是这个样子
class Singleton {
//私有,静态的类自身实例
private static Singleton instance= new Singleton();
//私有的构造子(构造器,构造函数,构造方法)
private Singleton(){}
//公开,静态的工厂方法
public static SingletongetInstance() {
returninstance;
}
}
使用时
1 |
Singleton obj = Singleton.getInstance(); |
这个单例类在自身被加载时instance会被实例化,即便加载器是静态的。因此,对于资源密集,配置开销较大的单体更合理的做法是将实例化(new)推迟到使用它的时候。即惰性加载(Lazy loading),它常用于那些必须加载大量数据的单体。修改下
class LazySingleton {
//初始为null,暂不实例化
private static LazySingletoninstance = null;
//私有的构造子(构造器,构造函数,构造方法)
private LazySingleton(){}
//公开,静态的工厂方法,需要使用时才去创建该单体
public static LazySingleton getInstance(){
if(instance == null ) {
instance= new LazySingleton();
}
returninstance;
}
}
使用方式同上。
单例模式是Javascript最基本,最有用的模式之一。它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。
单体在Javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。还可以用在分支技术中用来处理各浏览器的差异。
Javascript中单例模式的实现方式有多种,每一种都有自身的优点或缺点。
1,对象直接量实现最基本,最简单的单体
var Singleton = {
attr1 : 1,
attr2 : ‘hello’,
method1 :function(){alert(this.attr2);},
method2 : function(arg){}
}
这种方式中,对象所有成员都通过Singleton加点 访问。所有成员是公开的,没有私有的。在执行到变量Singleton时,会加载(实例化)自身,即非惰性加载。
此外method1用this访问单体的其它成员会存在一些风险,因为method1的上下文不是总是指向Singleton对象。
比如当把method1作为事件监听器时,this可能指向的是dom元素,这时可能会提示undefined。
2,闭包实现私有成员的单体
var Singleton = function(){
var attr = 1, fn = function(){};
return {
method :function(){ fn(); },
getAttr :function(){ return attr; }
};
}();
这种方式中var定义私有的成员属性attr,方法fn,然后返回一个公开的接口method和getAttr。今后修改实现时,接口方法method和getAttr不变,只需修改私有的attr和fn的具体实现。使用如下
1 2 |
Singleton.method(); Singleton.getAttr(); |
3,闭包实现私有成员的惰性实例化单体
var LazySingleton = function(){ var attr = 1, fn = function(){}; var obj = { method : function(){ fn(); }, getAttr : function(){ return attr; } }; function init(){ return obj; } return {getInstace: init}; }(); |
适用场合上面已经提到:对于那些必须加载大量数据的单体直到需要使用它的时候才实例化。使用方式是这样的
LazySingleton.getInstance().method(); LazySingleton.getInstance().getAttr(); |
4,又发现另一种
function singleton() {
var obj = new Object();
singleton = function() {
returnobj;
};
return obj;
}
仅在第一次时会new,这个Object泛指自定义的所有类。
4.不许用中间变量,把字符品“ABCD”倒过来
5.Sql中,有int,string,data字段三个类型,都加索引好么
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。
1.1 什么是索引/strong>
SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间
下面举两个简单的例子:
字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引.
1.2 索引的存储机制
首先,无索引的表,查询时,是按照顺序存续的方法扫描每个记录来查找符合条件的记录,这样效率十分低下,举个例子,如果我们将字典的汉字随即打乱,没有前面的按照拼音或者部首查询,那么我们想找一个字,按照顺序的方式去一页页的找,这样效率有多底,大家可以想象。
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是具有连续性的,a后面就是b,b后面就是c, 聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引。
原理明白了,那他们是怎么存储的呢这里简单的说一下,聚集索引就是在数据库被开辟一个物理空间存放他的排列的值,例如1-100,所以当插入数据时,他会重新排列整个整个物理空间,而非聚集索引其实可以看作是一个含有聚集索引的表,他只仅包含原表中非聚集索引的列和指向实际物理表的指针。他只记录一个指针,其实就有点和堆栈差不多的感觉了
1.3 什么情况下设置索引
动作描述 |
使用聚集索引 |
使用非聚集索引 |
外键列 |
应 |
应 |
主键列 |
应 |
应 |
列经常被分组排序(order by) |
应 |
应 |
返回某范围内的数据 |
应 |
不应 |
小数目的不同值 |
应 |
不应 |
大数目的不同值 |
不应 |
应 |
频繁更新的列 |
不应 |
应 |
频繁修改索引列 |
不应 |
应 |
一个或极少不同值 |
不应 |
不应 |
建立索引的原则:
1) 定义主键的数据列一定要建立索引。
2) 定义有外键的数据列一定要建立索引。
3) 对于经常查询的数据列最好建立索引。
4) 对于需要在指定范围内的快速或频繁查询的数据列;
5) 经常用在WHERE子句中的数据列。
6) 经常出现在关键字order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。
7) 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8) 对于定义为text、image和bit的数据类型的列不要建立索引。
9) 对于经常存取的列避免建立索引
9) 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
10) 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用。
1.4 如何创建索引
1.41 创建索引的语法:
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name
ON {table_name | view_name} [WITH [index_property [,….n]]
说明:
UNIQUE: 建立唯一索引。
CLUSTERED: 建立聚集索引。
NONCLUSTERED: 建立非聚集索引。
Index_property: 索引属性。
UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。
1.42 删除索引语法:
DROP INDEX table_name.index_name[,table_name.index_name]
说明:table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
1.43 显示索引信息:
使用系统存储过程:sp_helpindex 查看指定表的索引信息。
执行代码如下:
Exec sp_helpindex book1;
1.5 索引使用次数、索引效率、占用CPU检测、索引缺失
当我们明白了什么是索引,什么时间创建索引以后,我们就会想,我们创建的索引到底效率执行的怎么样不好们创建的对不对/p>
首先我们来认识一下DMV,DMV (dynamic management view)动态管理视图和函数返回特定于实现的内部状态数据。推出SQL Server 2005时,微软介绍了许多被称为dmvs的系统视图,让您可以探测SQL Server 的健康状况,诊断问题,或查看SQL Server实例的运行信息。统计数据是在SQL Server运行的时候开始收集的,并且在SQL Server每次启动的时候,统计数据将会被重置。当你删除或者重新创建其组件时,某些dmv的统计数据也可以被重置,例如存储过程和表,而其它的dmv信息在运行dbcc命令时也可以被重置。
当你使用一个dmv时,你需要紧记SQL Server收集这些信息有多长时间了,以确定这些从dmv返回的数据到底有多少可用性。如果SQL Server只运行了很短的一段时间,你可能不想去使用一些dmv统计数据,因为他们并不是一个能够代表SQL Server实例可能遇到的真实工作负载的样本。另一方面,SQL Server只能维持一定量的信息,有些信息在进行SQL Server性能管理活动的时候可能丢失,所以如果SQL Server已经运行了相当长的一段时间,一些统计数据就有可能已被覆盖。
因此,任何时候你使用dmv,当你查看从SQL Server 2005的dmvs返回的相关资料时,请务必将以上的观点装在脑海中。只有当你确信从dmvs获得的信息是准确和完整的,你才能变更数据库或者应用程序代码。
下面就看一下dmv到底能带给我们那些好的功能呢/p>
1.51 :索引使用次数
我们下看一下下面两种查询方式返回的结果(这两种查询的查询用途一致)
①—-
declare @dbid int
select @dbid = db_id()
select objectname=object_name(s.object_id), s.object_id, indexname=i.name, i.index_id
, user_seeks, user_scans, user_lookups, user_updates
from sys.dm_db_index_usage_stats s,
sys.indexes i
where database_id = @dbid and objectproperty(s.object_id,’IsUserTable’) = 1
and i.object_id = s.object_id
and i.index_id = s.index_id
order by (user_seeks + user_scans + user_lookups + user_updates) asc
返回查询结果
user_seeks : 通过用户查询执行的搜索次数。
个人理解: 此统计索引搜索的次数
user_scans: 通过用户查询执行的扫描次数。
个人理解:此统计表扫描的次数,无索引配合
user_lookups: 通过用户查询执行的查找次数。
个人理解:用户通过索引查找,在使用RID或聚集索引查找数据的次数,对于堆表或聚集表数据而言和索引配合使用次数
user_updates: 通过用户查询执行的更新次数。
个人理解:索引或表的更新次数
我们可以清晰的看到,那些索引用的多,那些索引没用过,大家可以根据查询出来的东西去分析自己的数据索引和表
1.52 :索引提高了多少性能
新建了索引到底增加了多少数据的效率呢底提高了多少性能呢行如下SQL可以返回连接缺失索引动态管理视图,发现最有用的索引和创建索引的方法:
SELECT
avg_user_impact AS average_improvement_percentage,
avg_total_user_cost AS average_cost_of_query_without_missing_index,
‘CREATE INDEX ix_’ + [statement] +
ISNULL(equality_columns, ‘_’) +
ISNULL(inequality_columns, ‘_’) + ‘ ON ‘ + [statement] +
‘ (‘ + ISNULL(equality_columns, ‘ ‘) +
ISNULL(inequality_columns, ‘ ‘) + ‘)’ +
ISNULL(‘ INCLUDE (‘ + included_columns + ‘)’, ”)
AS create_missing_index_command
FROM sys.dm_db_missing_index_details a INNER JOIN
sys.dm_db_missing_index_groups b ON a.index_handle = b.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats c ON
b.index_group_handle = c.group_handle
WHERE avg_user_impact > = 40
返回结果
执行时间最长的命令
SELECT TOP 10 COALESCE(DB_NAME(st.dbid),
DB_NAME(CAST(pa.value as int))+’*’,
‘Resource’) AS DBNAME,
SUBSTRING(text,
— starting value for substring
CASE WHEN statement_start_offset = 0
OR statement_start_offset IS NULL
THEN 1
ELSE statement_start_offset/2 + 1 END,
— ending value for substring
CASE WHEN statement_end_offset = 0
OR statement_end_offset = -1
OR statement_end_offset IS NULL
THEN LEN(text)
ELSE statement_end_offset/2 END –
CASE WHEN statement_start_offset = 0
OR statement_start_offset IS NULL
THEN 1
ELSE statement_start_offset/2 END + 1
) AS TSQL,
total_logical_reads/execution_count AS AVG_LOGICAL_READS
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) pa
WHERE attribute = ‘dbid’
ORDER BY AVG_LOGICAL_READS DESC ;

看到了吗接可以定位到你的sql语句,优化去吧。还等什么呢/p>
1.54:缺失索引
缺失索引就是帮你查找你的数据库缺少什么索引,告诉你那些字段需要加上索引,这样你就可以根据提示添加你数据库缺少的索引了
SELECT TOP 10
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!