Java开发程序员面试题大综合

1.一个".java"源文件中是否可以包括多个类(不包含内部类)?有什么要求?

答:可以有多个类,但只能有一个public修饰的类,并且public修饰的类名必须与文件名相同。

2.&和&&两者有什么区别?

答:短路与&&和逻辑与&&都可以做与运算:当运算符两边的表达式的结果都为true时,整个运算结果才为true
    短路与&&具有短路的功能,如果第一个表达式为false,则不再执行后面的表达式。
    逻辑与&还可以做位运算,当逻辑与&两边的表达式不是boolean类型时,则表示按位与操作。

3."=="和equals方法究竟有什么区别?

答:==专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同;
    而equals方法是用于比较两个独立对象的内容是否相同。

4.重载(Overload)和重写(Override)有什么区别?

答:重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;
        如果父类方法访问修饰符为private则子类中就不是重写。

5.构造器是否可被重写?

答:构造器Constructor不能被重写但可以被重载,不能用static修饰构造器,只能用public、private和protected这三个权限修饰符,并且不能有返回语句。

6. java编译运行过程是怎样的?

答:首先是编译期:.java源文件,经过编译,生成.class字节码文件
    然后是运行期:JVM虚拟机去加载.class并运行.class
    从而达到的特点是跨平台,也就是一次编程到处使用。

7.JVM、JRE、JDK分别表示什么意思?

答:1)JVM:JAVA虚拟机,作用是加载.class并运行.class,最后生成可执行文件
    2)JRE:JAVA运行环境,它除了包含JVM以外,还包含了运行java程序所必需的环境
    3)JDK:JAVA开发工具包,它除了包含JRE以外,还包含了开发java程序所必须的命令工具

8.分别判断下列两个语句的对错:

(1)short s1 = 1; s1 = s1 + 1;
(2)short s1 = 1; s1 += 1;
答:对于short s1 = 1; s1 = s1 + 1;语句编译错误。由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。
    而short s1= 1; s1 += 1;语句可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

9.是否可以继承String类?

答:String 类是final修饰的类,不可以被继承。

10.静态变量和实例变量有什么区别?

答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象
    一个类不管创建多少个对象,静态变量在内存中有且仅有一个,静态变量可以实现让多个对象共享内存
    实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。

11.简单讲一下java的跨平台原理?

答:Java通过不同系统、不同版本、不同位数的java虚拟机(jvm)来屏蔽不同的系统指令集差异而对外提供统一的接口(java API)。
    对于我们普通的java开发者而言,只需要面向接口开发即可,如果需要部署到不同的环境时,只需在系统上安装对应版本的虚拟机即可。

12.ArrayList和LinkedList有什么区别?

答:首先它们的相同点是都可以用来保存一组元素同时可以进行查询和增删等操作。
    其次它们的不同点在于ArrayList底层使用的是数组,而LinkedList使用的是链表。
    具体来讲,数组在内存中是一块连续的内存,如果插入或删除是需要移动内存的,
    所以数组结构不利于插入和增删操作,但相对来说数组结构的查询性能比较好。
    而链表在插入或者增删时时不需要移动内存,只需改变引用指向即可,所以链表结构的插入或者增删效率高。
    总之,在实际开发当中,如果要求查询效率高的话首选ArrayList,而如果要求频繁修改增删元素的话首选LinkedList。

13.请分别说明final,finally,finalize三者之间的区别?

答:首先,final是java语法中的关键字,它的作用有以下几种:
      1)修饰变量:变量不可被改变;
      2)修饰方法:方法不可被重写;
      3)修饰类:类不可被继承;
      4)修饰成员变量:意为初始化后不可改变,该成员变量必需在初始化时赋值,对象一旦创建即不可改变。
    其次,finally是异常处理机制的最后一块,它可以直接跟在try语句块之后,或者最后一个catch块之后。
    它能确保只要程序执行到try语句块中,无论try语句块中的代码是否抛出异常,finally块中的代码必定执行。
    通常会将无关乎程序出错都要执行的代码放在这里,比如资源的释放操作:IO流的关闭。
    最后,finalize方法是Object中定义的方法,当一个对象即将被GC释放时,GC会调用该方法。
    通常我们不会重写这个方法,若需要在一个对象被释放前做某些操作时可以重写该方法。但是该方法不应当包含耗时的操作,否则会影响GC的回收工作。
    简单来讲是:
      1)final是修饰符(关键字)可以修饰类、方法、变量
      2)finally在异常处理的时候使用,提供finally块来执行任何清除操作
      3)finalize是方法名,在垃圾收入集器将对象从内存中清除出去之前做必要的清理工作

