最全Java面试题(一)

一、基础篇

1.1 java基础

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

 

 

  • final, finally, finalize 的区别

 

          final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
          finally是异常处理语句结构的一部分,表示总是执行。
          finalize是 Object类的一个方法,在垃圾收集器执行的时候,会调用被回收对象的此方法,可以覆盖此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。

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

          Throwable是Java错误处理的父类,有两个子类:Error和Exception 

          Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的

          Exception:可恢复捕捉的。java健壮程序的手段。

          checked exception (编译时被检查的异常):JAVA编译器强制要求我们必需对出现的这些异常进行catch或throws。所以,面对这种异常不管我们是否愿意,只能写一大堆catch块或throws去处理可能的异常。IO异常,以及SQL异常等。

         runtime exception:编译通过,但运行通不过,出现RuntimeException,通常是程序员出错。虚拟机接管会终止线程或主程序。如错误的类型转换、数组越界访问和访问空指针等

  • 请写出5种常见到的runtime exception

          数组下表越界,空指针,类找不到,类型转换异常,算术异常

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

           1)Integer是int的包装类;int是基本数据类型; 
           2)Integer变量必须实例化后才能使用;int变量不需要; 
           3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 
           4)Integer的默认值是null;int的默认值是0。

            Integer的值缓存范围-128到127

  • 包装类,装箱和拆箱

 

            一个可以将基本数据类型封装成对象的类则称为包装类。

            所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。              所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。               

  • String、StringBuilder、StringBuffer

 

 

          String 字符串常量
          StringBuffer 字符串变量(线程安全)
          StringBuilder 字符串变量(非线程安全)

  • 重载和重写的区别

 

 

       重载:

         1) 方法名相同;

         2) 参数不同;

         3) 返回类型可同可不同;

      重写:

        1) 发生在父子类间;

        2) 方法名相同;

        3) 参数相同;

        4) 返回类型相同;

        5) 修饰符不能越来越小;

        6) 异常不能越来越大。

  • 抽象类和接口有什么区别

 

 

        第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
        第二点. 接口可以多继承,抽象类不行
        第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
        第四点. 接口中基本数据类型为static 而抽类象不是的。

  • 说说反射的用途及实现

 

 

       Java反射机制是一个非常强大的功能,在很多的项目比如Spring,Mybatis都都可以看到反射的身影。通过反射机制,我们可以在运行期间获取对象的类型信息。利用这一点我们可以实现工厂模式和代理模式等设计模式,同时也可以解决java泛型擦除等令人苦恼的问题。

       获取一个对象对应的反射类,在Java中有三种方法可以获取一个对象的反射类,

             通过getClass()方法

             通过Class.forName()方法;

            使用类.class;

            通过类加载器实现,getClassLoader()

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

           跟踪代码的依赖性,实现代替配置文件的功能。比较常见的是Spring等框架中的基于注解配置。

           还可以生成文档常见的@See@param@return等。如@override放在方法签名,如果这个方法 并不是覆盖了超类方法,则编译时就能检查出。

            使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节,在定义注解时,不能继承其他注解或接口。

  • HTTP请求的GET与POST方式的区别         

    get请求 

           请求可被缓存

           请求保留在浏览器历史记录中

           请求可被收藏为书签

           请求不应在处理敏感数据时使用

           请求有长度限制

           请求只应当用于取回数据

   post请求

           

  • Session与Cookie区别
    1. cookie数据存放在客户的浏览器上,session数据放在服务器上。
    2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
    3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
    4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
    5. 所以个人建议:
      将登陆信息等重要信息存放为SESSION
      其他信息如果需要保留,可以放在COOKIE中
  • 列出自己常用的JDK包                        

                       1、java.lang

                       2、java.sql

                       3、java.io

                       4、java.math

  • MVC设计思想

 

 

                      用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

        DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

        DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

                     提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

                     HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

                     数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

                     数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

                     数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

                    Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

                    根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

                   ViewResolver 结合Model和View,来渲染视图

                   将渲染结果返回给客户端。

  • equals与==的区别

 

 

            1、使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。

            2、==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现

            3、字符串的对比使用equals()代替==操作符

           其主要的不同是一个是操作符一个是方法,==用于对比原生类型而equals()方法比较对象的相等性。

  • hashCode和equals方法的区别与联系

 

 

          equels方法用于比较对象的内容是否相等(覆盖之后)

          hashcode方法只有在集合中用到

         将对象放入集合中,首先比较要放入集合中的对象的hashcode与集合中的元素的hashcode是否相等,如果不相等,可以直接放入集合中,若是相等,则需要通过equels方法进行判断,若是相等,则不放入集合,不相等,放入集合中。

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

 

 

        我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。

  • Object类中常见的方法,为什么wait  notify会放在Object里边?        

           简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。

           专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

            也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。

  • Java的平台无关性如何体现出来的

 

 

 

  • JDK和JRE的区别

 

 

             JDK,开发java程序用的开发包,JDK里面有java的运行环境(JRE),包括client和server端的。需要配置环境变量。。。。

             JRE,运行java程序的环境,JVM,JRE里面只有client运行环境,安装过程中,会自动添加PATH。

转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485315&idx=1&sn=75153fe91a19d1b299fd849a11e7d1d7&chksm=e9c5fe32deb27724953cf976a8eda562c08154df725998ee1e07a00460613e9dd57411ef0caf&mpshare=1&scene=23&srcid=0725JakZ8UooC3jr8phkQdQ0#rd

 

posted @ 2018-07-25 16:09  天晴、、、  阅读(101)  评论(0编辑  收藏  举报