ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:29.92KB ,
资源ID:7510239      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7510239.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JAVA模拟面试题库完整.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

JAVA模拟面试题库完整.docx

1、JAVA模拟面试题库完整JAVA基础部分1. 我们能不能声明main()方法为非静态?不能,main()方法必须声明为静态的,这样JVM才可以调用main()方法而无需实例化它的类。如果从main()方法去掉“static”这个声明,虽然编译依然可以成功,但在运行时会导致程序失败。2.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在Java 7之前,你可以通过使用静态初始化运行Java类。但是,从Java 7开始就行不通了。3. String类为什么是final的。主要是为了“效率”和“安全性”的缘故。若String允许被继承,由于它的高度被使用率,可能会降低程

2、序的性能,所以String被定义成final;4.使用final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的容还是可以改变的。5. string、stringbuilder、stringbuffer区别a.可变与不可变String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。private final char value;StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在Abst

3、ractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。char value;b.是否多线程安全String中的对象是不可变的,也就可以理解为常量,显然线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的StringBuilder并没有对方法进行加同步锁,所以是非线程安全的c.StringB

4、uilder与StringBuffer共同点StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(.)。只是StringBuffer会在方法上加synchronized关键字,进行同步。最后,如果程序不是多线程的,那么使用Strin

5、gBuilder效率高于StringBuffer。6. 抽象类和接口的区别1).抽象类可以有构造方法,接口中不能有构造方法。2).抽象类中可以有普通成员变量,接口中没有普通成员变量3).抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。4). 抽象类中的抽象方法的访问类型可以是public,protected 和(默认类型,虽然eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是public 类型的,并且默认即为public abstract 类型。5). 抽象类中可以包含静态方法,接口中不能包含静态方法6). 抽象类和接口中都可以包含静态

6、成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认即为public static final 类型。7). 一个类可以实现多个接口,但只能继承一个抽象类。7. Java 中应该使用什么数据类型来代表价格?如果不是特别关心存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。8. 静态变量和实例变量的区别?在语法定义上的区别:静态变量前要加static 关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个

7、实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。9. 、final, finally, finalize 的区别。final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。部类要访问局部变量,局部变量必须定义成final 类型,例如,一段代码finally 是异常处理语句结构的一部分,表示总是执行。finalize 是Object 类的一个方法,在垃圾收集器执行的时候会

8、调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用10. sleep() 和wait() 有什么区别?sleep 就是正在执行的线程主动让出cpu,cpu 去执行其他线程,在sleep 指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep 方法并不会释放锁,即使当前线程使用sleep 方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait 是指在一个已经进入了同步锁的线程,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify 方法(n

9、otify 并不释放锁,只是告诉调用过wait 方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify 方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy 方法后增加一个等待和一些代码,看看效果),调用wait 方法的线程就会解除wait 状态和程序可以再次得到锁后继续向下运行。11. HashMap 和Hashtable 的区别HashMap 是Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map 接口,主要区别在于HashMap 允许空(null)键值(key),由于非线程安全,在只有一个线程访问

10、的情况下,效率要高于Hashtable。HashMap 允许将null 作为一个entry 的key 或者value,而Hashtable 不允许。HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey。因为contains方法容易让人引起误解。Hashtable 继承自Dictionary 类,而HashMap 是Java1.2 引进的Map interface 的一个实现。最大的不同是,Hashtable 的方法是Synchronize 的,而HashMap 不是,在多个线程访问Hashtable时,不需要自己为它的方

11、法实现同步,而HashMap 就必须为之提供外同步。Hashtable 和HashMap 采用的hash/rehash 算法都大概一样,所以性能不会有很大的差异。就HashMap 与HashTable 主要从三方面来说。一.历史原因:Hashtable 是基于旧的Dictionary 类的,HashMap 是Java 1.2 引进的Map 接口的一个实现二.同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,不是同步的三.值:只有HashMap 可以让你将空值作为一个表的条目的key 或value12. jsp 有哪些置对象?作用分别是什么? 分别有

12、什么方法?答:JSP 共有以下9 个置的对象:request 用户端请求,此请求会包含来自GET/POST 请求的参数response 网页传回用户端的回应pageContext 网页的属性是在这里管理session 与请求有关的会话期application servlet 正在执行的容out 用来传送回应的输出config servlet 的构架部件page JSP 网页本身exception 针对错误网页,未捕捉的例外13. JSP 和Servlet 有哪些相同点和不同点,他们之间的联系是什么?JSP 是Servlet 技术的扩展,本质上是Servlet 的简易方式,更强调应用的外表表达。

