Java大厂常见1000道面试题集锦(一),2024华为网络安全面试真题解

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

substring(int beginIndex, int endIndex): 从指定位置开始截取到指定位置结束。

例如,可以使用以下代码从字符串中截取一部分:

String str = "Hello World";
String substr1 = str.substring(6); // 截取从第7个字符开始到结尾
String substr2 = str.substring(0, 5); // 截取从第1个字符开始到第6个字符

(2)、字符串分隔 Java中字符串分隔可以使用split()方法,该方法将字符串按照指定的分隔符进行分割,并返回一个字符串数组。

例如,可以使用以下代码从字符串中分隔出多个子字符串:

String str = "Hello,World,Java";
String[] substrs = str.split(","); // 使用逗号分隔字符串

以上就是Java中字符串的截取和分隔的实现方法。

13. 微服务架构与单体架构的优缺点

微服务架构和单体架构都是常见的软件架构模式,它们各自有自己的优缺点。

单体架构的优点包括:

易于开发和维护:单体应用程序通常比较简单,因此易于开发和维护。

易于部署:单体应用程序可以打包为一个独立的应用程序,易于部署和运维。

性能好:单体应用程序通常比较简单,因此具有较好的性能。

单体架构的缺点包括:

可扩展性差: 单体应用程序通常难以水平扩展,因此很难处理高流量或大规模用户的应用程序。

技术栈受限: 单体应用程序通常使用同一种技术栈,难以使用其他技术栈的优点。

难以调试: 当应用程序出现故障时,由于单体应用程序较大,因此很难确定故障出现的位置。

微服务架构的优点包括:

可扩展性好: 微服务可以水平扩展,因此能够处理高流量或大规模用户的应用程序。

技术栈灵活: 不同的微服务可以使用不同的技术栈,因此能够使用更加适合的技术栈来实现不同的功能。

容错性好: 由于微服务是分布式的,因此可以设计容错机制来保证系统的可用性。
微服务架构的缺点包括:

开发和维护成本高: 微服务的数量较多,因此开发和维护的成本较高。

部署和运维复杂: 由于微服务是分布式的,因此部署和运维的成本较高。

性能问题: 由于微服务需要通过网络进行通信,因此会带来一定的性能问题。

14. 微服务架构与单体架构的区别

微服务架构和单体架构是两种不同的软件架构方式。

单体架构是一种传统的软件架构,它将所有的功能模块打包到一个独立的应用程序中。在单体架构中,所有的代码、业务逻辑、数据库模型等都在同一个应用中。单体架构的优点是开发速度快、易于部署和维护,但当应用程序变得越来越复杂时,会变得难以维护和扩展。

相比之下,微服务架构是一种更加灵活和可扩展的架构方式。它将应用程序拆分为多个服务,每个服务都可以独立部署、扩展和维护。每个服务都是一个小型的、独立的应用程序,可以使用不同的编程语言、技术栈和数据库。微服务架构的优点是易于扩展、灵活、可靠性高,缺点是开发和部署的复杂性较高。

在微服务架构中,服务之间通常采用RESTful API进行通信。每个服务都可以独立地扩展和部署,因此可以更好地适应快速变化的业务需求。但是,与单体架构相比,微服务架构的复杂性也更高,需要更多的人力和资源进行开发和维护。

15. jquery基本选择和层次选择器

jQuery是一个流行的JavaScript库,它提供了一些方便的方法来选择和操作HTML元素。以下是jQuery中常用的选择器类型:

基本选择器

ID选择器: 使用#符号选取指定ID的元素,例如 $(“#my-id”)。
类选择器: 使用.符号选取指定类名的元素,例如 $(“.my-class”)。
元素选择器: 选取指定标签名称的元素,例如 $(“p”)选取所有< p >元素。

层次选择器

