Java面试题真题·技术面试题部分总结

系列文章目录

Java面试题真题·技术面试题部分总结
Java面试题真题·非技术面试题部分总结
Java面试题真题·项目介绍部分总结



前言

本文总结了一些常见的技术面试题


技术问题

Java的跨平台原理

Java具有一次编译,跨平台运行 的特点。就是说编译后形成的字节码文件可以跨平台运行,只要该平台具有相应的Java虚拟机。
Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口。
字节码文件不面向任何具体平台,只面向虚拟机。 虚拟机先将字节码文件解释成机器码,在交给操作系统运行,从而实现了跨平台。

String常用方法

length():返回字符串的长度。
equals(Object obj):比较两个字符串是否相等。
format(String format, Object… args):将指定的字符串格式化为特定的格式。
substring(int beginIndex, int endIndex):返回从指定索引开始到指定索引结束的子字符串。
lastIndexOf(String str):返回指定字符串在原字符串中最后一次出现的索引。
concat(String str):将指定的字符串连接到原字符串的末尾。
trim():去除字符串前后的空格。
isEmpty():检查字符串是否为空。

分布式的优点

Java在分布式系统开发中具有以下几个优点:
1、平台独立性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行。这使得Java成为构建分布式系统的理想选择,因为可以在不同的服务器上部署Java应用程序,实现跨平台的分布式部署。

2、多线程支持:Java提供了丰富的多线程支持,可以轻松地实现并行处理和分布式计算。Java的线程模型可以很好地适应分布式环境,方便开发者编写并发代码,并充分利用分布式系统的资源。

3、面向对象编程:Java是一种面向对象的编程语言,强调代码的封装性、可重用性和可扩展性。这使得在分布式系统中,可以更好地组织和管理代码,减少代码的耦合性,提高系统的可维护性和可扩展性。

4、强大的网络编程库:Java提供了丰富的网络编程库,如Java Socket、RMI(远程方法调用)、JNDI(Java命名和目录接口)等。这些库使得在分布式系统中进行网络通信和远程调用变得更加简单和高效。

5、成熟的开发框架和工具:Java生态系统中有许多成熟的分布式开发框架和工具,如Spring、Apache Dubbo、Apache ZooKeeper等。这些框架和工具提供了大量的功能和工具,简化了分布式系统的开发和部署过程,提高了开发效率。

6、安全性和稳定性:Java具有强大的安全性和稳定性,拥有严格的权限管理和异常处理机制。这使得Java应用程序在分布式环境中更加可靠和安全,能够有效地防止安全漏洞和系统崩溃。

综上所述,Java在分布式系统开发中具有平台独立性、多线程支持、面向对象编程、强大的网络编程库、成熟的开发框架和工具,以及安全性和稳定性等优点,使得它成为构建分布式系统的首选语言之一。

对cookie有什么了解,Cookie和Session的区别

Cookie是一种在客户端存储数据的机制,存储在浏览器的本地文件系统中。它主要用于在客户端和服务器之间传递和存储用户相关的信息。Cookie的特点是存储容量有限、不安全性和跨域限制。
Session是在服务器端维护的一种机制,用于存储用户的会话信息。它将数据保存在服务器的内存或数据库中,相对较安全。Session的特点是服务器端存储、安全性较高、可扩展性和用户状态跟踪。
区别:
1、存储位置:Cookie存储在客户端,Session存储在服务器端。
2、安全性:Cookie的数据传输不安全,Session的数据存储在服务器端,相对安全。
3、存储容量:Cookie有限制,Session可以存储较大数据。
4、跨域限制:Cookie可以跨域共享,Session在同一域名下有效。
在实际应用中,Cookie和Session可以结合使用,提供更安全和高效的用户体验。

最熟悉jdk哪个版本

我最熟悉的JDK版本是1.8。在我开发的项目中,我经常使用Java 8的特性和功能。我对Java 8中引入的Lambda表达式、Stream API、默认方法等特性非常熟悉,并且在实际项目中有丰富的经验。Java 8的版本也相对稳定成熟,广泛应用于许多企业和开发者的项目中。

redis的部署方式

在Java中使用Redis的部署方式有以下几种:
1、客户端连接:直接在Java代码中使用Redis的客户端连接到远程或本地Redis服务器。

2、内嵌Redis:将Redis服务器嵌入到Java应用程序中,可以使用嵌入式的Redis实现,如Embedded Redis或Redisson。

3、Docker容器:使用Docker容器化技术,将Redis作为一个独立的容器运行,通过Java代码连接到Redis容器。

