30道常见的JAVA面试题分享

程序员无bug 2018-05-08 08:40:10

1、servlet执行流程

客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。

2、对ajax的理解

a)Ajax为异步请求,即局部刷新技术,在传统的页面中,用户需要点击按钮或者事件触发请求,到刷新页面,而异步技术为不需要点击即可触发事件,这样使得用户体验感增强,比如商城购物车的异步加载,当你点击商品时无需请求后台而直接动态修改参数。

3、内部类与外部类的调用

a)内部类可以直接调用外部类包括private的成员变量,使用外部类引用的this.关键字调用即可

b)而外部类调用内部类需要建立内部类对象

4、多线程

a)一个进程是一个独立的运行环境,可以看做是一个程序,而线程可以看做是进程的一个任务,比如QQ是一个进程,而一个QQ窗口是一个线程。

b)在多线程程序中,多线程并发可以提高程序的效率,cpu不会因为某个线程等待资源而进入空闲状态,它会把资源让给其他的线程。

c)用户线程就是我们开发程序是创建的线程,而守护线程为系统线程,如JVM虚拟中的GC

d)线程的优先级别:每一个线程都有优先级别,有限级别高的可以先获取CPU资源使该线程从就绪状态转为运行状态。也可以自定义线程的有限级别

e)死锁:至少两个以上线程争取两个以上cpu资源,避免死锁就避免使用嵌套锁,只需要在他们需要同步的地方加锁和避免无限等待

5、HTTP协议

a)常用的请求方法有get、post

b)Get与post的区别:传送数据,get携带参数与访问地址传送,用户可以看见,这的话信息会不安全,导致信息泄露。而post则将字段与对应值封装在实体中传送,这个过程用户是不可见的。Get传递参数有限制,而post无限制。

6、事物的理解

a)事物具有原子性,一致性,持久性,隔离性

b)原子性:是指在一个事物中,要么全部执行成功,要么全部失败回滚。

c)一致性:事物执行之前和执行之后都处于一致性状态

d)持久性:事物多数据的操作是永久性

e)隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。

7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

8.hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

9.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同点:

·Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

·Array大小是固定的,ArrayList的大小是动态变化的。

·ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

·对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

·10.Java中Exception和Error有什么区别?

·

·Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

·

·11.throw和throws有什么区别?

·

·throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。

·

·12.异常处理的时候,finally代码块的重要性是什么?(译者注:作者标题的序号弄错了)

·

·无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。最后要说的是,finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接

·13.什么是Servlet?

·

·Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

·

·14.说一下Servlet的体系结构。

·

·所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程可以并行的为多个请求服务

·15.GenericServlet和HttpServlet有什么区别?

·

·GenericServlet是一个通用的协议无关的Servlet,它实现了Servlet和ServletConfig接口。继承自GenericServlet的Servlet应该要覆盖service()方法。最后,为了开发一个能用在网页上服务于使用HTTP协议请求的Servlet,你的Servlet必须要继承自HttpServlet。这里有Servlet的例子。

·

·16.解释下Servlet的生命周期。

·

·对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。

·

17.什么是cookie?session和cookie有什么区别?

cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:

· 无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。

· 在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。

18.JSP请求是如何被处理的?

浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求,然后,Web服务器读取这个请求,使用JSP编译器把JSP页面转化成一个Servlet类。需要注意的是,只有当第一次请求页面或者是JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用servlet类,处理浏览器的请求。一旦请求执行结束,servlet会把响应发送给客户端。这里看下如何在JSP中获取请求参数。

19.JSP有什么优点?

下面列出了使用JSP的优点:

· JSP页面是被动态编译成Servlet的,因此,开发者可以很容易的更新展现代码。

· JSP页面可以被预编译。

· JSP页面可以很容易的和静态模板结合,包括:HTML或者XML,也可以很容易的和产生动态内容的代码结合起来。

· 开发者可以提供让页面设计者以类XML格式来访问的自定义的JSP标签库。

· 开发者可以在组件层做逻辑上的改变,而不需要编辑单独使用了应用层逻辑的页面。

