常见java面试题总结

一、String中的==和equals区别java

答:==操做符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操做符。编程

若是一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象自己占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另外一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,若是要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就须要用==操做符进行比较。设计模式

equals方法是用于比较两个独立对象的内容是否相同,就比如去比较两我的的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:架构

String a=new String("foo");eclipse

String b=new String("foo");异步

两条new语句建立了两个对象,而后用a,b这两个变量分别指向了其中一个对象,这是两个不一样的对象,它们的首地址是不一样的,即ab中存储的数值是不相同的,因此,表达式a==b将返回false,而这两个对象中的内容是相同的,因此,表达式a.equals(b)将返回trueui

在实际开发中,咱们常常要比较传递进行来的字符串内容是否等,例如,String input = ;input.equals(quit),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。this

若是一个类没有本身定义equals方法,那么它将继承Object类的equals方法,Objectequals方法实现代码以下spa

boolean equals(Object o){线程

return this==o;

}

这说明,若是一个类没有本身定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操做符,也是在比较两个变量指向的对象是不是同一对象,这时候使用equals和使用==会获得一样的结果,若是比较的是两个独立的对象则总返回false若是你编写的类但愿可以比较该类建立的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你本身写代码来决定在什么状况便可认为两个对象内容是相同的


二、final、finally和finalize()区别

答:final:当修饰类,表示该类不能派生新子类;当修饰基本类型,表示常量;当修饰方法,表示不容许覆写(但可继承)

finally:异常处理的出口,在异常处理时提供finally块执行任何清除操做

finalize():object类定义的一个方法,java运行使用该方法在垃圾回收器将对象从内存中清除出去以前作必要的清理工做。


三、接口和抽象类的区别

答:含有abstract修饰符的class即为抽象类,abstract 类不能建立的实例对象。含有abstract方法的类必须定义为abstract classabstract class类中的方法没必要是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,因此,不能有抽象构造方法或抽象静态方法。若是的子类没有实现抽象父类中的全部抽象方法,那么子类也必须定义为abstract类型。

接口(interface能够说成是抽象类的一种特例,接口中的全部方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final

下面比较一下二者的语法区别:

1.抽象类能够有构造方法,接口中不能有构造方法。

2.抽象类中能够有普通成员变量,接口中没有普通成员变量

3.抽象类中能够包含非抽象的普通方法,接口中的全部方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型能够是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,而且默认即为public abstract类型。

5. 抽象类中能够包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中均可以包含静态成员变量,抽象类中的静态成员变量的访问类型能够任意,但接口中定义的变量只能是public static final类型,而且默认即为public static final类型。

7. 一个类能够实现多个接口,但只能继承一个抽象类。

下面接着再说说二者在应用上的区别:

接口更多的是在系统架构设计方法发挥做用,主要用于定义模块之间的通讯契约。而抽象类在代码实现方面发挥做用,能够实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的全部Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就能够定义一个抽象的基类,让全部的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码以下:

public abstract class BaseServlet extends HttpServlet
{
public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
{
记录访问日志
进行权限判断
if(具备权限)
{
try
{
doService(request,response);
}
catch(Excetpion e)
{
记录异常信息
}
}
} 
protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;  
//注意访问权限定义成protected,显得既专业,又严谨,由于它是专门给子类用的
}
 
public class MyServlet1 extends BaseServlet
{
protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
{
本Servlet只处理的具体业务逻辑代码
} 
 
}

父类方法中间的某段代码不肯定,留给子类干,就用模板方法设计模式。

备注:这道题的思路是先从整体解释抽象类和接口的基本概念,而后再比较二者的语法细节,最后再说二者的应用区别。比较二者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展示本身深厚的技术功底。


四、String和StringBuffer区别

   前者内容不可变,后者可变,若是须要对字符串进行频繁修改,只能用后者


五、&和&&的区别

&&&均可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,则结果为false

&&还具备短路的功能,即若是第一个表达式为false则再也不计算第二个表达式

&还能够用做位运算符,当&操做符两边的表达式不是boolean类型时,&表示按位与操做,咱们一般使用0x0f来与一个整数进行&运算,来获取该整数的最低4bit位,例如,0x31 & 0x0f的结果为0x01。 

备注:这道题先说二者的共同点,再说出&&&的特殊之处,并列举一些经典的例子来代表本身理解透彻深刻、实际经验丰富。 


六、进程和线程的区别

     进程是程序一次动态执行过程,经历了从代码加载、执行到执行完毕的过程,也是进程产生、发展和消亡的过程。

     线程是比进程更小的执行单位,是在进程基础上进一步划分。

七、建立线程有几种方式

    一、继承thread类

    二、实现runnable接口          

     区别:thread类也是runnable接口的子类,都须要一个线程的主类,这个类能够实现runnable或继承thread,都必须覆写run方法,后者能够避免单继承的局限,好比要是你的类以及继承了其余类,这种状况下就不能同时继承thread了


八、进程的状态

     建立、就绪、运行、阻塞、终止

     就绪:得到除cpu之外的全部资源

     阻塞:人为挂起,等待io,申请缓冲区不能知足。。。


九、同步和异步有什么区别

   若是一块数据要在多个线程共享,就必须进行同步存取,异步途径效率更高。


十、sleep()和wait()区别

  sleep()是thread类定义的static方法,表示线程休眠,将执行机会让给其余线程,但监控状态依然保持,到时候会自动恢复

 wait()是object类方法,表示线程等待,一直到执行了notify()或notifyAll()后才结束等待。


十一、AOP和OOP区别

OP、OOP在字面上虽然很是相似,但倒是面向不一样领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以得到更加清晰高效的逻辑单元划分。

而AOP则是针对业务处理过程当中的切面进行提取,它所面对的是处理过程当中的某个步骤或阶段,以得到逻辑过程当中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差别。

上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,天然是OOP/OOD的任务,咱们能够为其创建一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

一样,对于“权限检查”这一动做片段进行划分,则是AOP的目标领域。而经过OOD/OOP对一个动做进行封装,则有点不三不四。

换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

相关文章
相关标签/搜索