4、集群部署:在高负载环境下,可以将Redis部署为一个Redis集群,提高性能和可用性,使用Redis Sentinel或Redis Cluster来实现分布式部署。

mysql的配置和安装熟不熟悉

我对MySQL的配置和安装是比较熟悉的。一般来说,MySQL的配置和安装包括以下步骤:

下载和安装:下载MySQL的安装包,并按照官方文档的指导进行安装。

配置文件:在安装完成后,需要对MySQL的配置文件进行相应的修改,包括设置数据库的字符集、调整缓冲池大小等。

启动和停止:启动MySQL服务器,可以使用命令行或图形界面工具。同样,可以使用相应的命令行或工具停止MySQL服务器。

用户和权限管理:在配置完成后,需要设置MySQL的用户和权限,以确保数据库的安全性。

此外,我在过去的项目中,也参与过MySQL的配置和安装工作,例如在开发环境和生产环境中部署、调优MySQL服务器等。

如何配置多集群mysql

在配置多集群MySQL时,我通常会使用Docker来实现。Docker是一种容器化技术,可以方便地创建和管理多个独立的MySQL容器。

首先,我会使用Docker创建多个MySQL容器,每个容器代表一个MySQL集群节点。可以通过在命令行或使用Docker Compose文件定义容器的配置参数,如端口映射、数据卷挂载、环境变量等。

接下来,我会为每个MySQL容器指定不同的端口号,以确保它们在同一台机器上不会冲突。同时,我也会为每个容器配置独立的数据卷,以便持久化存储数据。

然后,我会在每个MySQL容器中设置不同的配置文件,并为每个容器分配不同的服务器标识(server-id),以便在复制和主从同步过程中正确识别节点。

最后,我会使用MySQL的复制技术(如主从复制或组复制)将数据在多个集群节点之间同步。通过配置正确的复制参数,可以实现数据的分布式复制和高可用性。

springboot分布式有了解吗

Spring Boot是一个用于创建独立的、基于Spring框架的生产级别的Java应用程序的框架。在分布式系统中,Spring Boot可以用于构建和管理分布式应用程序。
在Spring Boot分布式架构中,常见的解决方案包括:

服务注册与发现:使用服务注册与发现组件(例如Netflix Eureka、Consul)来管理分布式系统中的各个服务实例,并实现服务的自动发现和负载均衡。

负载均衡:使用反向代理(例如Nginx、HAProxy)或服务网关(例如Spring Cloud Gateway、Netflix Zuul)来实现请求的负载均衡,将请求分发到不同的服务实例上。

分布式配置管理:使用配置中心(例如Spring Cloud Config、Apollo)来集中管理分布式系统中的配置信息,动态更新系统配置,避免硬编码。

熔断器和容错机制:使用断路器(例如Netflix Hystrix、Resilience4j)来实现服务之间的容错和自我保护,防止系统级故障的扩散。

分布式事务:使用分布式事务管理器(例如Seata、Atomikos)来保证分布式系统中的事务一致性,处理跨多个服务的事务操作。

消息队列/消息中间件:使用消息队列(例如RabbitMQ、Apache Kafka)来实现分布式系统中的异步通信和解耦,提高系统的可伸缩性和可靠性。

http和https的区别,https安全如何实现

HTTP是一种明文传输的协议,数据在传输过程中是以明文形式发送的,因此容易受到网络攻击,如中间人攻击、数据篡改等。HTTP在传输过程中缺乏加密和身份验证,因此不够安全。

而HTTPS是在HTTP的基础上添加了安全层的协议,使用了SSL(Secure Socket Layer)或TLS(Transport Layer Security)协议来加密通信内容,确保数据的保密性和完整性。HTTPS使用公钥加密算法对传输的数据进行加密,同时使用数字证书进行身份验证,确保通信的安全性。

HTTPS的安全性主要通过以下方式实现:

加密数据传输:HTTPS使用公钥和私钥来对数据进行加密和解密,保护数据在传输过程中不被窃取或篡改。

数字证书认证:HTTPS使用数字证书对服务器进行身份验证,确保通信双方的身份合法可信。数字证书由可信的第三方机构颁发,证明服务器的身份和可信度。

安全套件支持:HTTPS使用安全套件来选择合适的加密算法和密钥长度,以及其他安全参数,提供更高的安全性和性能。

安全传输层协议:HTTPS使用SSL或TLS协议建立安全连接,并对数据进行加密和解密,提供端到端的安全保护。