·20.接口和抽象类的区别是什么?

·从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

也可以参考JDK8中抽象类和接口的区别

·21.Java中的HashMap的工作原理是什么?

·我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:最左侧是一个数组,数组中的每一个元素都是一个链表,链表的每一个元素都是entry。

·HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

·22、访问修饰符public,private,protected,以及不写(默认)时的区别?

·答:区别如下:

·作用域 当前类 同包子类其他

·public √ √ √ √

·protected √ √ √ ×

·default √ √ × ×

·private √ × × ×

·类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

·23、int 和Integer 有什么区别

·答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper),int的包装类就是Integer,从JDK 1.5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

·Java 为每个原始类型提供了包装类型:

·原始类型: boolean,char,byte,short,int,long,float,double

·包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

·24、构造器(constructor)是否可被重写(override)

·答:构造器不能被继承,因此不能被重写,但可以被重载。

·25、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分

·答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

·26、静态变量和实例变量的区别?

·答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。在Java开发中,上下文类和工具类中通常会有大量的静态成员。

·31、String s=new String(“xyz”);创建了几个字符串对象?

·答:两个对象,一个是静态存储区的"xyz",一个是用new创建在堆上的对象。

·36、Java 中的final关键字有哪些用法?

·

·答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)

·49、列出一些你常见的运行时异常?

·答:

·ArithmeticException(算术异常)

·ClassCastException (类转换异常)

·IllegalArgumentException (非法参数异常)

·IndexOutOfBoundsException (下表越界异常)

·NullPointerException (空指针异常)

·SecurityException (安全异常)

·7、request.getParameter()和request.getAttribute()的区别?

·答:

·a、request.getParameter()获取的类型是String;

· request.getAttribute()获取的类型是Object

·b、request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;

· request.getAttribute()获取的是对象容器中的数据值/对象

·c、request.setAttribute()和request.getAttribute()可以发送、接收对象;

· request.getParamter()只能接收字符串,官方不开放request.setParamter()(也就是没有这个方法)

· setAttribute()和getAttribute()的传参原理:

· setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另外一个页面时,

· 应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过getAttribute()获取到相应的参数值或者对象。

·13、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

·答:JSP是Servlet的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类Servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是java和HTML可以组合成一个扩展名为.jsp的文件。JSP偏重于视图,Servlet偏重于业务逻辑。

·14、详细描述MVC。

·答:基于java的web应用系统采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前web应用服务系统的主流设置方向。

· Model:处理业务逻辑的模块。

· View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。

· Controller:负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户。

·20、JSP的四种范围?

·答:a、page是代表一个页面相关的对象和属性。一个页面由一个编译好的java servlet类(可以带有include指令,但不可以带有include动作)表示。这既包括servlet又包括编译成servlet的jsp页面。

· b、request是代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件(由于forware指令和include动作的关系)

· c、session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web回话也可以经常跨域多个客户机请求。

· d、application是代表与整个web应用程序相关的对象和属性。这实质上是跨域整个web应用程序,包括多个页面、请求和回话的一个全局作用域。

·30、JSP页面是如何被执行的?JSP执行效率比Servlet低吗?

·答:当客户端向一个JSP页面发出请求时,Web Container将JSP转换成Servlet的源代码(只是第一次请求时),然后编译转化后的Servlet并加载到内存中执行,执行的结果Response到客户端。

·JSP只在第一次执行的时候会转化为Servlet,以后的每次执行Web容器都是直接执行编译后的Servlet,所有JSP和Servlet只有第一次执行的时候不一样,JSP慢一点,以后的执行都是相同的。

为了让大家更加快速的掌握编程知识,大咖送我一套他收集整理五年的前端和后台(java,python都有)的资料,为了感谢大家一直以来对小编的支持,小编决定免费送给大家,希望大家在编程的路上越走越远,尽快实现50万的小目标!

领取资料方式:关注大鱼号,点小编头像进入主页即可看到“领取资料”!

1 阅读:676

程序员无bug

简介:技术交流,资源分享,生活趣事