美文网首页
java面试题

java面试题

作者: 梦兮丨花已落 | 来源:发表于2020-07-05 22:12 被阅读0次

    1. JDK 和 JRE 有什么区别?

    JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境

    JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

    2. == 和 equals 的区别是什么?

    == 解读

    对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

    基本类型:比较的是值是否相同;

    引用类型:比较的是引用是否相同;

    equals 解读

    equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较

    3. String 属于基础的数据类型吗?

    String 不属于基础类型,基础类型有 8 种:byte 、boolean、char、short、int、float、long、double,而 String 属于对象。

    4. StringBuffer 和 StringBuilder 的区别?

    StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,

    但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

    5. 普通类和抽象类有哪些区别?

    普通类不能包含抽象方法,抽象类可以包含抽象方法。

    抽象类不能直接实例化,普通类可以直接实例化。

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

    实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

    构造函数:抽象类可以有构造函数;接口不能有。

    main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

    实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

    访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

    7. java 中 IO 流分为几种?

    按功能来分:输入流(input)、输出流(output)。

    按类型来分:字节流和字符流。

    字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

    8. Collection 和 Collections 有什么区别?

    java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

    Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

    9. HashMap 和 Hashtable 有什么区别?

    hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。

    hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。

    hashMap允许空键值,而hashTable不允许。

    10. Array 和 ArrayList 有何区别?

    Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

    Array是指定大小的,而ArrayList大小是固定的。

    Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

    11. 迭代器 Iterator 是什么?

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

    12. 动态代理是什么?有哪些应用?

    动态代理:

    当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

    动态代理的应用:

    Spring的AOP

    加事务

    加权限

    加日志

    13. 怎么实现动态代理?

    首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

    14. jsp 和 servlet 有什么区别?

    jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

    jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

    Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

    Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

    15. jsp 有哪些内置对象?作用分别是什么?

    JSP有9个内置对象:

    request:封装客户端的请求,其中包含来自GET或POST请求的参数;

    response:封装服务器对客户端的响应;

    pageContext:通过该对象可以获取其他对象;

    session:封装用户会话的对象;

    application:封装服务器运行环境的对象;

    out:输出服务器响应的输出流对象;

    config:Web应用的配置对象;

    page:JSP页面本身(相当于Java程序中的this);

    exception:封装页面抛出异常的对象。

    16. 说一下 jsp 的 4 种作用域?

    JSP中的四种作用域包括page、request、session和application,具体来说:

    page代表与一个页面相关的对象和属性。

    request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。

    session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。

    application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

    17. 说一下 session 的工作原理?

    其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。

    18. throw 和 throws 的区别?

    throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。

    19. final、finally、finalize 有什么区别?

    final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。

    finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。

    finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize(),回收垃圾。

    20. 为什么要使用 spring?

    1.简介

    目的:解决企业应用开发的复杂性

    功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

    范围:任何Java应用

    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    2.轻量

    从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

    3.控制反转

    Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

    4.面向切面

    Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

    5.容器

    Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

    6.框架

    Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

    所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

    21. 解释一下什么是 aop?

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

    22. spring 有哪些主要模块?

    Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

    23. spring 常用的注入方式有哪些?

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

    构造方法注入

    setter注入

    基于注解的注入

    24. spring 中的 bean 是线程安全的吗?

    Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

    25. spring 自动装配 bean 有哪些方式?

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

    spring中bean装配有两种方式:

    隐式的bean发现机制和自动装配

    在java代码或者XML中进行显示配置

    当然这些方式也可以配合使用

    26. spring 事务实现方式有哪些?

    编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

    基于 TransactionProxyFactoryBean 的声明式事务管理

    基于 @Transactional 的声明式事务管理

    基于 Aspectj AOP 配置事务

    27. spring mvc 有哪些组件?

    Spring MVC的核心组件:

    DispatcherServlet:中央控制器,把请求给转发到具体的控制类

    Controller:具体处理请求的控制器

    HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略

    ModelAndView:服务层返回的数据和视图层的封装类

    ViewResolver:视图解析器,解析具体的视图

    Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

    28. mybatis 中 #{}和 ${}的区别是什么?

    #{}是预编译处理,${}是字符串替换;

    Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

    Mybatis在处理${}时,就是把${}替换成变量的值;

    使用#{}可以有效的防止SQL注入,提高系统安全性。

    29. 说一下 mybatis 的一级缓存和二级缓存?

    一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

    二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/> ;

    30. 数据库的三范式是什么?

    第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。

    第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。

    第三范式:任何非主属性不依赖于其它非主属性。

    31. float 和 double 的区别是什么?

    float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。

    double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

    32. mysql 的内连接、左连接、右连接有什么区别?

    内连接关键字:inner join;左连接:left join;右连接:right join。

    内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

    33. mysql 索引是怎么实现的?

    索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。

    具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。

    34. 如何做 mysql 的性能优化?

    为搜索字段创建索引。

    避免使用 select *,列出需要查询的字段。

    垂直分割分表。

    选择正确的存储引擎。

    35. 说一下 jvm 的主要组成部分?及其作用?

    类加载器(ClassLoader)

    运行时数据区(Runtime Data Area)

    执行引擎(Execution Engine)

    本地库接口(Native Interface)

    组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

    36. 队列和栈是什么?有什么区别?

    队列和栈都是被用来预存储数据的。

    队列允许先进先出检索元素,但也有例外的情况,Deque 接口允许从两端检索元素。

    栈和队列很相似,但它运行对元素进行后进先出进行检索。

    37. java 中都有哪些引用类型?

    强引用

    软引用

    弱引用

    虚引用(幽灵引用/幻影引用)

    38. 说一下 jvm 有哪些垃圾回收算法?

    标记-清除算法

    标记-整理算法

    复制算法

    分代算法

    相关文章

      网友评论

          本文标题:java面试题

          本文链接:https://www.haomeiwen.com/subject/xcmbqktx.html