证书的检验方式

当在Java中进行证书验证时,可以按照以下步骤进行:

加载密钥库(KeyStore):使用KeyStore类加载密钥库文件(通常是以.jks或.p12为扩展名的文件),并提供密钥库的密码。密钥库中包含了证书和私钥等信息。

获取证书:从密钥库中获取待验证的证书。可以通过别名来获取指定的证书。

创建证书验证对象:使用X509Certificate类将获取的证书转换为X509Certificate对象,以进行后续的验证操作。

验证证书有效性:使用X509Certificate对象的方法进行证书的验证。这包括验证证书的有效期是否在当前时间范围内,验证证书的签名是否有效等。

可选的CA证书验证:如果需要验证证书的签发机构是否可信,可以通过获取CA证书的公钥,并使用它来验证待验证证书的签名。

总体而言,Java提供了密钥库和证书类来帮助进行证书验证。通过加载密钥库、获取证书、创建证书验证对象,并使用验证方法对证书进行验证,可以确保证书的有效性和合法性。需要注意,为了确保证书的可信性,可能需要使用可信的CA证书来验证证书的签名。

非对称加密和对称加密的区别

非对称加密和对称加密是两种常见的加密算法,它们之间的区别主要体现在加密和解密过程中使用的密钥。

对称加密使用相同的密钥进行加密和解密。发送方和接收方都使用相同的密钥进行加密和解密操作。由于密钥是相同的,对称加密算法执行速度较快,适用于大量数据的加密和解密。但是,对称加密在密钥的分发和管理方面存在一定的问题。

而非对称加密使用一对密钥,即公钥和私钥。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。非对称加密算法相对于对称加密算法更安全,因为私钥是保密的,只有私钥持有者可以解密加密的数据。公钥是公开的,可以用于加密数据。但是,非对称加密算法的加密和解密速度较慢,适用于较小数量的数据加密和解密。

综上所述,对称加密算法速度快,但需要密钥共享;非对称加密算法安全性高,但速度较慢。因此,在实际应用中,通常会结合使用这两种算法。对称加密算法用于加密对称密钥,而非对称加密算法用于传递对称密钥。这样可以兼顾安全性和效率。

数据库的事务隔离级别

READ UNCOMMITTED脏读、不可重复读、幻读都会出现
READ COMMITTED不可重复读、幻读会出现
REPEATABLE READ(默认)幻读会出现
SERIALIZABLE都不会出现

什么是脏读,幻读

脏读: 一个事务修改了一条数据,但还没有提交,另一个事务获取了还没来得及提交的数据,这个数据就是脏数据。
不可重复读: 读到了另一个事务改后提交了的数据,但这个事务还在运行中。例如微信,可以看到对方实时发的消息,数据库认为这个不可重复读是不好的,认为可重复读的得先退出微信,在登陆微信才能看到我新发的消息是好的。但我们可以接受这种并发问题。
幻读: 类似不可重复读,是读到了另一个事务新增或更改后提交的数据。

vue的基本概念,vue的双向数据绑定原理什么?

Vue是一种流行的JavaScript框架,用于构建用户界面。它的核心概念包括:

数据驱动:Vue的核心思想是将应用程序的状态与DOM(文档对象模型)进行绑定,通过响应式的方式实现数据驱动。这意味着当数据发生变化时,Vue会自动更新相关的DOM元素,保持视图与数据的同步。

组件化开发:Vue将用户界面拆分为独立的可复用组件,每个组件具有自己的逻辑和样式。组件使得代码更加模块化、可维护,并且可以实现高度的复用性。

声明式渲染:Vue使用基于HTML的模板语法,让开发者可以以声明式的方式描述用户界面。开发者只需要关注界面应该如何展示,而不需要关注底层的操作细节。

集合的情景问题,不同集合的遍历,比较

好的,请见下方整理的情景和对应的集合类:

1、存储唯一元素且快速判断元素是否存在:HashSet
2、按插入顺序遍历且不允许重复元素:LinkedHashSet
3、存储键值对且键和值均非空:HashMap
4、根据键有序存储且键和值均非空:TreeMap
5、根据元素优先级存储和访问:PriorityQueue

介绍一下多线程

多线程是指在一个程序中同时执行多个线程,每个线程都是独立的执行路径。Java提供了丰富的多线程支持,通过使用多线程可以实现同时执行多个任务,提高程序的性能和效率。

