Java后台开发面试题之Java基础

Java后台开发面试题之Java基础

  1. session和cookie的区别

    • session存放在服务器端中,安全性较高;cookie存放在客户端中,安全性较低;
  2. http请求响应的全过程

    • 解析域名获取IP地址-》与服务器建立TCP连接-》浏览器向服务器发送http请求-》服务器给浏览器响应-》释放连接-》浏览器解析响应数据
  3. 知道哪几种状态码,分别代表什么含义?

    • 200 请求成功
    • 404 请求失败:未找到希望被访问的资源,一般问题出在前端没问该该页面
    • 500 请求失败:服务器出现未知错误,一般问题在后台代码有异常
  4. get和post请求方式有什么不同?

    • get:请求数据显示在URL上,安全性较低;而请求数据大小有一定限制
    • post:请求数据显示在请求体中,安全性较高;而请求数据大小无限制
  5. 转发和重定向的区别

    • 转发:在服务器中进行跳转,只有一次请求,且转发时浏览器中的地址栏不发生变化,request域中数据并没有失效;
    • 重定向:在浏览器中进行跳转,为两次请求,且重定向时浏览器中地址栏地址栏发送变化,request域中数据失效(因为是两次请求,不同的request域)
  6. jsp的动态包含和静态包含的区别
    注:下文将包含有其它文件的jsp文件称为主体文件,比如上文中的index.jsp文件。将被包含的文件称为包含文件,比如上文中的header.jsp文件。

    1. <%@ include file=” ”%>是指令元素。是行为元素
    2. 最终编译成java文件的数目不同。
    3. 静态包含在转换成为java文件的时候将包含文件的内容“复制”到主体文件,然后作为一个整体编译。最终编译为一个java文件。
    4. 动态包含是各个jsp文件分别转换,分别编译。最终编程成多个java文件。
    5. 执行时间不同
    6. 静态包含发生在:JSP---->java文件阶段。
    7. 动态包含发生在:执行class文件阶段。动态加入。
    8. 静态包含在两个文件中不能有相同的变量,动态包含允许。
      • 由于静态包含相当于将包含文件内容直接复制到主体文件中,如果出现相同的变量,就会出现覆盖等问题,导致文件出错。而动态包含相当于调用不同的jsp,变量所在的空间不同,自然不会出现覆盖等现象。
    9. 无论是动态包含还是静态包含,其request对象都是相同的。也就是同一个request对象。
      • 静态包含最终编译成一个java文件,有一个request对象很好理解。而动态包含最终编译成多个jsp文件,为何会使用一个request对象呢?其实这些jsp组合的过程是一个请求转发的过程,自然也使用同一个request对象了。
  7. jsp四大作用域的特点

    • application:在所有应用程序中有效
    • session:在当前会话中有效
    • request:在当前请求中有效
    • page:在当前页面有效
  8. servlet的生命周期

    • 加载:servlet容器自动执行
    • 初始化 :init(),该方法会在Servlet被加载并实例化的时候执行,只执行一次
    • 服务:service(),具体实现的方法是doPost(),doGet()方法,调用几次就执行几次
    • 销毁:destroy(),Servlet被系统回收时执行,即关闭服务时执行
    • 卸载:servlet容器自动执行
  9. servlet的service方法和doGet,doPost方法的区别

    • service:可以处理get/post方式的请求,如果servlet 中有service方法,会优先调用service方法进行处理
    • doGet:处理get方法的请求
    • doPost: 处理post方法的请求
  10. 谈一谈MVC和三层架构

    • MVC:是一种设计模式
      • 视图层(View):用于展示页面
      • 模型层(Model):业务逻辑与数据访问
      • 控制层(Controller):接受请求,传入参数,返回响应
    • 三层架构:是一种开发模式
      • 表现层(UI):用于展示页面,接受请求,传入参数,返回响应
      • 业务逻辑层(BLL):对数据进行业务逻辑处理
      • 数据访问层(DAL):对数据库直接进行操作,访问数据库中数据
  11. 谈谈对封装,继承,多态的理解

    • 封装:隐藏对象的属性和实现细节,限制对对象的数据的访问权限,防止出现不安全的操作
      • private:表示私有,只有自己类能访问
      • default:表示没有修饰符修饰,只有同一个包的类能访问
      • protected:表示可以被同一个包的类以及其他包中的子类访问
      • public:表示可以被该项目的所有包中所有类访问
    • 继承:发生在类与类之间的关系中
      • Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
      • 类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)
      • 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
      • 被final修饰的类不能被继承
      • 抽象类只能用来继承
      • 可以使用内部类实现多继承
    • 多态:
      • 多态的三个条件:
        • 继承的存放
        • 子类重写父类的方法
        • 父类引用变量指向子类对象
      • 多态引用变量访问实例方法
        • 引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行他运行时所具有的方法。如Object p = new Person()则p只能调用Object类的方法,不能调用Person类里定义的方法,运行时则运行Person类里面重写Object的方法
      • 多态引用变量访问实例变量
        • 通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量
  12. 数组是属于java原生类还是对象?

    • 数组属于对象,Java中原生类(基本数据类型)只有8中:int,char,byte,boolean,double,float,short,long
  13. HashTable和HashMap的区别

    • HasTable线程安全,HashMap线程不安全
    • HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。
    • HashTable不支持key为null也不支持value为null;HashMap支持只有一个key为null,支持多个value同时为null
  14. HashMap的底层实现原理

    • HashMap的底层是通过哈希表实现的,是通过一个数组存放key,然后数组的每个单位都指向一个链表,然后通过key的值来访问指向的链表。当我们存入一个元素时(key-value),首先通过计算key值的hash值(通过地址来计算得出的数),确定key插入数组的位置,然后再将value插入到key所指向的链表中去
  15. Set,List,HashMap父接口分别是谁,Set和List的区别?

    • Set,List实现的父接口是Collection,HashMap实现的父接口是Map;
    • Set和List的区别
      • Set:元素无放入顺序,元素不可重复,重复元素会覆盖掉,检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
      • List:元素有放入顺序,元素可重复,和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
  16. Java遍历List集合for循环,foreach,迭代器的区别?

    • for循环:

       for(int i = 0 ; i < xx.length ; i++){}
      
    • foreach:

      for(String string : strings){}
      
    • 迭代器:

      	Iterator it = strings.iterator();
      			while(it.hasNext()){
      			String string = it.next();
      			}
      
  17. 接口和抽象类的区别

    • 接口里只能包含抽象方法和默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
    • 接口里不能定义静态方法;抽象类里面可以定义静态方法
    • 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态变量。
    • 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
    • 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
    • 一个类最多只能一个直接父类,包含抽象类;但一个类可以直接实现多个接口,通过实现多个接口可弥补Java单继承的不足
  18. 谈一谈检查型异常和非检查型异常。

    • 检查型异常:即编译时发生的异常,如找不到指定class异常等;若存在检查型异常则程序无法运行
    • 非检查型异常:即运行时发生的异常,如空指针异常等;若存在非检查型异常则程序可以运行,但运行到异常语句时停止并抛出异常
  19. equal方法和hashcode()方法有什么关联

    • 若重写了equals(Object obj)方法,则有必要重写hashCode()方法。
    • 若两个对象equals(Object obj)返回true,则hashCode()也必须返回相同的int数。
    • 若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。
    • 若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true。
    • 若两个对象hashCode()返回不同int数,则equals(Object obj)一定返回false。
    • 同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。
    • equals()方法是用于比较对象的内容是否相等。
    • hashcode方法只有在集合中用到,将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals()方法判断要放入对象与集合中的任意一个对象是否相等,如果equals()判断不相等,直接将该元素放入到集合中,否则不放入。
  20. String,StringBuffer,StringBuilder的区别

    • String:不可变的字符串序列,存放在常量池中。
    • StringBuffer:可变的字符串序列,线程较为安全,但是性能相对较低。
    • StringBuilder:可变的字符串序列,线程较为不安全,但速度较快,性能相对较高。
  21. toString()和String.valueof()的区别

    • 若传入参数为null,toString则会报空指针异常,而String.valueof()则返回null,所以一般参数为字符串类型首选String.valueof()。
  22. 如何防止sql注入,preparedstatement和statement有何区别?

    • SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
    • Statement:用于执行SQL语句的工具接口。该对象既可用于执行DDL,DCL语句,也可以用于执行DML语句,还可以用于执行SQL查询。当执行SQL查询时,返回查询到的结果集。
    • PreparedStatement:预编译的Stament对象。PreparedStatement是Statement的子接口,他允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句,因此性能更好。相对于Statement而言,使用PreparedStatement执行SQL语句,无须在传入SQL语句,只要为预编译的SQL语句传入参数即可,有效的防止的SQL注入。
    • 防止SQL注入:使用存储过程来执行所有的查询;检查用户输入的合法性;将用户的登录名、密码等数据加密保存。
  23. mysql的索引有哪几种类型?

    • 普通索引
    • 唯一索引
    • 主键索引
    • 组合索引
    • 全文索引
  24. 了解jdk1.8新特性吗,有哪些,项目中用到了哪些jdk1.8新特性

    • Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
    • 方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
    • 默认方法:默认方法就是一个在接口里面有了一个实现的方法。
    • 新工具:新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
    • Stream API:新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
    • Date Time API: 加强对日期与时间的处理。
    • Optional 类:Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
    • Nashorn, JavaScript 引擎:Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
  25. 了解泛型吗,谈谈泛型的类型擦除

    • 泛型擦除:下面的情况就是泛型擦除造成的,因为不管是 ArrayList 还是 ArrayList,在编译时都会被编译器擦除成了 ArrayList。目的是要避免在创建泛型实例时而创建新的类,从而避免运行时的过度消耗。
	Class c1 = new ArrayList().getClass();
	Class c2 = new ArrayList().getClass();
	System.out.println(c1 == c2);
	输出结果是:true

你可能感兴趣的:(Java基础,Java后台面试题)