Java后端技术面试汇总------基础篇

 

  1. 面向对象的特征:继承、封装和多态

继承:A类继承B类之后可以使用A类中所有的非私有的构造方法和属性,可以实现对B类的扩展。

封装:封装简单一点理解就是把处理同一个部分或者同一个模块的代码抽取出来放到一个方法中。

多态:声明对象的时候左右两边类型不一致则为多态,对象的类型一定为父类,实际类型为该类的子类,编译的时候看父类运行的时候看子类,即编译的时候看父类有没有这哥方法,有的话即编译通过,运行的时候如果子类也有这个方法,则实际运行的时候运行的是子类的方法。

 

     2.final, finally, finalize 的区别

final:可以修饰类、方法、以及变量。修饰类的时候该类为最终类,不可被继承,例如String类。修饰方法的时候该方法不可被重写。修饰变量的时候该变量只可以被初始化一次。

finally:用于try-catch-finally 结构中,即捕获异常的情况下,finally块中的代码一定会执行(在不考虑虚拟机异常关闭的情况下)一般都用执行一些操作的资源回收操作。例如IO、connection等资源的释放。

finalize:用于声明对象销毁时候执行的方法,释放这个对象拥有的相关资源。

 

      3.Exception、Error、运行时异常与一般异常有何异同

异常分类结构图:

Java后端技术面试汇总------基础篇_第1张图片

Exception类跟Error类的父类都为Throwable类,Error类下面主要是一些由于虚拟机错误或者代码执行不当引起的错误,常见的有内存溢出错误和栈溢出错误。Exception类下面则有IOException和RuntimeException两大类,IOException一般都是对文件或者一些其它资源进行读写造成的错误。RunTimeException则是一些代码运行过程中才会产生的错误,常见的有NPE(NullPointException空指针)、ArrayIndexOutOfBoundsException(数组下标越界)、ClassNotFoundException(class文件找不见)、NumberFormatException (String转换为指定的数字类型异常)、ArithmeticException(算术运算异常 如除数为0)等。

 

        4.请写出 5 种常见到的 runtime exception

           IndexOutOfBoundsException(下标越界异常) 
           NullPointerException(空指针异常) 
           NumberFormatException (String转换为指定的数字类型异常) 
           ArithmeticException -(算术运算异常 如除数为0) 
           ArrayStoreException - (向数组中存放与声明类型不兼容对象异常) 
           SecurityException -(安全异常)

 

        5.int 和 Integer 有什么区别,Integer 的值缓存范围

Integer为int的包装类,每种基本类型都会对应一种包装类型。

基本类型 二进制位数 包装类
boolean 1 Boolean
byte 8 Byte
char 16 Character
short 16 Short
int 32 Integer
long 64 Long
float 32 Float
double 64 Double

 

 

 

 

 

 

 

 

 

         Integer值缓存 范围:-128~127,这种缓存值的思想来源于一种设计模式叫享元模式,在使用的时候会运用到缓存机制,带来明显的性能提升感兴趣的小伙伴可以自己了解一下。

 

       6.包装类,装箱和拆箱

包装类在第五个目录中已经列出,下面解释一下关于自动装箱和自动拆箱的问题。自动装箱指的是变量在使用过程中两种变量类型的自动转换。基本类型到包装类型的转换称为自动装箱,包装类型到基本类型的装欢称为自动拆箱。

 

        7.String、StringBuilder、StringBuffer

String:很常用的一个字符串类,该类被final关键字修饰,在变量声明之后内容不可改变,我们平常在在改变变量内容的时候实际上是新创建了一个字符串变量,这样一来就导致在需要大量拼接字符串的场景下会需要频繁的创建字符串对象,会导致计算机性能开销很大,这个时候就引入了两个用于字符串拼接的类StringBuilder和StringBuffer。

StringBuilder:线程安全,效率很高,用于字符串拼接,每次拼接之后的返回值为该对象本身,也就是可以重复调用该对象的append()方法对字符串进行拼接,此处使用的实际模式为责任链模式。

StringBuffer:线程不安全,效率较StringBuilder较低(差距很小,可以忽略),较String高很多。用于字符串拼接,每次拼接之后的返回值为该对象本身,也就是可以重复调用该对象的append()方法对字符串进行拼接,此处使用的实际模式为责任链模式。

 

          8.重载和重写的区别

           参数列表:包括方法返回值、类型、顺序。