在Java中,实现多线程有三种常用的方式:
继承Thread类:创建一个类,继承自Thread类,并重写run()方法来定义线程的执行逻辑。然后通过创建线程对象,调用start()方法启动线程。
实现Runnable接口:创建一个类,实现Runnable接口,并实现其中的run()方法来定义线程的执行逻辑。然后通过创建线程对象,将实现了Runnable接口的对象作为参数传递给Thread类的构造方法,最后调用start()方法启动线程。
实现Callable接口:创建一个类,实现Callable接口,并实现其中的call()方法来定义线程的执行逻辑。与Runnable不同的是,call()方法可以返回一个结果。然后通过创建线程池对象,将实现了Callable接口的对象提交给线程池的submit()方法,最后通过Future对象获取线程的返回结果。

数据库的内外连接

数据库中的连接操作是用于将多个表中的数据进行关联查询的一种操作。内连接和外连接是两种常见的连接类型。

内连接(Inner Join):内连接返回两个表中满足连接条件的数据集合。即只返回两个表中有匹配关系的数据行。连接条件可以使用等值比较符(如等于、大于、小于等)来定义。

外连接(Outer Join):外连接将返回左表和右表中满足连接条件的数据行,同时还会返回左表或右表中没有匹配数据的行。外连接分为左外连接(Left Outer Join)和右外连接(Right Outer Join)两种情况。

左外连接:左外连接返回左表中所有的数据行,以及右表中满足连接条件的数据行。如果右表中没有匹配的数据,那么返回的结果中对应的字段值为NULL。

右外连接:右外连接与左外连接类似,不同的是右外连接返回右表中的所有数据行,以及左表中满足连接条件的数据行。如果左表中没有匹配的数据,那么返回的结果中对应的字段值为NULL。

ArrayList和LinkedList在的区别?

ArrayList和LinkedList是Java中的两种集合实现类,它们在内部数据结构、性能和适用场景等方面有所区别。

1、内部数据结构:
ArrayList使用动态数组实现,它在内存中是连续存储的,可以通过索引快速访问和修改元素。
LinkedList使用双向链表实现,每个节点包含了当前元素和对前后节点的引用。它在内存中不是连续存储的,需要通过指针进行遍历。

2、插入和删除操作:
ArrayList在中间位置插入或删除元素时,需要移动后续元素来维持连续性,因此性能较差。而在末尾添加或删除元素时,性能较好。
LinkedList在任意位置插入或删除元素时,只需要调整节点的指针,因此性能较好。

3、随机访问和查找操作:
ArrayList可以通过索引快速访问和修改元素,时间复杂度为O(1)。这使得它适用于频繁的随机访问和查找操作。
LinkedList需要从头节点或尾节点开始遍历,因此访问和查找操作的时间复杂度为O(n),其中n是链表的长度。

4、内存占用:
ArrayList由于使用动态数组,它的每个元素占用的内存空间相对较小,但是它会预先分配一定大小的数组空间。
LinkedList的每个节点需要额外的内存空间来存储节点的引用,所以在存储大量元素时,会占用更多的内存空间。

Git,项目中怎么用解决冲突

Git——星球大战队——铁律
1、每天晚上10点前提交代码,10点后不要提交
2、每次提交之前跟组长汇报,因为我也是第一次用Gitee,想尽量避免版本冲突,所以每个版本我都会看看改了哪里
3、每天早上我会告诉用哪个版本,我要是没说就叫我
4、每次push提交代码前必须测试好功能没问题,只提交跟之前代码有差别的文件(进入commit页面有选项)
5、提交的时候要写成这个格式:攸攸太上:24/08/17/14:59:第一次:描述这次提交的变化。
6、降低提交频率,一天一次最好
7、每人在自己电脑里至少要有三份项目和一份jdbc.properties:
①克隆后,每天同步的JavaWeb项目
②自己编写的代码,JavaWeb项目,作自己代码的备份
③自己编写的代码,Java项目,自己的代码要测试dao、service、controller层完全绝对没有问题,再去写连接自己前端的servlet代码和自己前端的代码
④自己数据库的jdbc.properties,每天早上同步项目用自己的替换同步的
8、代码pull不了,就把所有的删掉,再下载新的
9、除了自己的dao层、service层、servlet层、前端层以外,想改其它部分的代码要先跟组长汇报,不然容易出现版本冲突
10、每次有人提交后,所有其他人都要在"①克隆后,每天同步的JavaWeb项目"拉下来他改的项目

Git常用命令

