java面试题总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试题总结相关的知识,希望对你有一定的参考价值。

来源:http://m.kanzhun.com/k-mianshitimu/javamianshiti/

一、 JAVA基础
1、 String和StringBuffer的区别

答:JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

2、 接口和抽象类的区别和用法?

答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

3、  List、Set、Map三个存取数据时各自的特点是什么?

答:List有序key和value都能重复
Set 无序(除treeSet) key和value都不能重复
Map无序(除treeMap) key 必须唯一 value 可以重复

4、 Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:有字节流,字符流,对象流,文件流
抽象类:Java中处理字节流的抽象类有InputStream和OutputStream。InputStream有7个子类,OutputStream有5个子类; 
Java中处理过滤流的抽象类是FilterOutputStream和FilterInputStream,而这两个抽象类又分别是抽象类InputStream和OutputStream的子类。对于流动数据的过滤也就是进行某种形式的加工; 
Java中处理字符流的抽象类是Reader类和Writer类。它们的直接子类分别有6个和7个; 
Java中处理压缩流的抽象类是InflaterInputStream和DefilaterOutputStream,它们分别有3个子类。

5、 Java的异常处理共分为哪几种?他们之间的区别是什么?

答:分为一般异常和运行时异常,异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

6、 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;(可以正确编译)

7、 
public class TestQuestion {
public static void main(String[] args){
      System.out.println(“Hello world !”);
RuntimeException re = null;
throw re;
}
} hello world可以打印出 系统报空对象异常
程序是否有错?如果有,请指出并描述原因;如果没有,请写出运行结果。
7、
public class TestQuestion {
public int addOne(final int x){
return ++x;
}
}
答:有,被修饰符final修饰的变量x不能被赋值。
程序是否有错?如果有,请指出并描述原因。
8、
public class TestQuestion {
  int i;
  final int z;
public void showI(){
System.out.println(“i=” + i);
}
  public void showJ(){
      int j;
System.out.println(“j=” + j);
}
public void showZ(){
System.out.println(“z=” + z);
}

  public static void main(String[] args){
      TestQuestion testQuestion = new TestQuestion();
      testQuestion.showI();
   testQuestion.showJ();
      testQuestion.showZ();
}
}
程序是否有错?如果有,请指出并描述原因;如果没有,请写出运行结果。

答:有,首先在类TestQuestion类中定义的变量z由于有final修饰符,所以必须被初始化
第二,在TestQuestion类中的showJ()方法中定义的变量j必须先初始化再使用

9、程序题:
   1)把“abcd1234”逆序输出,写一段程序。
答:采用OOP方法
public class StringModel {
//被操作的字符串
private String str;
public StringModel() {

}

public StringModel(String str) {
this.str = str;
}

public String getStr() {
return str;
}

public void setStr(String str) {
this.str = str;
}
}

//操作StringModel的方法集
public class StringDAO {
//逆序,使用StringBuffer
private StringBuffer sb = new StringBuffer();
public String reverseString(String str) {
String result = "";
result = sb.append(str).reverse().toString();
return result;
}
}

//测试类
public class StringTest {
public static void main(String[] args) {
StringModel sm = new StringModel();
//使用构造方法也可
//StringModel sm = new StringModel("abcd1234");
sm.setStr("abcd1234");
StringDAO dao = new StringDAO();
String str = dao.reverseString(sm.getStr());
System.out.println(str);
}
}

   2)请用java实现Singleton模式
public class Num {
private int num;

public Num() {

}

public Num(int num) {
this.num = num;
}

public int getNum() {
return num;
}

public void setNum(int num) {
this.num = num;
}
}


//单例类
public class NumDAO {
//单例
private static NumDAO dao;
//不允许new---私有构造方法
private NumDAO() {}
//使用单例类需要从类自身得到实例
public static NumDAO getInstance() {
dao = new NumDAO();
return dao;
}
public int add(Num n1,Num n2) {
int result = ;
result = n1.getNum() + n2.getNum();
return result;

}
}

