2021 最新版Java开发面试题

本文详细梳理了Java、JavaWeb、数据库、前端、后端框架、高级部分等多个领域的面试重点,涵盖Java跨平台原理、环境搭建、数据类型、面向对象特征、线程并发库、Servlet生命周期、数据库事务ACID特性、ORM框架、MyBatis与Hibernate区别、缓存技术、Redis使用场景等关键知识点,是Java开发者面试必备参考资料。
摘要由CSDN通过智能技术生成

一、Java

1、Java跨平台原理

详细说明:

​ 由于各操作系统支持的指令集,不是一致的、会让我们的程序在不同的操作系统上执行不同的代码。而Java开发了适用于不同操作系统及位数的Java虚拟机来屏蔽个系统之间的差异、提供统一接口。对于Java开发者来说,只需在不同的系统上安装对应的不同Java虚拟机,这时我们的Java程序只需遵循Java规范即可在所有系统上运行。

简单说明:

​ Java通过不同的系统、版本、和位数的虚拟机来屏蔽不同的系统指令及差异而对外统一接口API、对于开发者来说,只需按照接口开发即可,如果系统部署到不同环境时,只需在系统上安装对应版本的虚拟机即可。

2、搭建Java开发环境的步骤

Java环境需要啥?

  1. 开发环境的JDK
  2. 开发工具
  3. Web服务器

一、下载组件

二、安装JDK,配置JAVA_HOME变量,因为开发工具和服务器需要依赖该变量。

3、int占几个字节?

Java中有几种数据类型? 8种

int占4位字节、二进制32位数;

在这里插入图片描述

4、面向对象的特征

四大特征:封装、继承、抽象、多态

​ 封装:将类的信息封装到类内部、不允许外部程序访问、而是通过该类提供的get/set方法来实现对隐藏信息的操作和访问,通过private 来隐藏;

​ 继承:将子类中共有的属性和方法提取到父类、通过extends继承父类、使用继承时必须符合is-a的关系,java只能单继承、Object类是java中的基类、所有类默认继承该类、子类不能继承到的有使用private修饰的属性和方法、父类构造、默认访问修饰符并不在同包中。

​ 抽象:使用abstract修饰的类为抽象类,目的是限制该类实例化(不能new)。

​ 多态:指同一个引用类型,使用不能的实例而执行不同的操作。

5、有了基本数据类型,为啥还需要包装类?

java提供了8种基本数据类型:byte、short、int、long、float、double、char、boolean

包装类:每个基本数据类型都会对应一个包装类、比如:int–>Integer。

装箱和拆箱

装箱:将基本的数据类型转换成对应的包装类。比如:

​ Integer i = 1; 自动装箱,在编译时会调用valueOf(值)方法来装箱;

拆箱:将包装类转换为对应的基本数据类型、比如:

​ 基本数据类型 变量名 = 对应包装类;自动拆箱,在编译时调用intValue()

Integer i = 1; // 自动装箱

Integer.valueOf(2); // 手动装箱

int j = i;  // 自动拆箱

int j = i.intValue(); // 手动拆箱

为什么需要?

​ Java是面向对象的语言、而基本数据类型、不具备面向对象的特征。

​ 基本数据类型没有好的方法,不能判断是否为空或最大最小值、缓存值。

缓存值:

Integer i = 1;
Integer j = 1;
System.out.println(i==j);
// 结果为true

6、"=="和equals()的区别?

==

​ 比较两个变量之间的值是否相等、但是变量分为基本数据类型和引用类型、

​ 如果是基本数据类型的变量会比较变量值是否相等返回boolean类型。

​ 如果是引用类型而会判断它的内存地址是否相等。

equals()

​ 比较两个对象的某些特征是否一致。

7、String、StringBuilder的区别?StringBuffer和StringBuilder的区别?

java中提供的三个类String、StringBuilder、StringBuffer都表示操作字符串的。

  • String:是内容不可变的字符串。底层使用了不可变的字符数组(final char[])

  • StringBuilder、StringBuffer :是内容可变的字符串。底层使用了可变的字符数组(没有final修饰)。

    拼接字符串的效率:

    1. String:拼接 String str = “a” + “b”; 这是三个对象。效率低;

    2. StringBuilder或StringBuffer。效率高;

      StringBuilder sb = new StringBuilder().sb.append(“a”).append(“b”);

    3. 拼接字符串不能用String、要用StringBuilder、StringBuffer。

  • StringBuilder线程不安全、效率高。

  • StringBuffer线程安全,效率低。