13、JSP 编译后是类servlet。Servlet 和JSP 最主要的不同点在于,Servlet 的应用逻辑是在Java 文件中,并且完全从表示层中的HTML 里分离开来。而JSP 的情况是Java 和HTML 可以组合成一个扩展名为.jsp 的文件。JSP 侧重于视图,Servlet 主要用于控制逻辑。14. get与post之间的区别:1请求参数的存放位置: get: 在url后面用?拼接 post: 参数放在请求数据包请体部分。2参数的数据量大小: get: 传递数据量大小有限制 post: 理论上没有限制, 存放在实体部分3安全性: get: 相对不安全 post: 相对安全4编码相关:

14、 get: 不适合传递中文参数post: 适合传递中文参数15. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。16.说说你写程序时经常碰到那些异常,什么原因产生的?你是怎么解决的!17. Servlet当中如何获取到jsp的9个隐含对象!JspFactory jf=JspFactor

15、y.getDefaultFactory();/ PageContext pageContext=jf.getPageContext(/ this, request, response,null,false, / JspWriter.DEFAULT_BUFFER, true);18. 问题:Servlet是如何工作的?Servlet 如何实例化、共享变量、并进行多线程处理?假设我有一个运行了大量Servlet的 web 服务器。通过Servlet之间传输信息得到Servlet上下文,并设置 session 变量。现在,如果有两名或更多使用者向这个服务发送请求,接下来 session 变量会发生什

16、么变化?究竟是所有用户都是用共同的变量?还是不同的用户使用的变量都不一样?如果是后者,服务器如何区分不同用户?另一个相似的问题,如果有*n*名用户访问一个特定的Servlet,那么该Servlet是仅在第一个用户首次访问的时候实例化,还是分别为每个用户实例化?回答(BalusC):ServletContext当 Servlet 容器(比如 Apache Tomcat)启动后,会部署和加载所有 web 应用。当web 应用被加载,Servlet 容器会创建一次ServletContext,然后将其保存在服务器的存中。web 应用的web.xml被解析,找到其中所有servlet、filter和L

17、istener或WebServlet、WebFilter和WebListener注解的容,创建一次并保存到服务器的存中。对于所有过滤器会立即调用init()。当 Servlet 容器停止,将卸载所有 web 应用,调用所有初始化的 Servlet 和过滤器的destroy()方法,最后回收ServletContext和所有Servlet、Filter 与Listener实例。当问题中的Servlet配置的load-on-startup或者WebServlet(loadOnStartup)设置了一个大于 0 的值,则同样会在启动的时候立即调用init()方法。“load-on-startup”中

18、的值表示那些 Servlet 会以相同顺序初始化。如果配置的值相同,会遵循web.xml中指定的顺序或WebServlet类加载的顺序。另外,如果不设置 “load-on-startup” 值,init()方法只在第一次 HTTP 请求命中问题中的 Servlet 时才被调用。HttpServletRequest 与 HttpServletResponseServlet 容器附加在一个 web 服务上,这个 web 服务会在某个端口号上监听 HTTP 请求,在开发环境中这个端口通常为 8080,生产环境常为 80。当客户端(web 浏览器)发送了一个 HTTP 请求,Servlet 容器会创建

19、新的HttpServletRequest和HttpServletResponse对象,传递给已创建好并且请求的 URL 匹配url-pattern的Filter和Servlet实例中的方法,所有工作都在同一个线程中处理。request 对象可以访问所有该 HTTP 请求中的信息,例如 request header 和 request body。response 对象为你提供需要的控制和发送 HTTP 响应方法,例如设置 header 和 body(通常会带有 JSP 文件中的 HTML 容)。提交并完成HTTP 响应后,将回收 request 和 response 对象。HttpSession

20、当用户第一次访问该 web 应用时,会通过request.getSession()第一次获得 HttpSession。之后 Servlet 容器将会创建HttpSession,生成一个唯一的 ID(可以通过session.getId()获取)并储存在服务器存中。然后 Servlet 容器在该次 HTTP 响应的Set-Cookie头部设置一个Cookie,以JSESSIONID作为 Cookie 名字,那个唯一的 session ID 作为Cookie的值。按照 HTTP cookie 规则(正常 web 浏览器和 web 服务端必须遵循的标准),当 cookie 有效时,要求客户端(浏览器)