1、git init:将当前目录初始化为一个新的Git仓库。
2、git clone <repository_url>:克隆远程仓库到本地。
3、git add <file_path>:将文件添加到暂存区。
4、git commit -m "commit_message":将暂存区的文件提交到本地仓库。
5、git branch:列出所有分支。
6、git push <remote_name> <branch_name>:将本地分支推送到远程仓库。

IO流中try、catch、finally,finally能不能省略

finally块中的代码无论是否发生异常都会被执行。它通常用于释放资源或执行一些清理操作,比如关闭打开的文件、释放数据库连接等。即使在try块或catch块中有return语句,finally块中的代码也会被执行。

因此,如果在使用IO流时没有显式关闭流,可能会导致资源泄漏。为了确保资源的正确释放,通常会将关闭流的代码放在finally块中。

然而,从Java 7开始,也可以使用try-with-resources语句来自动关闭流。这样可以省略finally块的使用,因为在try-with-resources语句中,资源会在代码块结束后自动关闭。

vue框架能修改和显示的标签

Vue框架是一种流行的JavaScript前端框架,用于构建用户界面。Vue使用了一种声明式的模板语法,并通过数据绑定和组件化的方式,实现了高效灵活的UI开发。

在Vue框架中,可以使用以下几种标签来实现修改和显示数据:

{{ }}:双大括号插值语法,用于在HTML中输出Vue实例中的数据。例如:

{{ message }}

,这会将Vue实例中的message变量的值插入到

标签中进行显示。

v-bind:用于绑定HTML元素的属性到Vue实例的数据。通过v-bind指令,可以动态地更新HTML元素的属性值。例如:,这会将Vue实例中的imageUrl变量的值绑定到src属性,从而动态更新图片的显示。

v-model:用于在表单元素中实现双向数据绑定。通过v-model指令,可以将Vue实例中的数据与表单元素的值进行双向绑定,实现数据的修改和显示。例如:,这会将输入框的值与Vue实例中的username变量进行双向绑定。

v-if、v-show:用于条件渲染元素。v-if指令根据表达式的值来决定是否渲染元素,而v-show指令根据表达式的值来决定是否显示元素。例如:

,这会根据Vue实例中的showElement变量的值来决定是否渲染该
元素。

v-for:用于循环渲染元素列表。通过v-for指令,可以根据Vue实例中的数据循环渲染HTML元素。例如:

  • {{ item }}
  • ,这会根据Vue实例中的items数组循环渲染
  • 元素,并将数组中的每个元素显示出来。
  • map集合怎么遍历

    主要思路是因为Map没有迭代器方法,所以需要把Map型集合转成Connection型集合,再调用迭代器方法进行遍历(有两种常用的遍历while和增强for循环foreach)。

    两个服务在调用的时候,一端过快一端过慢怎么办

    当两个服务之间存在速度不匹配的情况时,可以采取以下几种方法来处理:

    异步调用:将一端过慢的服务改为异步调用,这样可以减少等待时间,提高整体的响应速度。通过引入异步机制,可以在发起调用后立即返回,然后在后台处理结果。这样一方面可以使得调用方不必等待响应,另一方面也可以充分利用系统资源。

    优化慢速服务:对过慢的服务进行优化,以提高其响应速度。可能的优化方式包括:使用缓存技术缓存结果、增加服务的并发处理能力、优化数据库查询语句等。通过优化慢速服务,可以减少其对整体性能的影响。

    限流与熔断:对快速的服务进行限流和熔断措施,以防止过快的服务压垮慢速的服务。限流可以控制请求的数量,避免过多的请求同时涌入慢速服务;熔断可以在慢速服务不可用时,快速返回错误结果,避免过长的等待时间。

    异步通信与消息队列:将一端过慢的服务改为异步通信,使用消息队列来解耦调用方和慢速服务之间的依赖关系。调用方将请求发送到消息队列中,慢速服务从消息队列中获取请求并处理,然后将结果返回给调用方。这种方式可以降低耦合度,并且慢速服务可以根据自身的处理能力来消化消息队列中的请求。

    MySQL事务

    MySQL的事务是一组数据库操作的集合,要么全部成功执行,要么全部回滚到初始状态。事务具有ACID特性,包括原子性、一致性、隔离性和持久性。

    在MySQL中,可以使用以下语句来管理事务:
    BEGIN 或 START TRANSACTION:开始一个事务。
    COMMIT:提交事务,将对数据库的更改永久保存。
    ROLLBACK:回滚事务,撤销对数据库的更改,将数据库恢复到事务开始之前的状态。


    总结

    这是一些技术面试题,感谢各位客官耐心观看。

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值