8、Java中的集合

java中的集合分为value、key-value(Conllection、Map)两种。

存储值分为:List和Set。

List和Set的区别:

List:有序、可重复。

Set:无序、不可重复。根据equals和hashCode判断、如果一个对象要存储在Set中,必须重写equals和hashCode方法。

存储key-value的为Map。

9、ArrayList和LinkedList的区别?

List常用的有ArrayList和LinkedList。

先说数据底层实现原理、再说区别、场景。

  • ArrayList底层使用数组。
  • LinkedList底层使用链表。
  • 数组和链表的区别:
    • 数组:有索引查询快、插入和删除或修改比较慢。
      • 原因:数组在内存中有一块专门的内存,如果插入或删除时需要移动内存。
    • 链表:不要求地址内存是连续的,在当前元素中存放上一个或下一个元素的地址。
      • 查询时要从头部开始,逐个查询,所以查询效率低。
      • 插入时不用移动内存,只需改变引用指向即可,所以插入或删除效率高。
  • ArrayList使用在查询比较多,插入和删除较少的情况。
  • LinkedList使用在查询比较少,插入和删除较多的情况。

10、HashMap和HashTable的区别?HashTable和ConcurrentHashMap的区别?

HashMap和HashTable

  1. 相同点:都可用来存储key-value的数据。

    区别:

  2. HashMap可把null作为key或value的。HashTable是不可的。

  3. HashMap是线程不安全的、效率高。HashTable是线程安全的,效率低。

想线程安全又想效率高?

通过把整个Map分为多个Segnent(类似HashTable)可提供相同的线程安全,效率提升N倍、默认提升16倍。

11、实现拷贝文件的工具类使用字节流还是字符流?

首先明白什么是字节流和字符流?

  • 字符流:传递字符,字符最终会转换为字节
  • 字节流:传递二进制位字节。

拷贝文件不确定只包含字符流,有可能有字节流(图片、音频等),为考虑通用性,使用字节流。

12、线程

实现线程的方式?

  1. 继承Thread类,重写run方法,实现一个线程。

  2. 实现Runnable接口实现一个线程。

    继承缺点:继承扩展性不强,java只支持单继承,如果一个类继承了Thread类就不能继承其他类了。

如何启动线程?

Thread thread = new Thread(继承的Thread对象/实现Runnable对象);
thread.start();

启动线程使用start()方法,启动后执行的是run()方法。

如何区分线程?

问题:在一个系统中多个线程,每个线程都会打印日志,如何区分是那个线程打印的?

thread.setName("设置一个线程名");

在创建Thread对象时通过setName()方法设置一个线程名,这是一种规范,都要设置名称。

什么是线程并发库?

JDK5中增加了DougLea的并发库,方便了线程的管理和使用提供了便利性。

java.util.current包中提供了对线程优化,管理的各项操作,该包提供了线程的运行,线程池的创建,线程生命周期的控制。

通过Executors类提供四种静态方法可创建线程池:

  1. newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线程。
  2. newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. newScheduledThreadPool:创建一个定长线程池,支持定时及周期任务执行。
  4. newSingleThreadExecutor:创建一个单线程化的线程池,只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。(FIFO、LIFO,优先级)

线程池的作用?

  1. 限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃、
  2. 提供了附加功能,比如定时,延时来执行某些线程。

13、什么是设计模式?常用的设计模式有什么?

设计模式就是经过前人的多次实践总计出的,设计过程中可反复使用的,可解决特定问题的设计方法。

  1. 单例模式(饱汉模式、饥汉模式)

    1、构造方法私有化、除了自己的类中能创建外其它地方都不能创建。

    2、在自己的类中创建一个单实例(饱汉模式是一出来就创建单实例,饥汉模式需要的时候才会创建)

    3、提供一个方法获取该实例对象(创建时需要进行方法同步)

  2. 工厂模式:SpringIOC、对象的创建交给一个工厂去创建,无需自己创建。

  3. 代理模式:SpringAOP动态代理

  4. 包装模式