14.分别说明breake、continue、return的作用是什么?

答:它们的作用分别如下所示:
    1)break:常用在嵌套循环和判断语句中,作用是跳出当前循环(写在哪一层,就跳出哪一层)
    2)continue:跳过当前循环中的剩余语句而开始下一次的循环
    3)return:有返回值的时候则把方法的返回值返回给调用者,无返回值的时候就结束方法

15.什么叫序列化和反序列化?序列化有什么用途?

答:把对象转换为字节序列的过程称为对象的序列化。
   把字节序列恢复为对象的过程称为对象的反序列化。
   对象的序列化主要有两种用途:
      1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
      2)在网络上传送对象的字节序列。

16.StringBuffer与StringBuilder有什么区别?

答:它们的相同点:StringBuffer和StringBuilder类都表示内容可以被修改的字符串.
   它们的不同点:StringBuilder是线程不安全的,运行效率高;而StringBuffer是线程安全的,但运行效率低.
   如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。
   如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

17.请说出你最常见到的5个RuntimeException(运行时异常)

答:所谓运行时异常,就是RuntimeException的所有子类,比较常见的有:
    1)NullPointerException空指针异常
    2)ArrayIndexOutOfBoundsException数组下标越界异常
    3)ClassCastException类转换异常
    4)FileSystemNotFoundException找不到系统文件异常
    5)FileSystemAlreadyExistsException系统文件已经存在异常

18.讲一下http协议中GET和POST请求的区别?

答:它们的相同点:
     GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作。
   它们的不同点:
     1)GET一般用于获取或者查询资源信息,而POST一般用于更新资源信息。
     2)GET请求提交的数据会在地址栏显示出来,而POST不会。
     3)GET提交请求的数据会附在URL之后),以?分割URL和传输数据,多个参数用&连接;而POST提交则是把提交的数据放置在是HTTP包的包体中。 
     4)GET请求由于浏览器对地址长度的限制而导致传输的数据大小有限制;而POST请求不会因为地址长度限制而导致传输数据限制。
     5)POST的安全性要比GET的安全性高,因为GET提交的数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。

19.线程池有什么作用?

答:1)限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃;
   2)线程池不需要每次都去创建或销毁,节约了资源;
   3)线程池不需要每次都去创建,响应时间更快。
   总之,创建线程池主要就是为了解决两个问题:一个是重用线程;另一个则是控制线程数量。

20.实现一个拷贝文件的工具类使用字节流还是字符流?

答:我们拷贝的文件不确定是只包含字符流,有可以能有字节流(图片、声音、图像等),为考虑到通用性,要使用字节流。

21.简单说一下html、css和javascript在网页开发中的定位?

答:HTML就是超文本标记语言,它是用来定义网页的结构;
   CSS就是层叠样式表,它是用来美化页面;
   JavaScript主要用来验证表单,做动态交互。 

22.js和jQuery之间有什么关系?

答:jQuery是一个js框架,封装了js的属性和方法,让我们使用起来更加便利,并且增强了js的功能.
   使用原生js是要处理很多兼容性的问题 (注册事件等),由jQuery封装了底层,就不用处理兼容性问题。
   原生js的dom和事件绑定和 Ajax等操作非常麻烦,jQuery封装以后操作非常方便。

23.Collection 和 Collections有什么区别?

答:Collection是集合类的上级接口,而它的子接口主要有Set和List;
   而Collections是针对集合类的一个工具类,该类提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

24.怎么理解多线程中同步的概念?

答:同步用来控制共享资源在多个线程间的访问,以保证同一时间内只有一个线程能访问到这个资源。
    在非同步保护的多线程中,一个线程正在修改一个共享变量的时候,可能有另一个线程也在使用或者更新它的值。

25.如何增加代码的清晰度和可读性?

答:1)给代码添加注释
   2)类名和包名等命名规范化
   3)缩进排版规范
   4)添加异常的处理
   5)使用测试类和测试方法

26.请描述一下JVM加载class文件的原理机制?

答:JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件中的类.

27.你对软件开发中迭代的含义是怎么理解的?

