1、常见的硬盘接口有哪些?
IED SCSI SATA SAS 光线通道
2、String的内部实现?
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
3、Hashtable和HashMap的区别?
1)都实现了Map接口,但是Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类
2)Hashtable中的方法都是synchronized(同步)的,而HashMap中的方法不是同步的
3)Hashtable类中包含contains、containsValue、containsKey等方法;而HashMap中只包含containsKey、containsValue方法,
去掉了contains方法
4)Hashtable的默认容量大小为11;HashMap的默认大小为16
5)hash值的使用不同,Hashtable直接使用key的key.hashCode();HashMap重新计算hash值hash(key.hashCode());
6)Hashtable不允许null的key或者value;HashMap允许null的键值对出现
7)Hashtable使用Enumerator迭代;而HashMap使用iterator迭代数据
4、gc的内部原理?
在垃圾回收器回收垃圾之前,我们先来了解一下Java分配对象的方式,Java的堆更像一个传送带,每分配一个新对象,它就往前移动一格。
这意味着对象存储空间的分配速度相当快。Java的“堆指针”只是简单地移动到尚未分配的领域。也就是说,分配空间的时候,“堆指针”
只管依次往前移动而不管后面的对象是否还要被释放掉。如果可用内存耗尽之前程序就退出就再好不过了,这样的话垃圾回收器压根就不会被激活。
但是由于“堆指针”只管依次往前移动,那么你肯定会想,总有一天内存会被耗尽,垃圾回收器就开始释放内存。这里有人肯定会问:
怎么判断某个对象该被回收呢?答案就是当堆栈或静态存储区没有对这个对象的引用时,就表示程序(员)对这个对象没有兴趣了,它就应该被回收了。
有两种方法来知道这个对象有没有被引用:第一种是遍历堆上的对象找引用;第二种是遍历堆栈或静态存储区的引用找对象。前者的实现叫做“引用计数法”,
意思就是当有引用连接至对象时,引用计数加1,当引用离开作用域或被置为null时,引用计数减1,这种方法有个缺陷,如果对象之间存在循环引用,
可能会出现“对象应该被回收,但引用计数却不为零”的情况。
Java采用的是后者,在这种方式下,Java虚拟机采用一种“自适应”的垃圾回收技术,如何处理找到的存活对象(也就是说不是垃圾),Java有两种方式:
一种是“停止-复制”:理论上是先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全是垃圾。
当对象被复制到新堆上时,它们是一个挨着一个的,所以新堆保持紧凑排列(这也是为什么分配对象的时候“堆指针”只管依次往前移动)。然后就可以按前述方法简单、
直接地分配内存了。这将导致大量内存复制行为,内存分配是以较大的“块”为单位的。有了块之后,垃圾回收器就可以不往堆里拷贝对象了,
直接就可以往废弃的块里拷贝对象了。
另一种是“标记-清扫”:它的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当它找到一个存活对象,就会给对象一个标记。
这个过程中不会回收任何对象。只有全部标记完成时,没有标记的对象将被释放,不会发生任何复制工作,所以剩下的堆空间是不连续的,然后垃圾回收器重新整理剩余的对象,
使它们是连续排列的。
当垃圾回收器第一次启动时,它执行的是“停止-复制”,因为这个时刻内存有太多的垃圾。然后Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,
就切换到“标记-清扫”方式;同样,Java虚拟机会跟踪“标记-清扫”效果,要是堆空间出现很多碎片,就会切换到“停止-复制”方式。这就是所谓的“自适应”技术。
其实仔细想一下,“停止-复制”和“标记-清扫”无非就是:“在大量的垃圾中找干净的东西和在大量干净的东西里找垃圾”。不同的环境用不同的方式,
这样做完全是为了提高效率,要知道,无论哪种方式,Java都会先暂停程序的运行,所以,垃圾回收器的效率其实是很低的。Java用效率换回了C++没有的垃圾回收器和
运行时的灵活,我认为这是明智的选择(虽然它只跟内存有关),随着硬件的飞速发展,我相信,开发时间要比运行效率重要得多
5、Collections的同步化操作原理?
在同步化一个集合或者map的时候,会默认的设置一个互斥对象mutex(默认为this就是我们需要同步的那个对象),
然后在所有的操作方法中都加上synchronized(mutex)以此来达到同步的目的。
6、类加载器?
类加载器(class loader)负责加载 Java 类的字节代码到 Java 虚拟机中,使java类可以动态的加载到虚拟机中执行。java使用java类的方式是:java源代码经过编译之后
得到的字节码文件(.class文件),类加载器负责读取.class文件并转化为一个class对象,通过对象的newInstance方法就可以得到类的实例。
所有的类加载器都是java.lang.ClassLoader类的子类,java.lang.ClassLoader的基本职责是找到或者生成类的字节码文件,还负责加载类所用到的资源文件。
java默认有三种类加载器:启动类加载器(Bootstrap)、扩展类加载器(ExtClassLoader)、系统类加载器(应用类加载器)(AppClassLoader);
其中启动类加载器负责加载jre下lib目录里所有的jar文件,与java虚拟机的启动有关,涉及到jvm的本地实现,一般很难得到启动类加载器的引用。
扩展类加载器负责lib/ext目录下的类库加载到内存中。
系统类加载器负责将classpath下的类加载到内存。
7、ArrayList与Vector的区别?
ArrayList和Vector内部是通过Object数组实现的,默认大小为10,
ArrayList增长大小为原来大小的1.5倍,而Vector增长大小为原来的2倍;动态增长是通过Arrays.copyOf的方法吧原来的数据复制到新的数组空间中。
8、ajax的执行过程?
1)得到页面数据
2)新建XMLHttpRequest对象(创建完成后readystate=0),需要针对IE6进行兼容控制(最好声明为全局变量,因为在回调函数中需要访问该对象)
3)注册回调函数
4)连接服务器open("get","url" , true)(readystate=1);其中true表示数据时异步交换。(如果使用post方式与服务器交互,需要自己设置协议头)
5)发送数据,send(data);可以将发送的内容防止在data中。
6)在回调函数中接受数据,xmlhttprequest.responseText;需要根据xmlhttprequest的状态(4:数据接收完成;200:服务器响应成功)。
ajax的状态:
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化) 对象已建立,尚未调用send方法
2 (发送数据) send方法已调用,但是当前的状态及http头未知
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
4 (完成) 数据接收完毕,此时可以通过通过responseXml和responseText获取完整的回应数据
9、Mysql索引的使用?
10、sql海量数据查找?
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
11、String中replace(char,char)和replaceAll(String,String)的区别?
两个方法都是将字符串中所有的符合条件的字符或者字符串替换为后面的字符或者字符串。
12、jdbc中执行存贮过程中的Statement是什么?
CallableStatement
13、名词解释?
LVS:可以实现LINUX平台下的简单负载均衡
QoS:服务质量,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术
AIO:Asynchronous Input/Output异步输入/输出
14、a^b<<2运算符优先级的问题?
等价于a^(b<<2),移位运算符的优先级比异或的优先级高。
15、100个字符串相加,如何提高效率?
不能使用字符串直接相加,应该使用stringbuffer的append方法来提高效率。
16、有A、B、C、D四个人,要在夜里过一座桥。
他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。
请问,如何安排,能够在17分钟内这四个人都过桥?
答案:A & B -->2 mins
1 mins <-- A
C & D -->10 mins
2 mins <-- B
A & B --> 2 mins
一共 2 + 1 + 10 + 2 + 2 = 17 mins
17、TCP/IP的体系结构?
网络接口层、网际层IP、运输层、应用层
18、TCP连接建立的三次握手?
第一次握手:客户端发送syn包(syn=j)到服务器。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
其中accept发生在第三次握手的时候。
19、用UDP协议通讯时怎样得知目标机是否获得了数据包?
可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。
发送方在发送数据时将此ID和发送时间记录在本地。
接收方在收到数据后将ID再发给发送方作为回应。
发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。
20、假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
思想:动态规划,某一秒的在线人数=前一秒的在线人数+这一秒登陆的用户数(或者是减去登出的用户数)
一天总共有 3600*24 = 86400秒。
定义一个长度为86400的整数数组int delta[86400],记录每秒登陆的用户数,如果为负数则表示这一秒中下线的人数比较多,每个整数对应这一秒的人数变化值,
可能为正也可能为负。开始时将数组元素都初始化为0。
然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。
这样处理一遍后数组中存储了每秒中的人数变化情况。
定义另外一个长度为86400的整数数组int online_num[86400],每个整数对应这一秒的论坛在线人数。
假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0] = delta[0]。第n+1秒的人数online_num[n] = online_num[n-1] + delta[n]。
这样我们就获得了一天中任意时间的在线人数。
21、从10G个数中找到中数,在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
不妨假设10G个整数是64bit的。2G内存可以存放256M个64bit整数。
我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。
这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。
如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。
如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围(256M=2^28,所以最多需要3次就可以将此范围缩小到1,也就找到了中数)。
22、两个整数集合A和B,求其交集
1)读取整数集合A中的整数,将读到的整数插入到map中,并将对应的值设为1。
2)读取整数集合B中的整数,如果该整数在map中存在并且值为1,则将此数加入到交集当中,并将在map中的对应值改为2。
23、找出1到10w中没有出现的两个数字
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?
申请10w个bit的空间,每个bit代表一个数字是否出现过。
开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。
然后依次读入已经打乱循序的数字,并将对应的bit设为1。
当处理完所有数字后,根据为0的bit得出没有出现的数字。
首先计算1到10w的和,平方和。
然后计算给定数字的和,平方和。
两次的到的数字相减,可以得到这两个数字的和,平方和。
所以我们有
x + y = n
x^2 + y^2 = m
解方程可以得到x和y的值。
24、有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?
最容易想到的就是用1000只小白鼠,每只喝一瓶。但显然这不是最好答案。
首先让我们换种问法,如果有x只小白鼠,那么24小时内可以从多少瓶水中找出那瓶有毒的?
由于每只小白鼠都只有死或者活这两种结果,所以x只小白鼠最大可以表示2^x种结果。如果让每种结果都对应到某瓶水有毒,那么也就可以从2^x瓶水中找到有毒的那瓶水。那如何来实现这种对应关系呢?
第一只小白鼠喝第1到2^(x-1)瓶,第二只小白鼠喝第1到第2^(x-2)和第2^(x-1)+1到第2^(x-1) + 2^(x-2)瓶....以此类推。
回到此题,总过1000瓶水,所以需要最少10只小白鼠。
25、给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?
unsigned int 的取值范围是0到2^32-1。我们可以申请连续的2^32/8=512M的内存,用每一个bit对应一个unsigned int数字。
首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即可。
26、1-20的两个数把和告诉A,积告诉B,A说不知道是多少, B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少?
2和3。理由是,A只根据一次B对答就判断出了,表明:和的组成 只有两组,同理B也一样.能分为两个组合的数字不多只有5,6 ,5,6都具有这样的特性,
当A看到了5时推测5=1+4/5=2+3,B回答不知道,A可以排除1+4的可能,因为1*4=4,(如果2*2=4两个2被认为是一个数时2*2是不合法的)B直接可以知道那两个数,
如果是2*3=6的话B很难推测是因为1*6=6还是2*3=6,所以A推测那俩数应该是2和3同理B推测1+6=7,7有三种组合(1,6/2,5/3,4)A不能只根据一次回答就判断,2+3=5,
5只有两种组合A是可以推断出来的故B根据A的回答也可以判断出答案2和3.6也具备这种特性推出答案是2和4
但是标准答案是2和3.
27、内部类的创建?
先创建外部类,在用外部类的实例创建内部类。Test1.Inner inner = new Test1().new Inner() ;内部类可以访问外部类的所有成员变量。
匿名内部类不能继承其他类,但是可以作为一个借口供别人使用。不是匿名内部类可以继承其它类。
static静态内部类不能访问外部类的非静态成员。
28、java中error、exception、runtimeexception的区别?
error:由java虚拟机生成并抛出,表示回复不是不可能,但是十分困难的严重问题,比如内存溢出。
runtimeexception:是exception的子类,程序运行时抛出而编译无法捕获的异常,可以不进行捕获。
exception:表示程序正常运行从来不会发生的一类情况,必须进行捕获。
29、Super s = new Sub() ;
System.out.println(s instanceof Sub);
System.out.println(s instanceof Super);
System.out.println(s.getClass() == Super.class);
System.out.println(s.getClass() == Sub.class);程序的输出结果是什么?
true
true
false
true
30、java语言中的函数参数传递只有值传递。
31、float f = 3.4 ;编译错误,精度丢失。必须强制类型转化。
32、<jsp:include page=""/>与<%@include file=""%>的区别?
<jsp:include page=""/>会检测野蛮是否发生了变化,适合动态文件的包含。
<%@include file=""%>不会检测文件的转变,适合静态的文件包含。
33、servlet中redirect和forward的区别?
redirect:页面重定向。URL地址栏内容发生变化,当需要跳转到外部服务器页面时必须使用redirect
forward:服务器重定向,URL地址栏内容不发生变化。
34、jdo是什么?
jdo是java数据存储的新规范,也是一个用于存取某种数据仓库中的对象的标准API,JDO提供了透明的对象存储,因此对开发人员来说,存储数据不需要额外的代码,
使开发人员解脱出来,将精力放在业务逻辑层,JDO更灵活,可以运行在任何低层数据层,可移植性更强。
35、Connection和Connections的区别?
Connection:java.util下的接口,他是素有集合类型的父接口
Connections:java.util下的类,它包含一系列静态方法负责集合的操作,比如排序、搜索、同步。
36、发送一封邮件的步骤?
1)创建一个javax.mail.Session;对象负责和邮件服务器的交互(创建session需要设置服务器信息,服务器的信息可以放在Properties对象中)
2)创建邮件对象import javax.mail.Message;创建邮件对象的时候需要Session对象。设置好邮件的内容和附加信息(例如:收件人,发件人,发送时间等等)。
3)根据Session对象得到一个发送器Transport,然后使用Transport连接服务器,最后调用sendMessage方法发送邮件
4)关闭transport,邮件发送结束。
37、JAXP是什么?
JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。
为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可以和具体实现DOM API、
SAX API 的各种XML解析器(XML Parser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理器(XSLT Processor,例如Apache Xalan)联合工作。
38、Comparable和Comparator接口的内部方法时什么?
Comparable:compareTo(T t);
Comparator:compare(T t1 , T t2);
39、匿名内部类不能继承其它类,但是可以作为一个接口供其它类实现。静态内部类的实例化可以不依赖外部类。
40、如何实现servlet的单线程模式?
<%@page isThreadSafe="false"%>
41、EJB中的三个对象?
三个对象是Remote(Local)接口、Home(LocalHome)接口、Bean类
42、EJB的几种类型?
会话bean、实体bean、消息驱动bean
会话bean又分为:有状态会话bean和无状态会话bean
实体bean分为Bean管理的实体bean(BMP)和容器管理的实体bean(CMP)
43、EJB中bean的声明周期?
对于StateLessSessionBean、EntityBean、MessageDrivenBean的生命周期一般在缓冲池中管理(EntityBean可以由bean自己管理)。对于StateFullSessionBean
是在Cache中管理,缓冲池中的bean创建之后不会从内存中消除。而是采用缓冲池调度算法不断的重用实例,而对于存在于cache中的bean则通过激活和去激活来保
存bean的状态和cache中bean的数量。
44、Remote接口和Home接口的作用?
remote接口定义了业务方法,Home接口定义了EJB容器中定义创建查找bean的方法。
45、客户端调用EJB的步骤?
1)设置JNDI服务工厂和服务地址系统属性
2)查找Home接口
3)从Home接口中调用create方法创建Remote接口
4)通过Remote接口调用其他业务方法。
46、同步和异步有什么区别?什么时候使用它们?
如果数据需要在线程间共享,例如正在写的数据可能被另外一个线程读到,则此时需要同步操作。
如果一个线程操作数据的时间比较长,此时需要进行异步操作。异步往往比同步效率更高。
47、servlet的生命周期?
可以使用load-on-startup标签来控制servlet何时被容器加载,当容器加载servlet的时候就会创建该servlet,然后调用init方法做一些初始化工作,然后调用父类
HttpServlet的service方法,service方法会根据客户端的请求方式(post/get)来判断调用子类的doPost或者是doGet方法。当需要销毁servlet的时候就调用servlet
的destroy方法。该servlet的生命周期结束。
48、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,
不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。
Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,
EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,
会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗
J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
49、EJB与java bean的区别?
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,
所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,
它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。
但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,
EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。
50、常见的runtimeexception?
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException,
ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException,
MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException,
RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
51、Set中的equals方法的作用?
equals方步不能判断两个set的内容是否相等。
如果给定对象也是一个 set,两个 set 的大小相等,并且给定 set 的每个成员都包含在此 set 中,则返回 true。这确保 equals 方法在 Set 接口的不同实现间正常工作。
此实现首先检查指定的对象是否是此 set;如果是,则返回 true。然后,它将检查指定的对象是否是一个大小与此 set 的大小相等的 set;如果不是,则返回 false。
如果是,则返回 containsAll((Collection) o)。
要判断两个set中的内容是否相同可以使用iterator进行迭代。判断迭代的内容是否相同。
52、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是
在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
53、J2EE是技术还是平台还是框架?
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
54、EJB规范规定EJB中禁止的操作有哪些?
1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),
2.不能操作awt,
3.不能实现服务器功能,
4.不能对静态属生存取,
5.不能使用IO操作直接存取文件系统,
6.不能加载本地库.,
7.不能将this作为变量和返回,
8.不能循环调用。
55、EJB的激活机制
以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端
调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前
会调用对应的 ejbActive和ejbPassivate方法。
56、请对以下在J2EE中常用的名词进行解释(或简单描述)
web 容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。
例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率
的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速
查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP: (Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,
我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
57、游标的作用,如何判断游标已经到了最后?
游标是用于定位结果集的行,通过全局变量@@FETCH_STATUS的状态可以知道游标是否到了最后,通常此变量不等于0表示出错或者到了最后。
保持更新中......