重载:发生在同一个类中,方法名称相同,参数列表不同。

重写:发生在父子类之间,方法名称相同,参数列表也相同。

 

         9.抽象类和接口有什么区别

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

          10.说说反射的用途及实现

个人认为反射、注解、动态代理为javaz中最为核心的技术点,灵活运用这三种技术可以实现很多很多的功能。话说回来反射的用途的话,个人认为反射是很多框架的灵魂,例如spring的IOC,mybatis的dao层实现类的动态代理的过程中也要用到反射。几乎一切框架都要用到反射,非常强力的一功能。

实现:

Foo foo = new Foo();

第一种:通过Object类的getClass方法

1

Class cla = foo.getClass();

第二种:通过对象实例方法获取对象

1

Class cla = foo.class;

第三种:通过Class.forName方式

1

Class cla = Class.forName("xx.xx.Foo");

 

         11.说说自定义注解的场景及实现

自定义注解的话这个东西博主只在学习过程中用到过,并没有在工作中接触过(可能是由于工作经验较少)。一般情况下自定义注解会出现的场景呢就是自定义框架,在自定义框架的时候会自己定义一些注解来实现一些功能。或者在已有框架的基础上增加一些功能的时候也可以使用自定义注解。

 

         12.HTTP 请求的 GET 与 POST 方式的区别

           1.get是从服务器上获取数据,post是向服务器传送数据。

           2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

           3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

           4.get传送的数据量较小,不能大于1KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。(这里有看到其他文章介绍get和post的传送数据大小跟各个浏览器、操作系统以及服务器的限制有关)

           5.get安全性非常低,post安全性较高。

 

         13.Session 与 Cookie 区别
            1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
            2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
            3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
            4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
            5、 cookie 和session 的联系:session是通过cookie来工作的

          14.列出自己常用的 JDK 包

               java.lang: 这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package

               java.io: 这里面是所有输入输出有关的类,比如文件操作等

              java.net: 这里面是与网络有关的类,比如URL,URLConnection等。

              java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。

             java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet等

           14.MVC (model view controller)设计思想

          (1)什么是mvc?

          是一种软件架构的思想,将一个软件按照模型、视图、控制器进行划分。其中,模型用来封装业务逻辑,视图用来实现表示逻辑,控制器用来协调模型与视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示 处理结果)。
        1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
        2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。
        3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。

Java后端技术面试汇总------基础篇_第2张图片

        (2)为什么要使用mvc?
        1)使用mvc的思想来设计一个软件,最根本的原因是为了实现模型的复用:
            a,模型不用关心处理结果如何展现。
            比如,模型返回一些数据,然后交给不同的视图来展现(表格的方式、图形的方式等等)。
            b,可以使用不同的视图来访问同一个模型。
        2)代码的维护性更好
            修改模型不会影响到视图,反过来,修改视图,也不会影响到模型(低耦合)。
        3)方便测试
            比如,将业务逻辑代码写在servlet里面,需要部署到容器上,然后才能测试。而将业务逻辑代码写在java类里面,可以直接用main()测试(不依赖容器)。

 

         15.equals 与==的区别

==:比较的是值。(基本类型直接比较变量的值,引用类型比较的是该对象的地址)

equals:基本类型没有此方法,引用类型调用此方法的时候比较的是变量对应内存地址指向空间中的数据。(如果没有重写超类Object中的equals方法的话比较结果很"=="比较结果是一样的)

 

16.hashCode 和 equals 方法的区别与联系

         equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

         hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

        对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

 

17.什么是 Java 序列化和反序列化,如何实现 Java 序列化?或者请解释 Serializable 接口的作用

序列化:指把数据从内存中持久化到硬盘上或者其它存储设备中。

反序列化:指把数据从硬盘或者其它存储设备加载到内存中。

实现java序列化:使用ObjectOutPutStream对象的writeObject(Object obj)方法就可以将obj对象保存到硬盘上。

实现反序列化:使用ObjectOutPutStream对象的readeObject()方法就可以将obj对象从硬盘上恢复到内存中且状态也恢复。

Serializable接口的作用:

1)、可以将对象状态进行保存或者进行网络传输。

2)、可以进行灾备(持久化到硬盘上,出错的时候可以恢复之前状态)。

你可能感兴趣的:(面试总结)