答:因为软件开发过程中的迭代模型大概由可行性分析,需求分析,概要设计,详细设计,编码,测试,部署和维护等八个阶段组成.
   所以在软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代,然后进入下一阶段的开发,这样对于开发中的需求变化和人员变动都能得到更好的适应.

28.继承和重载之间有什么区别?

答:Java的继承是子类对象继承父类对象的成员属性和成员方法,而且Java中只允许单继承;
   在继承的过程中可以实现方法的重写,即子类定义一个方法覆盖从父类中继承过来的同名方法.
   方法的重载要求时有两个或多个方法名相同,而这些方法的参数列表要求不能相同,重载对于返回值没有限制要求.

29.List,Set和Map是否继承自Collection接口?

答:List和Set都继承自Collection接口,而Map没有继承自Collection接口.

30.字节流和字符流有何区别?

答:字节流与字符流主要的区别是它们处理数据的方式
   字节流是最基本的,所有InputStream和OutputStream的子类用于处理二进制数据,它是按字节来处理数据的,而字符流则是以字符为单位来读写数据的.

31.你如何理解Java中的反射技术?

答:Java中类的反射是一种自我管理机制,通过反射可以实现以下功能:
    1)在运行时判断任意一个对象所属的类;
    2)在运行时构造任意一个类的对象;
    3)在运行时判断任意一个类所具有的成员变量和方法
    4)在运行时调用任意一个对象的方法.

32.一个Java的类实现序列化的方式是什么,以及在集合框架中,实现比较要通过实现什么接口?

答:Java类实现序列化的方式就是让要序列化的类实现java.io.Serializable接口;
   Collection框架中实现比较需要通过实现Comparable接口或者Comparator接口.

33.简述什么是HTTP协议?

答:HTTP协议就是Hyper Text Transfer Protocol的简写
   它是由w3c(即万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式.

34.什么是web容器,其作用是什么?尽可能写出你知道的容器名称.

答:web容器就是给处于其中的应用程序组件(servlet和jsp等)提供一个运行环境,使这些组件能够直接跟容器中的环境变量接口进行交互,而不必关注其他系统问题
   常见的web容器有Tomcat,WebLogic,WebSphere等.

35.简述什么是重定向?

答:服务器向浏览器发送一个302状态码和一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向地址发出请求.

36.数据库中结构化查询语言有哪些分类?

答:结构化查询语言(SQL)可分为:
  1)数据定义语言DDL(包括: create,drop,alter,truncate;不支持事务)
  2)数据操作语言DML(包括: insert,update,delete,select(DQL);支持事务,select除外)
  3)数据查询语言DQL(只包括select)
  4)事务控制语言TCL(包括:begin 、 rollback、 commit、 savepoint s1 、rollback to s1)
  5)数据控制语言DCL(涉及分配用户权限相关的SQL)

37.数据库中创建视图有什么意义?

答:视图的意义在于两个方面:
  1)简化复杂查询.
    如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询该视图即可.
  2)限制数据访问.
    视图本质上就是一条select语句,所以当访问视图时,只能访问到所对应的select语句中涉及到的数据,这样对数据起到安全和保密的作用.

38.数据库主键与外键分别有什么作用?

答:1)主键作用:保证设置主键的字段非空且唯一,另外,在定义主键时,如果该字段之前没有索引,系统会自动创建唯一性索引.
   2)外键作用:保证设置外键的字段取值必须匹配父表中已有的值,通过外键可以与同一张表的其他字段建立引用关系,也可以与不同表的字段建立引用关系.

39.你是如何理解事务的概念?

答:事务是指单个逻辑工作单元执行的一系列操作.
   事务处理可以确保单元内的所有操作都能成功完成,否则不会永久改变数据.
   通过将一组相关操作组合成一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加安全可靠.

40.事务的特性有哪些?

答:事务的特性包括四个特性(即ACID),分别表示:
   1)原子性Atomicity:一个事务要么全部成功,要么全部失败;
   2)一致性Consistency:事务把数据库从一个一致状态转变到另一个状态;
   3)隔离性Isolation:在事务提交之前,其他事务不受影响;
   4)持久性Durability:一旦事务提交,它是永久的.

41.JDBC中包含哪些常见的类和接口,访问数据库的基本过程是什么?