21、在后续请求的Cookie头中返回这个 cookie。使用浏览器置的 HTTP 流量监控器,你可以查看它们(在 Chrome、Firefox23+、IE9+ 中按 F12,然后查看 Net/Network 标签)。Servlet 容器将会确定每个进入的 HTTP 请求的Cookie头中是否存在名为JSESSIONID的 cookie,然后用它的值(session ID)从服务端存中找到关联的HttpSession。你可以在web.xml中设置session-timeout,默认值为 30 分钟。超时到达之前HttpSession会一直存活。所以当客户端不再访问该 web 应用超过 30 分钟后,

22、Servlet 容器就会回收这个 session。后续每个请求,即使指定 cookie 名称也不能再访问到相同的 session。Servlet 容器会创建一个新的Cookie。另一方面,客户端上的 session cookie 有一个默认存活时间,该事件和该浏览器实例运行时间一样长。所以,当客户端关闭该浏览器实例(所有标签和窗口)后,这个 session 就会被客户端回收。新浏览器实例不再发送与该 session 关联的 cookie。一个新的request.getSession()将会返回新的HttpSession并设置一个拥有新sessionID 的 cookie。概述ServletCo

23、ntext与 web 应用存活时间一样长。它被所有 session 中的所有请求共享。只要客户端一直与相同浏览器实例的web应用交互并且没有超时,HttpSession就会存在。HttpServletRequest和HttpServletResponse的存活时间为客户端发送完成到完整的响应(web 页面)到达的这段时间。不会被其他地方共享。所有 Servlet、Filter和Listener对象在 web 应用运行时都是活跃的。它们被所有 session 中的请求共享。你设置在HttpServletRequest、HttpServletResponse和HttpSession中的所有属性在问

24、题中的对象存活时都会一直保持存活。线程安全即便如此,你最关心的可能是线程安全。你现在应该学习到 Servlet 和 filter 被所有请求共享。那是 Java 的一个优点,使得多个不同线程(读取 HTTP 请求)可以使用同一个实例。否则为每个请求重新创建线程的开销实在过于昂贵。但你应该也意识到永远不要将任何 request 或 session 域中的数据赋值给 servlet 或 filter 的实例变量。它将会被所有其他 session 中的所有请求共享。那是非线程安全的!19.LinkedList和ArrayList的区别LinkedeList和ArrayList都实现了List接口,但

25、是它们的工作原理却不一样。它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向串列(doubly LinkedList)。ArrayList更受欢迎,很多场景下ArrayList比LinkedList更为适用。这篇文章中我们将会看看LinkedeList和ArrayList的不同,而且我们试图来看看什么场景下更适宜使用LinkedList,而不用ArrayList。LinkedList和ArrayList的区别LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。如果你很熟悉Array和LinkedList

26、,你很容易得出下面的结论:1) 因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。2) 相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插

27、入数组的尾部)。3) 类似于插入数据,删除数据时,LinkedList也优于ArrayList。4) LinkedList需要更多的存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。什么场景下更适宜使用LinkedList,而不用ArrayList我前面已经提到,很多场景下ArrayList更受欢迎,但是还有些情况下LinkedList更为合适。譬如:1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。2) 你的应用更多的插入和删

28、除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。以上就是关于ArrayList和LinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayList。ArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小。20. 为什么接口要规定成员变量必须是public static final的呢?首先接口是一种高度抽象的模版,,而接口中的属性也就是模版的成员,就应当是所有实现模版的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话

29、,因一个类可以继承多个接口,出现重名的变量,如何区分呢?其次,接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? 又接口是一种更高层面的抽象,是一种规、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规化的作用。所以接口中的属性必然是final的。最后,接口只是对事物的属性和行为更高层次的抽象 。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则(Open-Closed

30、 Principle )的一种体现。21. 遍历一个List有哪些不同的方式?使用哪种方式更加线程安全?1)for-each(增强for循环)2)迭代器遍历(线程更加安全)22. Array和ArrayList有何区别?什么时候更适合用Array?Array可以容纳基本类型和对象,而ArrayList只能容纳对象。Array是指定大小的,而ArrayList大小是固定的。Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。(1)如果列表的大小已经指定,大部分情况下是存储

31、和遍历它们。(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。(3)如果你要使用多维数组,使用比ListList更容易。23. 创建线程有几种不同的方式?你喜欢哪一种?为什么?有三种方式可以用来创建线程:继承Thread类实现Runnable接口应用程序可以使用Executor框架来创建线程池实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。24. 什么是死锁(deadlock)?如何避免deadlock?两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。25. 在System.out.println()里面,System, out, println分别是什么

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1