Java基础面试题(一)
1.面向对象的特征
?
1)抽象
?
抽象就是忽略一个主题中与当前目标无关的那些方面,一边更充分地注意与目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
?
2)继承
?
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这个就是继承。继承是子类自动贡献父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
?
3)封装
?
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。
?
4)多态
?
多态是指程序中所定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。
?
2.Java的基本数据类型
?
byte, ?short, ?int, ?long, float, ?double, char, boolean
?
3.int和Integer有什么区别
?
Java提供两种不同类型:引用类型和原始类型。int是Java的原始数据类型,Integer是Java为int提供的封装类型。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
封装类型的实例变量的缺省值为null,而原始类型实例变量的缺省值跟他们的类型有关。
?
4.String和StringBuffer的区别
?
String类用来表示那些创建后就不会再改变的字符串。
StringBuffer类用来表示内容可变的字符串,并鼻孔了修改底层字符串的方法,当我们进行字符串拼接时使用。
?
5.StringBuffer和StringBuilder的区别
?
它们都是表示可变的字符串。StringBuffer是线程安全的,StringBulider是非线程安全的。两者方法基本相同,优先采用StringBuilder,在大多数的时候比StringBuffer快。StringBuilder一般使用在方法内部来完成字符串拼接功能,StringBuffer要用来全部变量中。
?
6.运行时异常与一般异常有何异同
?
Java一共了两类主要的异常:runtime exception和checked exception。我们经常遇到的IO异常以及SQL异常是checked exception,对于这些非运行时异常必须进行捕获或抛出。但并不要求对运行时异常进行处理,如NullPointerException,出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码块或Java虚拟机处理。运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
?
7.ArrayList,Vector,LinkedList的存储性能和特性
?
ArrayList和Vector都是使用数组方式存储数据,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差。
LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需记录本项的前后项即可,所以插入速度较快。
?
8.Collection和Collections的区别
?
Collection是集合类的上级接口,继承于他的接口主要有Set和List。
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
?
9.&和&&的区别
?
&和&&都有逻辑运算符and的功能,&还可以用作位运算符,&&具有短路功能,即如果第一个表达式为false,则不再计算第二个表达式的值。
?
10.HashMap和Hashtable的区别
?
HashMap是非线程安全的,Hashtable是线程安全的。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
?
11.final,finally,finalize的区别
?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是会执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
?
12.sleep()和wait()有什么区别
?
sleep()是Thread类的方法,在指定的毫秒数内让正在执行的线程暂停执行,把执行机会让给其他线程,到指定时间会自动恢复。调用sleep不会释放对象锁。
?
wait()是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify/notifyAll方法后,本线程才进入对象锁定池准备获得对象锁进入运行状态。
?
13.Overload和Override的区别。Overload的方法可以改变返回值的类型吗?
?
方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。
方法覆盖要求参数签名必须一致,而办法重载要求参数签名必须不一致。
方法覆盖要求返回类型必须一致,而方法重载不做限制。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法。
方法覆盖对方法的访问权限和抛出的异常有特殊要求,而方法重载没有限制。
父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。
?
方法重载可以改变返回值的类型。
?
14.error和exception有什么区别?
?
error表示恢复不是不可能但很困难的情况下的一种严重问题。比如内存溢出,不可能指望程序能处理这样的情况。
?
exception表示一种设计或实现问题。如果程序运行正常,从不会发生的情况。
?
15.同步和异步有何异同,在什么情况下分别使用他们?举例说明。
?
如果数据将在线程间共享,例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
?
16.abstract class和interface有什么区别?
?
声明方法的存在而不去实现他的类叫做抽象类。接口是抽象类的特例。接口中的所有方法都必须是抽象的,接口中的方法定义默认为public abstract。接口中的变量是全局常量,即public static修饰的。一个类可以实现多个接口,但只能继承一个抽象类。
?
17.heap和stack有什么区别
?
栈是一种线型集合,添加和删除的操作在同一端完成,按照后进先出的方式进行处理。堆是栈的一个组成元素。
?
18. Static Nested Class和Inner Class的不同。
?
Static Nestec Class是被声明为静态static的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
?
19.JSP中动态include与静态include的区别
?
动态include用jsp:include动作实现<jsp:include page="include.jsp" flush="true" />它总是检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
?
静态include用include伪码实现,不会检查所含文件的变化,适合包含静态页面<%@ include file="include.html" %>
?
20.GC是什么?为什么要有GC?
?
GC是垃圾回收的意思(Garbage Collection),内存处理是编程人员出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供自动垃圾回收机制,自动检测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。
?
21. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1+=1; 有什么错?
?
short s1 = 1; s1 = s1 + 1;// s1+1运算结果是int型,需要强制转换类型
short s1 = 1; s1 += 1;// 可以正确编译
?
22.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
?
Math.round(11.5)==12;Math.round(-11.5)==-11;
round方法返回与参数最接近的长整数,参数加1/2后求其floor。
?
23.Java中有没有goto?
?
goto在Java中作为保留字,但没有被使用。
?
24.String s = new String("xyz");创建了几个对象?
?
两个
?
25.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?
?
接口可以继承接口。
抽象类可以实现接口。
抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
?
26.List,Set,Map是否继承自Collection接口?
?
List,Set是,Map不是。
?
27.说出数据连接池的工作机制是什么?
?
J2EE服务器启动时会建立一定数据的池连接,并一直维持不少于此数目的池连接。客户端需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。
?
28.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
?
都不能。
?
29.数组有没有length()方法?String有没有length()方法?
?
数组没有length()方法,有length的属性。
String有length()方法。
?
30.Set里的元素是不能重复的,那么用什么方法来区分重复与否?是用==还是equals()他们有何区别?
?
Set里的元素是不能重复的,用equals()和hashCode()方法来区别是否重复。
equals()判断两个set是否相等。
==判断两个引用是否指向同一个对象。
?
Java里判断两个对象是否相等的过程:
先判断两个对象的hashcode是否相等,如果不相等,则认为两个对象也不相等;如果相等,再用equals方法判断是否相等。
?
所以Set元素是否重复,先用hashCode(),再用equals()判断,使用hashCode是为了提高效率。
?
31.forward和redirect的区别
?
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器送给的内容是从哪儿来的,所以它的地址栏还是原来的地址。
?
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
?
32.Servlet的生命周期
?
Servlet被服务器实例化后,容器运行其init()方法,请求到达时运行其service()方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy()方法。
?
33.构造器Constructor是否可被override?
?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
?
34.是否可以继承String类?
?
String类是final类,所以不能被继承。
?
35.switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
?
swtich(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是int、short、char或者byte。long,String都不能作用于switch。
?
36.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
?
会执行,在return前执行。
?
37.两个对象值相同x.equals(y) == true,但却可以不同的hash code,这句话对不对?
?
对。如果重写类的equals方法,没有重写类的hashCode方法,就会出现这样的情况。
?
38.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
?
值传递。Java里只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
?
39.char型变量中能不能存贮一个中文汉字?为什么?
?
能。Java中以unicode编码,一个char占2个字节,所以放一个中文是没问题的。
?
40.多线程有几种实现方法?同步有几种实现方法?
?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
同步的实现方面有两种,分别是synchronized,wait与notify、notifyAll。
?
41.用最有效率的方法算出2乘以8等于几?
?
2 << 3
?
42.JSP的内置对象
?
1.request。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
?
2.response。response对象包含了相应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
?
3.session。session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,知道客户端与服务器断开连接为止。它是HttpSession类的实例。
?
4.out。out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
?
5.page。page对象就是指向当前JSP页面本身,有点像类中this指针,它是java.lang.Object类的实例。
?
6.application。application对象实现了用户间数据的共享,可存放全局变量。它开始与服务器的启动,直到服务器的关闭,在此期间,此对象一直存在;这样在用户的前后连接或不同用户之间的连接,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
?
7.exception。异常对象,但一个页面在运行过程中发生了异常,就产生这个对象。如果一个jsp页面要应用此对象就必须把isErrorPage设为true,否则无法编译。它实际上是java.lang.Throwable的对象。
?
8.pageContext。提供访问其他隐含对象的方法。是javax.servlet.jsp.PageContext类的实例。
?
9.config。config对象是在一个Servlet初始化时,jsp引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数以及服务器的有关信息。是javax.servlet.ServletConfig类的实例。
?
43.JSP的常用指令
?
page指令
<%@page language="java" contentType="text/html;charset=utf-8" session="true" buffer="64kb"
autoFlush="true" isThreadSafe="true" info="text" errorPage="error.jsp" isErrorPage="true"
isELIgnored="true" pageEncoding="uft-8" import="java.sql.*"%>
?
include指令
<%@include file="include.html"%>
?
taglib指令
<%@taglib prefix="c" uri="http://...."%>
?
44.什么情况下调用doGet()和doPost()?
?
JSP页面中form标签里method属性为get时调用doGet(),为post时调用doPost()
?
45.如何现实servlet的单线程模式
?
jsp页面添加page指令 <%@page isThreadSafe="false"%>
或servlet实现SingleThreadModel接口。
?
46.简述synchronized和java.util.concurrent.locks.Lock的异同
?
Lock能完成synchronized所实现的所有的功能,具有更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
?
47.简述逻辑操作(&,|)与条件操作(&&,||)的区别
?
条件操作只能操作布尔型的,逻辑操作不仅可以操作布尔型,还可以操作数值型。
条件操作会产生短路。
?
48.我们在Web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
?
public String translate(String str) {
String result = "";
try {
result = new String(str.getBytes("ISO-8859-1"), "UTF-8");
}catch(Exception e) {
System.out.println(e.getMessage());
}
return result;
}
?
49.四种会话跟踪技术
?
?
a)URL重写:URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户
如:http://localhost:8080/user.jsp?username=admin
?
b)隐藏表单域:将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示
如:<input type="hidden" name="userid" value="1"/>
?
c)Cookie:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在 客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。 这样就实现了对客户的跟踪。Cookie是可以被禁止的。
?
d)session:
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。
在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户
Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效
如:
HttpSession session = request.getSession();?
SomeObject value = (SomeObject)session.getAttribute("someID");?
if (value == null) {?
value = new SomeObject (...);?
session.setAttribute("someID", value);?
}?
doSomethingWith(value);
?
50.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
?
jsp是html和Java代码结合的嵌套型语言,而Servlet是纯Java类。在第一次访问jsp文件时,jsp引擎翻译成Servlet源程序,然后编译成.class类文件。jsp侧重与视图,Servlet侧重于控制逻辑。
?
51.页面间对象传递的方法
?
request,session,application,cookie
?
52.Servlet执行时一般实现哪几个方法?
?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
?
53.一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
?
可以。但有且只有一个类是public修饰,这个public的类名必须与文件名相同。
?
54.Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
?
有两种实现方法,分别是继承Thread类与实现Runnable接口。
用synchronized关键字修饰同步方法。
stop()方法不安全,会解除由线程获取的所有锁定。
suspend()方法容易发生死锁,调用suspend的时候,目标线程会停下来,但仍然有在这之前获得的锁定。
?
55.Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
?
字节流,字符流。
字节流继承于InputStream OutputStream
字符流继承于InputReader OutputWriter
在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
?
56.Java中会有内存泄漏吗?请简单描述。
?
会。如:int i1, i2; return (i1-i2);//当i1为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。
?
57.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆中的所有对象。通过这种方式确定哪些对象是“可达的”,哪些对象是“不可达的”。但GC确定一些对象为“不可达”时,GC就有责任回收这些内存空间。
可以。
程序员可以手动执行System.gc(),通知GC运行。但并不保证GC一定会执行。
?
58.写clone()方法时,通常都有一行代码,是什么?
?
super.clone();//负责产生正确大小的空间,并逐位复制。
?
59.在Java中,如何跳出当前的多重嵌套循环?
?
break; return ;
?
60.Java中实现多台的机制是什么?
?
方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与之类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。
?
61.什么是序列化,如何实现Java序列化?
?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法, implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流来构造一个ObjectOutputStream对象,接着,使用ObjectOutputStream对象的writeObject方法就可以将对象写入,要读出的话用输入流。
?
62.静态变量和实例变量的区别?
?
Java类的成员变量有两种:一种是被static关键字修饰的变量,叫类变量或静态变量;另一种没有static修饰,为实例变量。
?
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也成为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间。实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
?
类的静态变量在内存中只有一个,Java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决与类的实例。每创建一个实例,Java虚拟机就会为实例变量分配一次内存,实例变量位于堆区,其生命周期取决于实例的生命周期。
?
?
63.JSP有哪些动作?作用分别是什么?
?
<jsp:include>:当页面请求的时候引入一个文件。
<jsp:forward>:将请求转到另外一个页面。
<jsp:useBean>:获得JavaBean的一个实例。
<jsp:setProperty>:设置JavaBean的属性。
<jsp:getProperty>:获得JavaBean的属性。
<jsp:plugin>:用于指定在客户端运行的插件。
?
64.启动一个线程是用run()还是start()?
?
启动线程用start()
?
65.session与cookie的区别
?
1.session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。
2.session中保存的是对象,cookie中保存的是字符串。
3.session不能区别路径,同一个同父在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。
4.session需要借助cookie才能正常工作,如果客户端完全禁止cookie,session将失效。
?
66.解析xml的方式有?
?
DOM:一次性加载整个文档,采用树形结构方式访问xml。
SAX:分析能立即开始,不需要等待所有的数据被处理,采用事件模型。
JDOM:Java特定文档模型,简化了与xml的交互,并且比DOM实现更快。
DOM4J:比JDOM灵活性更大,性能优异,功能强大。
?
?
?
?