答:java数据库编程包含Connection,ResultSet,PreparedStatement,Statement,DriverManager等java类;
  JDBC访问数据库的步骤:
  1)注册驱动程序;
  2)建立连接;
  3)创建Statement对象;
  4)执行sql语句;
  5)若sql为查询语句则遍历结果集;
  6)关闭连接.

42.Servlet的生命周期是怎样的过程?

答:Web容器加载Servlet类并将其实例化之后,Servlet生命周期开始,容器运行其init方法进行Servlet的初始化(只执行一次);
  当浏览器发送过来请求时,容器立即调用Servlet中的service方法开始处理请求;
  此时service方法自行派遣并运行与请求对应的doXXX方法(七大请求对应的比如doGet或doPost方法等);
  当服务器决定将实例销毁的时候(例如服务器关闭)就会去调用Servlet中的destroy方法.
  总之就是:加载Servlet的class->实例化Servlet->调用Servlet的init完成初始化->调用service方法响应请求->Servlet容器关闭时调用destory方法
  也可以这么理解:
    (1) Servlet容器完成Servlet类的加载并实例化一个Servlet对象 
    (2) init()方法完成初始化工作,该方法由Servlet容器调用完成 
    (3) service()方法处理浏览器的请求,并返回响应结果 
    (4) destroy()方法在Servlet容器卸载Servlet之前被调用

43.JSP和Servlet有什么区别?

答:JSP是Servlet技术的拓展,本质上是Servlet的简易方式.
   Servlet和JSP最主要的不同点在于:
   Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分开,而JSP是java和HTML可以组合成一个拓展名为.jsp的文件;
   JSP侧重于视图,而Servlet主要用于控制逻辑.

44.数据库连接池有什么作用?

答:1、限定数据库的连接个数,避免了由于数据库连接过多导致系统运行缓慢或崩溃;
   2、数据库连接不需要每次都去创建或销毁,节约了资源;
   3、数据库连接不需要每次都去创建,响应时间更快。 

45.什么是MVC模式?

答: MVC的全名是Model View Controller,是模型 (model)-视图(view)-控制器 (controller)的缩写
    它是经典的java设计模式,主要是将业务逻辑、数据访问和页面展示三者分层处理
    其中模型主要负责将业务逻辑封装到一个组件里面,这样在改进和个性化定制页面的同时,不需要重新编写业务逻辑;
    视图主要负责将处理结果以视图的形式响应给浏览器,从而展示给用户浏览;
    而控制器则是整个MVC模式的核心(视图层和模型层的桥梁),它负责模型与视图之间的传递和交互.
    最简单的、最经典的MVC模式就是:JavaBean(model)+Jsp(view)+Servlet(controller)
    该模式基本过程就是:
      当浏览器发送请求的时候,控制器会去调用JavaBean完成处理业务的请求;
      完成业务后通过控制器跳转JSP页面的方式给用户反馈信息,最终是由Jsp给用户做出响应。 

46.MVC设计模式有什么优缺点?

答:优点:
    1)视图控制模型三者分离,提高代码重用性。
    2)提高开发效率。
    3)便于后期维护,降低维护成本。
    4)方便多个开发人员之间的分工。
  缺点:
    1)清晰的构架以代码的复杂性为代价,对小项目有可能反而降低开发效率。
    2)运行效率相对较低。 

47.truncate,delete,drop之间有什么区别?

答:1)truncate的作用是删除表内容,释放表空间,但是保留表结构,数据不可以回滚。
   2)delete属于数据操作语言,不能自动提交事务,需commit提交。
   3)drop属于数据定义语言,可以自动提交事务,并在删除表数据同时删除表结构。

48.数据库中char和varchar有什么区别?

答:char:固定长度,定长字符串,最多255个字节
       char存储定长数据很方便,而且char字段上的索引效率比较高,
       比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
   varchar:存储变长数据,但存储效率比较低。
       如果一个字段的值是不固定长度的,但它不可能超过10个字符,那么就可以把它定义为varchar(10)。

49.Statement和PreparedStatement的区别?

答:共同点:都是用来执行SQL的,PreparedStatement extends Statement
   区别:(1)Statement适合执行静态(无条件)SQL,
             每执行一次都要对传入的sql语句编译一次,效率较低
        (2)PreparedStatement适合执行动态(有条件)SQL,预防sql注入攻击
             PreparedStatement是预编译的,对于批量处理可以大大提高效率,执行速度快于Statement