二、JavaWeb

1、get和post的区别?

共同点: get和post都是http的请求方式,用户通过不同的请求方式完成对url的不同操作。

区别:

​ 1、get提交的数据在地址栏显示、post提交的数据在地址栏中不显示。

​ get请求以?分割URL,多个参数用&号拼接。

​ 2、get请求对地址长度输入有限制、post无限制。

​ 3、post安全性比get高。

2、什么是Servlet?

Servlet是用Java编写的服务器端程序、这些Servlet都要实现Servlet接口、主要用于数据交互、生成动态网页内容、运行于支持java的应用服务器中。

HttpServlet重写doGet和doPost方法或重写service方法完成对get/post请求的响应。

3、Servlet的生命周期

  1. 加载和实例化

    将Servlet部署到容器中,容器启动后接受请求时,容器会在内存中查找是否有该Servlet实例,如果没有则创建,如果有直接取出响应请求,执行一次。

  2. 初始化

    实例化完容器调用init()方法初始化、将Servlet处理请求前完成的一些资源加载,jdbc连接等,执行一次。

  3. 就绪状态(服务)

    接收请求时调用service()方法、根据请求类型调用doGet()/doPost()方法、执行多次。

  4. 销毁

    容器会判断Servlet是否要被资源回收、调用destroy()方法指明哪些资源回收。

简单描述:

  1. 调用构造,实例化,一次。
  2. 调用init()、初始化,一次。
  3. 调用service()、根据请求类型调用doGet()/doPost(),多次。
  4. 当服务器重启或关闭时,调用destroy()进行资源回收。

4、forward()与redirect()的区别?

forward():在服务器上执行、浏览器的地址栏URL不变、数据不丢失、一次请求。

redirect():在客户端上执行、浏览器的地址栏URL改变、数据会丢失、两次请求。

5、JSP和Servlet有什么区别?有什么关系?

JSP是Servlet的扩展,所有JSP文件都会被翻译为一个继承HttpServlet的类。

JSP主要用于视图样式、Servlet主要用于逻辑控制。

Servlet如果要实现HTML功能、需要使用Writer输出HTML标签太麻烦、而JSP是Java和HTML组合为一个扩展名为.jsp的文件、做页面展示比较方便而嵌入逻辑比较复杂。

6、JSP有哪些内置对象?分别有什么作用域和方法?

9个内置对象:

  1. request:客户端请求信息、包含get/post请求参数。
  2. response:服务器响应给客户端的信息。
  3. pageContext:页面属性管理jsp页面。
  4. session:一次会话、关闭浏览器结束。
  5. application:整个应用程序。
  6. out:页面输出数据
  7. config:本质是一个ServletConfig对象。
  8. page:当前页
  9. exception:异常页面对象。

四大作用域:

  1. page:在当前页面使用
  2. request:每次新的请求都会创建request对象、一次转发时使用。
  3. session:再一次会话期内有效。
  4. application:服务器启动时。

常用方法:

setAttribute(String key , Object value):key-value、存储在request或session中。

getAttribute(String key):通过key取value。

removeAttribute():从作用域中删除key

invalidate():设置session立即失效。

getRequestDispatcher("*.jsp").forward(request,response);转发

sendRedirect("*.jsp"):重定向;

7、Session和Cookie的区别?分别在项目哪里使用?

session和cookie都是会话跟踪技术。Cookie通过在客户端记录信息确定用户身份。

Session通过在服务器端记录信息确定用户身份、但Session的实现依赖于Cookie、sessionId(session唯一标示存放在客户端)。

区别:

session: 在服务器上保存数据、类型为Object、会话结束后数据销毁、保存重要数据。

cookie: 在客户端上保存数据、类型为String、长期保存在客户端、保存不重要的数据。

​ 单个cookie保存的数据不超过4K、很多浏览器都限制一个站点最多保存20个cookie

8、MVC的部分有哪些技术来实现?

  • M(Model)模型:JavaBean
  • V(View)视图:JSP、html、freemaker、volicity…
  • C(Controller)控制器:Servlet、Action

三、数据库

1、数据库的分类

数据库分为:关系型数据库和非关系型数据库

常用的关系型数据库

  1. MySql 免费
  2. Oracle 收费
  3. SqlServe
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值