最全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区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 所以个人建议:
将登陆信息等重要信息存放为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