public class SingletonTest {
public static void main(String[] args) {
Num n1 = new Num(1);
Num n2 = new Num(1);
int result = NumDAO.getInstance().add(n1, n2);
System.out.println(result);
}
}
二、 WEB相关
1、 JSP中的内置对象有哪些?

答:JSP中有9大内置对象,分别是:request  response  session  application  out   page  cookie  pageContext  config



2、 简述Servlet的生命周期.

答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法,生命周期结束。



3、 如何解决请求中的中文乱码问题?

答:可以在接收页面请求信息之前或之后进行转码。


4、 请写出常用的jstl的标签有哪些,并描述各自作用?

答:<c:set>:创建和设置限制了作用域的变量。
   <c:remove>:用来删除限制了作用域的变量。
<cut>:对由其 value 属性指定的表达式进行求值,然后打印结果。如果指定了可选属性 default ,那么,在对 value 属性的表达式求值所得结果为 null 或空 String 的情况下, <cut> 将打印其值。
<c:forEach>:实现用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。支持两种不同样式的迭代:整数范围上的迭代和集合上的迭代。
<c:if>:简单地对单个测试表达式进行求值,接下来,仅当对表达式求出的值为 true 时,它才处理标记的主体内容。如果求出的值不为 true ,就忽略该标记的主体内容。
< c:choose>:每个要测试的条件都由相应的 <c:when> 标记来表示,至少要有一个 <c:when> 标记。只会处理第一个其 test 值为 true 的 <c:when> 标记体内的内容。如果没有一个 <c:when> 测试返回 true ,那么会处理 <ctherwise> 标记的主体内容。如果没有给出 <ctherwise> 操作,那么不会处理任何 <c:choose> 标记的主体内容。
<c:catch>:它允许在 JSP 页面内进行初级的异常处理。更确切地说,在该标记的主体内容中产生的任何异常都会被捕获并被忽略。
<c:import>:是一种请求时操作,它的基本任务就是将其它一些 Web 资源的内容插入 JSP 页面中。
<c:redirect>:该操作用于向用户的浏览器发送 HTTP 重定向响应,与 javax.servlet.http.HttpServletResponse 的 sendRedirect() 方法功能相当。

5、 编写代码实现jsp页面中如文字内容长度大于2字符截取到2,后面添加..,如不到2则原样输出的代码(推荐使用jstl)

<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=GBK"%>
<%@taglib uri="WEB-INF/c.tld" prefix="c"%>
<!--发送信息的页面  -->
<html>
  <head>
    <title>request</title>
  </head>
   <c:set var="context" value="sdkfksf;sketokbtopkrptokrtpokr" scope="request"></c:set>
   <cut value="${requestScope.context}"></cut>
   <a href="StringService?context=${requestScope.context }">处理</a>
  <body>
  </body>
</html>

package com.string.service;

import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//处理信息的Servlet
public class StringService extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
String str = request.getParameter("context");
String result = "";
if(str.length()>2) {
result = str.substring(, 2)+"...";
}else{
result = str;
}
request.setAttribute("context", result);
request.getRequestDispatcher("show.jsp").forward(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request,response);
}

}

<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=GBK"%>
<%@taglib uri="WEB-INF/c.tld" prefix="c"%>
<!-- 显示内容的页面 -->
<html>
  <head>
    <title>show</title>
  </head>
  
  <body>
    <!-- 使用EL表达式 -->
    <cut value="${requestScope.context}"></cut>
  </body>
</html>

三、 框架知识
1、 简述SPRING的Aop和IoC。

