JAVA模拟面试题库完整Word下载.docx
《JAVA模拟面试题库完整Word下载.docx》由会员分享,可在线阅读,更多相关《JAVA模拟面试题库完整Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
6.抽象类和接口的区别
1).抽象类可以有构造方法,接口中不能有构造方法。
2).抽象类中可以有普通成员变量,接口中没有普通成员变量
3).抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的
普通方法。
4).抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为
publicabstract类型。
5).抽象类中可以包含静态方法,接口中不能包含静态方法
6).抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,
但接口中定义的变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。
7).一个类可以实现多个接口,但只能继承一个抽象类。
7.Java中应该使用什么数据类型来代表价格?
如果不是特别关心存和性能的话,使用BigDecimal,否则使用预定义精度的double类型。
8.静态变量和实例变量的区别?
在语法定义上的区别:
静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
9.、final,finally,finalize的区别。
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
JVM不保证此方法总被调用
10.sleep()和wait()有什么区别?
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。
wait是指在一个已经进入了同步锁的线程,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。
如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
11.HashMap和Hashtable的区别
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
就HashMap与HashTable主要从三方面来说。
一.历史原因:
Hashtable是基于旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
12.jsp有哪些置对象?
作用分别是什么?
分别有什么方法?
答:
JSP共有以下9个置的对象:
request用户端请求,此请求会包含来自GET/POST请求的参数
response网页传回用户端的回应
pageContext网页的属性是在这里管理
session与请求有关的会话期
applicationservlet正在执行的容
out用来传送回应的输出
configservlet的构架部件
pageJSP网页本身
exception针对错误网页,未捕捉的例外
13.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。
JSP编译后是"
类servlet"
。
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。
14.get与post之间的区别:
1>
请求参数的存放位置:
get:
在url后面用?
拼接
post:
参数放在请求数据包请体部分。
2>
参数的数据量大小:
传递数据量大小有限制
理论上没有限制,存放在实体部分
3>
安全性:
相对不安全
相对安全
4>
编码相关:
不适合传递中文参数
post:
适合传递中文参数
15.同步和异步有何异同,在什么情况下分别使用他们?
举例说明。
如果数据将在线程间共享。
例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
16.说说你写程序时经常碰到那些异常,什么原因产生的?
你是怎么解决的!
17.Servlet当中如何获取到jsp的9个隐含对象!
JspFactoryjf=JspFactory.getDefaultFactory();
//PageContextpageContext=jf.getPageContext(
//this,request,response,null,false,
//JspWriter.DEFAULT_BUFFER,true);
18.问题:
Servlet是如何工作的?
Servlet如何实例化、共享变量、并进行多线程处理?
假设我有一个运行了大量
Servlet
的web服务器。
通过
之间传输信息得到
上下文,并设置session变量。
现在,如果有两名或更多使用者向这个服务发送请求,接下来session变量会发生什么变化?
究竟是所有用户都是用共同的变量?
还是不同的用户使用的变量都不一样?
如果是后者,服务器如何区分不同用户?
另一个相似的问题,如果有
*n*
名用户访问一个特定的
Servlet,那么该
是仅在第一个用户首次访问的时候实例化,还是分别为每个用户实例化?
回答(BalusC):
ServletContext
当Servlet容器(比如ApacheTomcat)启动后,会部署和加载所有web应用。
当web应用被加载,Servlet容器会创建一次
ServletContext,然后将其保存在服务器的存中。
web应用的
web.xml
被解析,找到其中所有
servlet、filter
和
Listener
或
WebServlet、WebFilter
和WebListener
注解的容,创建一次并保存到服务器的存中。
对于所有过滤器会立即调用
init()。
当Servlet容器停止,将卸载所有web应用,调用所有初始化的Servlet和过滤器的
destroy()
方法,最后回收
ServletContext
和所有
Servlet、Filter与
实例。
当问题中的
配置的
load-on-startup
或者
WebServlet(loadOnStartup)
设置了一个大于0的值,则同样会在启动的时候立即调用
init()
方法。
“load-on-startup”中的值表示那些Servlet会以相同顺序初始化。
如果配置的值相同,会遵循
中指定的顺序或
WebServlet
类加载的顺序。
另外,如果不设置“load-on-startup”值,init()
方法只在第一次HTTP请求命中问题中的Servlet时才被调用。
HttpServletRequest与HttpServletResponse
Servlet容器附加在一个web服务上,这个web服务会在某个端口号上监听HTTP请求,在开发环境中这个端口通常为8080,生产环境常为80。
当客户端(web浏览器)发送了一个HTTP请求,Servlet容器会创建新的
HttpServletRequest
HttpServletResponse
对象,传递给已创建好并且请求的URL匹配
url-pattern
的
Filter
实例中的方法,所有工作都在同一个线程中处理。
request对象可以访问所有该HTTP请求中的信息,例如requestheader和requestbody。
response对象为你提供需要的控制和发送HTTP响应方法,例如设置header和body(通常会带有JSP文件中的HTML容)。
提交并完成HTTP响应后,将回收request和response对象。
HttpSession
当用户第一次访问该web应用时,会通过
request.getSession()
第一次获得HttpSession。
之后Servlet容器将会创建
HttpSession,生成一个唯一的ID(可以通过
session.getId()
获取)并储存在服务器存中。
然后Servlet容器在该次HTTP响应的
Set-Cookie
头部设置一个
Cookie,以
JSESSIONID
作为Cookie名字,那个唯一的sessionID作为
Cookie
的值。
按照HTTPcookie规则(正常web浏览器和web服务端必须遵循的标准),当cookie有效时,要求客户端(浏览器)在后续请求的
头中返回这个cookie。
使用浏览器置的HTTP流量监控器,你可以查看它们(在Chrome、Firefox23+、IE9+中按F12,然后查看Net/Network标签)。
Servlet容器将会确定每个进入的HTTP请求的
头中是否存在名为JSESSIONID
的cookie,然后用它的值(sessionID)从服务端存中找到关联的
HttpSession。
你可以在
中设置
session-timeout
,默认值为30分钟。
超时到达之前
HttpSession
会一直存活。
所以当客户端不再访问该web应用超过30分钟后,Servlet容器就会回收这个session。
后续每个请求,即使指定cookie名称也不能再访问到相同的session。
Servlet容器会创建一个新的
Cookie。
另一方面,客户端上的sessioncookie有一个默认存活时间,该事件和该浏览器实例运行时间一样长。
所以,当客户端关闭该浏览器实例(所有标签和窗口)后,这个session就会被客户端回收。
新浏览器实例不再发送与该session关联的cookie。
一个新的
将会返回新的
并设置一个拥有新
session
ID的cookie。
概述
与web应用存活时间一样长。
它被所有session中的所有请求共享。
只要客户端一直与相同浏览器实例的web应用交互并且没有超时,HttpSession就会存在。
的存活时间为客户端发送完成到完整的响应(web页面)到达的这段时间。
不会被其他地方共享。
所有Servlet、Filter
对象在web应用运行时都是活跃的。
它们被所有session中的请求共享。
你设置在
HttpServletRequest、HttpServletResponse
中的所有属性在问题中的对象存活时都会一直保持存活。
线程安全
即便如此,你最关心的可能是线程安全。
你现在应该学习到Servlet和filter被所有请求共享。
那是Java的一个优点,使得多个不同线程(读取HTTP请求)可以使用同一个实例。
否则为每个请求重新创建线程的开销实在过于昂贵。
但你应该也意识到永远不要将任何request或session域中的数据赋值给servlet或filter的实例变量。
它将会被所有其他session中的所有请求共享。
那是非线程安全的!
19.LinkedList和ArrayList的区别
LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样。
它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向串列(doublyLinkedList)。
ArrayList更受欢迎,很多场景下ArrayList比LinkedList更为适用。
这篇文章中我们将会看看LinkedeList和ArrayList的不同,而且我们试图来看看什么场景下更适宜使用LinkedList,而不用ArrayList。
LinkedList和ArrayList的区别
LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。
如果你很熟悉Array和LinkedList,你很容易得出下面的结论:
1)因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。
Array获取数据的时间复杂度是O
(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2)相对于ArrayList,LinkedList插入是更快的。
因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O
(1)。
ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。
3)类似于插入数据,删除数据时,LinkedList也优于ArrayList。
4)LinkedList需要更多的存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。
什么场景下更适宜使用LinkedList,而不用ArrayList
我前面已经提到,很多场景下ArrayList更受欢迎,但是还有些情况下LinkedList更为合适。
譬如:
1)你的应用不会随机访问数据。
因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2)你的应用更多的插入和删除元素,更少的读取数据。
因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
以上就是关于ArrayList和LinkedList的差别。
你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayList。
ArrayList很快,也很容易使用。
但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小。
20.为什么接口要规定成员变量必须是publicstaticfinal的呢?
首先接口是一种高度抽象的"
模版"
,,而接口中的属性也就是’模版’的成员,就应当是所有实现"
的实现类的共有特性,所以它是publicstatic的,是所有实现类共有的.假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?
其次,接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别?
又接口是一种更高层面的抽象,是一种规、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规化的作用。
所以接口中的属性必然是final的。
最后,接口只是对事物的属性和行为更高层次的抽象。
对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则(Open-ClosedPrinciple)的一种体现。
21.遍历一个List有哪些不同的方式?
使用哪种方式更加线程安全?
1)for-each(增强for循环)
2)迭代器遍历(线程更加安全)
22.Array和ArrayList有何区别?
什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比List<
List<
>
更容易。
23.创建线程有几种不同的方式?
你喜欢哪一种?
为什么?
有三种方式可以用来创建线程:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。
在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。
同时,线程池也是非常高效的,很容易实现和使用。
24.什么是死锁(deadlock)?
如何避免deadlock?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。
结果就是两个进程都陷入了无限的等待中。
使用多线程的时候,一种非常简单的避免死锁的方式就是:
指定获取锁的顺序,并强制线程按照指定的顺序获取锁。
因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
25.在System.out.println()里面,System,out,println分别是什么