java面试题总结
1 . 重载与重写的区别
- 重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现。
- 重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。
- 重载规则:必须具有不同的参数列表; 可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。
- 重写规则:参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;返回类型必须一直与被重写的方法相同,否则不能称其为重写而是重载;访问修饰符的限制一定要大于等于被重写方法的访问修饰符;重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,譬如父类方法声明了一个检查异常 IOException,在重写这个方法时就不能抛出 Exception,只能抛出 IOException 的子类异常,可以抛出非检查异常。
- Java 构造方法能否被重写和重载?
重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载。
2 . StringBuffer与StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
3.final, finally, finalize的区别。
-
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,
-
finally是异常处理语句结构的一部分,表示总是执行。
-
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
4. 线程有几种实现方法?同步有几中实现方法?
- Java5之前有两种实现方法,分别是继承Thread类与实现Runnable接口
1、new Thread(){public void run(){执行的内容}}.start();
2、new Thread(new Runnable(){执行的内容}).start();
从java5开始,还有如下一些线程池创建多线程的方式:
3、ExecutorService pool = Executors.newFixedThreadPool(3)
for(int i=0;i<10;i++)
{
pool.execute(new Runable(){public void run(){}});
} - 用synchronized关键字修饰同步方法
- wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
- sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
- notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
- Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
线程的生命周期:
新建(new)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。 - 阻塞又分为:1.等待阻塞(wait()方法);2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用);3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。
- 悲观锁、乐观锁
5.同步和异步有何异同,在什么情况下分别使用他们?
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
6. ==与equalts的区别
==用于比较变量的值,如果用于引用类型,则比较两个引用变量中的存储的值,判断两个变量是否指向相同的对象。
equals用于比较对象的内容。
7.JVM内存分为堆、栈、方法区。
- 堆内存
- 1.用于存储使用new关键字所创建的对象和数组信息。
- 2.内存泄露和内存溢出
内存泄露 : 指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用,可用内存越来越少。
内存溢出 : 指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于老年代或永久代垃圾回收后,仍然无内存空间容纳新的Java对象的情况。
内存泄露是内存溢出的一种诱因,不是唯一因素。
- 栈内存
用于存储程序运行的时候在方法中声明的所有局部变量(包括变量的基本类型和具体数值)。 - 方法区
用于存储类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装进方法区。类的各种信息(包括方法)都在方法区存储。(包含所有的class和static变量)
8.static关键字
- static修饰的成员变量不属于对象的数据结构,它属于类的数据结构。
- 一般通过类点来引用static成员;
- static成员变量和类的信息都存储到方法区中,
- static块:属于类的代码块,在类加载的时候只执行一次,作用:加载静态资源。
final 终极变量、方法
final static int NUM; ->常量(编译器)
9. java.util.List接口
- List继承自Collection,它是一个可重复集合,并且有序。
提供一组独有的方法,是可以通过下标操作元素的。 - list常用实现类:
ArrayList、Vector和LinkedList的区别- 相同点
这三者都是单列集合Collection下List集合的实现类,所以他们的共同点,元素有序,允许重复元素 。 - 不同点
1.ArrayList和Vector底层都是数组实现,这样的实现注定查找快、增删慢 。
2.Vector支持线程同步,是线程访问安全的,ArrayList线程不安全 。
3.LinkedList底层是链表结构,查找元素慢、增删元素速度快,线程不安全。
首尾增删效率最好。
没有对性能极端苛刻要求通常用ArrayList即可。
- 相同点
10. List、Map、Set三个接口,存取元素时,各有什么特点?
- List的特点:元素有顺序,元素可以重复。(继承Collnection接口)
- Set特点:元素无顺序,元素不可重复(虽然无顺序,但是元素在Set中的位置是有该元素的HashCode决定的,其位置其实是固定的(继承Collnection接口))
- Map特点:元素按键值对存储,无顺序。(不继承Collnection接口)
11. HashTable与HashMap的区别
- 同步性:HashTable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的。由于同步检查所以HashTable性能稍慢。
- 值:HashMap可以插入一个null的key—value,HashTable不可以插入null的key-value值
12. 常见的集合类
Collection<–List<–Vector
Collection<–List<–ArrayList
Collection<–List<–LinkedList
Collection<–Set<–HashSet
Collection<–Set<–HashSet<–LinkedHashSet
Collection<–Set<–SortedSet<–TreeSet
博客原地址
13. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
- 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
- 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
14.GC是什么? 为什么要有GC?
- GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
- 程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
15.二叉树
二叉树是许多算法题的常用结构,其遍历算法的各种变种就是各种题目。具体的顺序如下:
先序遍历:先根、后左、再右 123456789
中序遍历:先左、后根、再右 325417869
后序遍历:先左、后右、再根 354287961
16. 冒泡排序
public class maopao{
public static void main(String args[]){
int[] arr={3,1,6,8,2,4,5,9};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int t = arr[j+1];
arr[j+1]=arr[j];
arr[j]=t;
} }}System.out.print(Arrays.toString(arr));}}
JavaWeb
1.解释servlet;
- servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
- Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
2. forward (转发)和redirect(重定向)的区别
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
3. jsp有哪些内置对象?作用分别是什么? 分别有什么方法?
-
JSP共有以下9个内置的对象:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外 -
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page表示从该页面产生的一个servlet实例
4. MVC的各个部分都有那些技术来实现?如何实现?
答:MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
5. xml有哪些解析技术?区别是什么?
- 有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)
6.你在项目中用到了xml技术的哪些方面?如何实现的?
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。
- -
流行的框架与新技术
1.Struts(page156)
struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。
一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;
1.j2EE常用的工厂模式
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。