答:AOP:面向切面编程,Spring AOP,借助于Spring实现的拦截器,开发者能够实现以声明的方式使用企业级服务,比如安全性服务、事务服务等。
AOP帮助我们将这些服务模块化,并把它们声明式地应用在需要它们的地方,使得这些组件更加专注于自身业务,完全不知道其它涉及到的系统服务。
IoC:反向控制(依赖注入),是指获得依赖对象的方式反向。Spring IoC,借助于依赖注入设计模式,使得开发者不用理会对象自身的生命周期及其关系,而且能够改善开发者对J2EE模式的使用。
IoC模式中,创建对象实例的任务交给IoC容器或框架(实现了IoC设计模式的框架也被称为IoC容器),使得应用代码只需要直接使用实例,这就是IoC,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
Spring IoC和 Spring ; AOP组合,一起形成了Spring,这样一个有机整体,使得构建轻量级的J2EE架构成为可能,没有Spring IoC的Spring AOP是不完善的,没有Spring AOP的Spring IoC是不健壮的

2、 简述SPRING MVC与STRUTS2 的异同。

答:spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上 spring3 mvc就容易实现restful url。
struts2是类级别的拦截, 一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。 spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量
而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦。 spring3 mvc的验证也是一个亮点,支持JSR33,处理ajax的请求更是方便 只需一个注解@ResponseBody ,然后直接返回响应文本即可。 

3、 HIBERNATE中实现ORMapping有哪几种方式,并简述每种方式的优缺点。
4、 Hibernate中save、update和saveOrUpdate的区别是什么?

答:save()导致的最终结果是执行insert语句,update和saveOrUpdate是用来对跨Session的PO进行状态管理的。update会被用于当一个PO对象跨Session进行状态同步的时候才需要写。而一个PO对象当它不需要跨Session进行状态管理的时候,是不需要写update的。saveOrUpdate的策略是,如果该对象的ID已经存在,则执行update(),如果该对象的ID不存在,则用save()策略。
5、 常用的缓存实现有哪几种?区别是什么?

答:2种:一级缓存和二级缓存。一级缓存通过session设置实现,二级缓存通过配置Session工厂实现。
四、 javascript
1、 JavaScript中对象和函数的创建都有哪种方法
2、 请编写代码循环输出一个对象中所有的key和value。
3、 描述下闭包的作用

答:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
作用:匿名自执行函数
缓存
实现封装
4、 编写一个校验邮箱的正则表达式

答:./^.+\@(\[?)[a-zA-Z-9\-\.]+\.([a-zA-Z]{2,3}|[-9]{1,3})(\]?)$/;

5、 编写javascript实现点击某添加按钮后表格中自动添加一行的功能。(推荐用jquery和javascript两种方式实现)

五、 数据库
1、 常用的数据库设计建模的工具有哪些?
答:有UML建模,用Rose23

2、 左连接、右连接和内连接的区别是什么?

答:内连接(Inner Join)查询操作列出与连接条件相匹配的数据行,使用比较运算符比较被连接列的列值
外连接(Out Join) 返回查询结果中不仅包含符合连接条件的行,还包括左表或右表中所有的数据行,分为左连接和右连接。
左连接(Left Join)返回包含左表中全部记录和右表中与连接条件匹配的记录
右连接(Right Join)返回包含右表中全部记录和左表中与连接条件匹配的记录

3、 设计树型的表结构必须的字段有哪些,他们之间的关系是什么?
4、 有3张表,Student表、SC表和Course表 
Student表:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)和系名(Sdept) 
Course表:课程号(Cno)、课程名(Cname)和学分(Ccredit); 
SC表:学号(Sno)、课程号(Cno)和成绩(Grade)
请使用SQL语句查询学生姓名及其课程总学分

Select sname, sum(grade) from Student st  SC  Course  c  where st.sno=SC.sno and c.cno=SC.cno ;







































































































































































































































































































































以上是关于java面试题总结的主要内容,如果未能解决你的问题,请参考以下文章

java开发面试题:spring面试题总结

Java面试题总结 14Redis面试题总结(附答案)

面试总结目录

Java面试题全集(上)(中)(下) (转)+自己总结

Java开发基础面试题,java研发工程师年终总结

java经典面试题总结