后代选择器: 选取指定父元素下的所有子孙元素,例如 $(“#my-parent p”)选取所有< p >元素,它们是#my-parent元素的后代元素。

子元素选择器: 选取指定父元素下的直接子元素,例如 $(“#my-parent > p”)选取#my-parent元素下的所有< p >直接子元素。

相邻兄弟选择器: 选取紧接在指定元素后面的同级元素,例如 $(“#my-element + p”)选取紧接在#my-element元素后面的< p >元素。

通用兄弟选择器: 选取指定元素后面的所有同级元素,例如 $(“#my-element ~ p”)选取#my-element元素后面的所有< p >元素。

除了以上常用的选择器类型,jQuery还提供了一些其他选择器类型,如属性选择器、内容过滤选择器等,可以根据实际需求灵活使用。

16. ribbon和feign区别

Ribbon和Feign都是Netflix公司开发的Java库,用于实现分布式系统中的客户端负载均衡和服务调用。两者的区别如下:

功能不同: Ribbon主要提供了客户端负载均衡的功能,可以在多个服务提供者之间分发请求。Feign则是在Ribbon的基础上提供了一个更高级的抽象层,简化了服务间的调用方式,使得调用方式更加像本地方法调用。

使用方式不同: Ribbon需要手动编写代码来实现负载均衡的功能,需要实现负载均衡器和服务列表的管理。而Feign则是基于注解和接口定义的方式,可以自动根据接口定义生成客户端代码,并且已经集成了Ribbon的负载均衡功能,使用起来更加方便。

可扩展性不同: Ribbon提供了丰富的可定制化选项,可以根据实际情况自定义负载均衡策略、重试机制等。而Feign则相对简单,提供了较少的可扩展性选项,如果需要更高级的功能,则需要自己编写代码实现。

综上所述,Ribbon适合对负载均衡和服务调用有更深入理解的开发者,可以自己编写代码实现需要的功能。而Feign则更加适合快速开发和初学者,可以使用注解和接口定义的方式来简化服务间的调用方式。

17. ribbon和feign区别

Ribbon和Feign都是Netflix公司开发的Java库,用于实现分布式系统中的客户端负载均衡和服务调用。两者的区别如下:

功能不同: Ribbon主要提供了客户端负载均衡的功能,可以在多个服务提供者之间分发请求。Feign则是在Ribbon的基础上提供了一个更高级的抽象层,简化了服务间的调用方式,使得调用方式更加像本地方法调用。
使用方式不同: Ribbon需要手动编写代码来实现负载均衡的功能,需要实现负载均衡器和服务列表的管理。而Feign则是基于注解和接口定义的方式,可以自动根据接口定义生成客户端代码,并且已经集成了Ribbon的负载均衡功能,使用起来更加方便。
可扩展性不同: Ribbon提供了丰富的可定制化选项,可以根据实际情况自定义负载均衡策略、重试机制等。而Feign则相对简单,提供了较少的可扩展性选项,如果需要更高级的功能,则需要自己编写代码实现。
综上所述,Ribbon适合对负载均衡和服务调用有更深入理解的开发者,可以自己编写代码实现需要的功能。而Feign则更加适合快速开发和初学者,可以使用注解和接口定义的方式来简化服务间的调用方式。

18. socket错误是什么意思

Socket 错误指的是在使用 Socket 进行网络通信时,由于各种原因而导致的错误。Socket 是一种网络编程接口,它允许应用程序通过 TCP/IP 协议或 UDP 协议进行网络通信。在进行网络通信时,可能会出现各种各样的错误,例如连接超时、连接被重置、无法连接等等,这些错误都被称为 Socket 错误。

错误原因

Socket 错误通常会由操作系统或网络设备等方面引起,可能包括以下一些原因:

连接超时: 在建立连接时,等待对方响应的时间超过了指定的时间,导致连接失败。
*连接被重置: 连接成功建立后,由于网络设备或对方主机等原因,连接被异常关闭,导致连接失败。
网络不可达: 在进行网络通信时,发现网络不可达,无法进行通信。
连接被拒绝: 对方主机拒绝连接请求,导致连接失败。
地址已在使用中: 在进行网络通信时,要求使用的地址已经被其他应用程序占用,导致连接失败。

当出现 Socket 错误时,通常需要根据具体的错误信息进行调试和处理,例如修改网络配置、增加连接超时时间、检查网络连接等等。正确地处理 Socket 错误可以有效提高网络通信的稳定性和可靠性。

19. 什么是函数式编程

函数式编程(Functional Programming)是一种编程范式,是基于数学中的λ演算理论发展而来的,它的主要思想是把计算机程序看作是一系列数学函数的组合。函数式编程主张用函数(映射关系)来描述运算过程,强调结果而非过程,不依赖、也尽量不改变外界状态,从而避免了多线程共享变量的问题。与命令式编程(Imperative Programming)相比,函数式编程更加关注数据的映射和转换,而不是通过修改状态来实现控制流程。

函数式编程具有以下特点:

高阶函数: 函数可以作为参数传递给其他函数,也可以作为其他函数的返回值。
纯函数: 相同的输入总是得到相同的输出,函数不改变外部状态,也不依赖外部状态,不产生副作用。
不可变性: 函数不能改变传入的参数和全局变量,只能通过返回新的值来达到更新状态的目的。
延迟计算: 只有在需要的时候才进行计算,这样可以避免不必要的计算。
引用透明性:对于相同的输入,函数总是返回相同的输出,所以可以用其返回值替换函数调用。
函数式编程在大数据、云计算、并发编程等方面都具有重要应用。例如,Hadoop的MapReduce框架就是使用函数式编程的思想来实现数据处理。在Java语言中,Java 8加入了Lambda表达式和Stream API,使得Java也能够进行函数式编程。

20.什么是单体应用?如何理解

单体应用(Monolithic application)是指一个应用程序以一体化的形式部署和运行在一个独立的进程中,通常包含一个完整的应用程序栈(application stack),包括用户界面、应用逻辑、数据存储和处理等组件。单体应用是传统的应用开发和部署方式,通常使用一个大型的代码库,所有功能都在同一个代码库中实现,整个应用程序由一个运行时进程执行,数据库和其他资源都是共享的。

理解单体应用可以类比成一个传统的大型商场,所有商品都在一个建筑物里面,商场有一个总控制中心来管理各个部门的运营,不同的部门通过共享资源来协同工作。同样地,单体应用也是一个大型的应用程序,所有功能都在同一个代码库中实现,由一个运行时进程来执行,不同的模块通过共享资源来协同工作。

尽管单体应用具有部署简单、开发效率高等优点,但也存在一些局限性,如扩展性差、可靠性差、灵活性差等。随着业务增长和应用规模扩大,单体应用的弊端逐渐显露出来,因此,现在越来越多的应用采用了微服务等分布式架构来解决这些问题。

21. 什么是事件对象?事件对象的使用

事件对象是在事件被触发时自动创建的对象,它包含了与事件相关的信息,比如事件的类型、触发的元素、鼠标点击的坐标等等。在JavaScript中,事件对象是由浏览器自动创建并传递给事件处理函数的,开发人员可以通过访问事件对象来获取有关事件的详细信息,以便根据需要采取适当的行动。

事件对象通常被用来执行以下操作:

1、取消事件的默认行为
2、阻止事件的冒泡或捕获
3、获取与事件相关的数据

在事件处理函数中,可以通过 event 或 e 参数来引用事件对象,比如:

function handleClick(event) {
  console.log(event.type); // 打印事件类型
  console.log(event.target); // 打印触发事件的元素
  event.preventDefault(); // 取消事件的默认行为
  event.stopPropagation(); // 阻止事件的冒泡或捕获
}

在这个例子中,handleClick 函数接收一个 event 参数,用于访问事件对象中的属性和方法。其中 event.type 和 event.target 分别获取事件的类型和触发事件的元素,event.preventDefault() 和 event.stopPropagation() 分别用于取消事件的默认行为和阻止事件的冒泡或捕获。

22. 十大经典排序算法

以下是十大经典排序算法:

冒泡排序(Bubble Sort): 比较相邻两个元素,如果逆序则交换,重复多轮,直到无逆序情况。

选择排序(Selection Sort): 在待排序元素中选择最小(大)元素,放在已排序序列的起始位置,重复多轮,直到所有元素有序。

插入排序(Insertion Sort): 从第二个元素开始,将每个元素插入到已排序序列中的合适位置,重复多轮,直到所有元素有序。

希尔排序(Shell Sort): 将待排序序列分割成若干子序列,分别进行插入排序,重复多轮,直到所有元素有序。

归并排序(Merge Sort): 将待排序序列分成若干子序列,对每个子序列进行归并排序,将有序的子序列合并成一个有序序列,重复多轮,直到所有元素有序。

快速排序(Quick Sort): 从序列中选择一个枢轴元素,将序列分成两部分,小于等于枢轴元素的放在左边,大于枢轴元素的放在右边,对左右两部分分别递归进行快排,重复多轮,直到所有元素有序。

堆排序(Heap Sort): 将待排序序列构造成一个大根堆,将堆顶元素(最大值)与末尾元素交换,重复多轮,直到所有元素有序。

计数排序(Counting Sort): 根据待排序序列中每个元素出现的次数,计算小于等于每个元素的元素个数,从后往前遍历待排序序列,将每个元素放在相应位置,重复一轮,直到所有元素有序。

桶排序(Bucket Sort): 将待排序序列分到有限数量的桶中,每个桶单独排序,最后将所有桶的元素按照顺序合并成一个序列,重复多轮,直到所有元素有序。

基数排序(Radix Sort): 将待排序元素按位数切割成不同的数字,然后按每个位数分别进行排序,重复多轮,直到所有元素有序。

以上排序算法各有优缺点,不同场景下应选择不同的算法来实现排序。

23、单点登录和多点登录区别

单点登录(Single Sign-On,简称 SSO)是指用户只需要在一次登录操作后,就可以访问多个系统或应用程序,无需再次输入用户名和密码。在单点登录系统中,用户只需在任意一个系统中登录,然后可以无缝地访问其他系统,这样可以方便用户,提高用户体验,同时也可以减少用户的密码管理和系统的开发和维护成本。

相对的,多点登录(Multiple Sign-On)则是指用户需要在每个系统或应用程序中单独登录,每个系统都需要验证用户的身份和权限,用户需要输入相应的用户名和密码。这种方式需要用户多次登录,增加了用户的负担和系统的维护成本。

单点登录系统通过使用统一的身份认证和授权机制,可以解决多点登录系统中的问题,提供了更方便、更安全、更高效的访问方式,用户只需要一次认证就可以在多个系统中访问,避免了在每个系统中重复认证的过程,同时也提高了系统的可维护性和安全性。

24、Java随机数怎么用

在Java中,可以通过使用java.util.Random类来生成随机数。该类提供了许多方法来生成不同类型的随机数。

下面是一个生成整数类型随机数的例子:

import java.util.Random;

public class RandomNumberGenerator {
    public static void main(String[] args) {
        Random random = new Random();
        int randomNumber = random.nextInt(100); // 生成0到99的随机整数
        System.out.println(randomNumber);
    }
}

在上面的例子中,我们首先创建了一个java.util.Random类的实例。然后,我们调用nextInt()方法来生成一个0到99之间的随机整数,并将其存储在randomNumber变量中。最后,我们打印出生成的随机数。

除了nextInt()方法,Random类还提供了许多其他方法来生成不同类型的随机数,例如nextDouble()用于生成double类型的随机数,nextBoolean()用于生成布尔类型的随机数等等。

25、session和cookie的区别

Session和Cookie是两种在Web应用中用于跟踪用户状态的技术,它们之间有以下几点不同:

存储位置: Cookie保存在客户端浏览器中,Session保存在服务器端。
数据安全: 由于Cookie保存在客户端,因此Cookie的数据可以被客户端浏览器篡改、伪造或窃取,因此保存在Cookie中的数据不是很安全。而Session保存在服务器端,客户端无法直接访问Session中的数据,因此比Cookie更加安全。

存储容量: Cookie保存在浏览器中,因此Cookie的大小受到浏览器的限制,一般为4KB左右。而Session保存在服务器端,因此可以存储的数据量比Cookie要大。

存储时效性: Cookie可以设置过期时间,过期后浏览器会自动删除Cookie,因此Cookie可以保存较长时间。而Session一般默认的超时时间为30分钟,超过该时间后,服务器会自动删除Session。

使用场景: Cookie适合保存一些需要跨页面传递的数据,比如用户的登录信息、购物车信息等。而Session一般用于保存用户的会话信息,比如用户的登录状态、权限信息等。
需要注意的是,Session和Cookie并不是互斥的,有些情况下它们可以结合使用。比如可以将Session的Session ID保存在Cookie中,以便于在用户多次访问时能够恢复用户的会话状态。

25、a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

26、List、Set、Map 和 Queue 之间的区别

List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

27、.poll() 方法和 remove() 方法的区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

28、Java和C++的区别?

都是面向对象的语言,都支持封装、继承和多态。

Java 不提供指针来直接访问内存,程序内存更加安全。

Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。

Java 有自动内存管理机制,不需要程序员手动释放无用内存。

29、重载和重写的区别?

重载: 发生在同一个类中,方法名必须相同,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准),返回值类型、访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,是父类与子类之间的多态性,实质是对父类的函数进行重新定义。返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

Java 构造方法能否被重写和重载?

重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的。而重载是针对同一个的,所以构造方法可以被重载。

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-HRdSgX7x-1713335490815)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值