- 博客(147)
- 资源 (246)
- 收藏
- 关注
原创 SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问
本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。
2024-06-30 22:47:48
1027
1
原创 Swagger与RESTful API
在现代软件开发中,RESTful API已成为应用程序间通信的一个标准。这种架构风格通过使用标准的HTTP方法来执行网络上的操作,简化了不同系统之间的交互。API(应用程序编程接口)允许不同的软件系统以一种预定义的方式互操作,而REST(表述性状态转移)是实现这些接口的一种流行方式。RESTful API的设计原则强调简洁性、可读性和网络友好性,使其成为开发分布式系统和微服务架构的理想选择。
2024-06-28 22:08:52
1272
原创 Java并发编程:理解线程、同步和锁
Java提供了一套完备的并发编程工具,从基本的线程控制到复杂的锁机制和并发集合,这些工具帮助开发者构建稳健的多线程应用程序。原子类提供的主要优势是无锁的线程安全性,这通常比使用锁或其他同步机制具有更高的性能,特别是在高竞争的环境中。在Java并发编程中,除了锁和同步方法,条件变量和阻塞队列也是重要的工具,用于在多线程环境中协调线程之间的操作。阻塞队列是支持两个附加操作的队列,这些操作包括在队列为空时队列的获取操作将阻塞,等待队列变为非空,当队列满时插入操作将阻塞,等待队列可用。
2024-06-22 14:21:35
1314
原创 深入理解SpringCloud之Zuul
在Zuul中,过滤器扮演着极其关键的角色,它们负责在请求路由的各个阶段执行各种任务,比如安全认证、请求日志记录、参数校验等。通过自定义过滤器,咱们可以实现更加复杂和定制化的逻辑来满足特定的业务需求。下面,小黑将带领咱们一探究竟,如何编写和使用自定义过滤器。要创建一个自定义过滤器,咱们需要继承ZuulFilter和run()。preroutepost和error。:返回一个int值来指定过滤器的执行顺序,数值越小,优先级越高。:返回一个布尔值,判断该过滤器是否需要执行。run():过滤器的具体逻辑。
2024-03-07 13:35:23
1936
原创 探索Java中的函数式接口与Streams API的高级用法
所谓函数式接口,其实就是只定义一个抽象方法的接口。虽然听起来很简单,但这个定义背后的含义是深远的。Java中的Lambda表达式,就是建立在函数式接口的基础上的。它们使得咱们可以用更简洁的方式来表示方法传递,或者说是行为的传递。这在之前的Java版本中是难以想象的。来,小黑给咱们举个例子。假设咱们需要一个接口,用于对整数进行某种形式的处理。// 输出 8这种方式虽然行得通,但是对于这么简单的行为,写一个实现类似乎太繁琐了。// 同样输出 8看,是不是简洁多了?
2024-03-06 13:01:16
1196
原创 在Java中处理JSON数据:Jackson与Gson库比较
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,但不要误会,JSON虽然源自JavaScript,但它是完全独立于语言的,任何语言都可以解析和生成JSON数据。简单来说,JSON用简洁的文本格式表示结构化的数据,看起来就像是JavaScript中的对象字面量,但实际上它可以被任何编程语言所读取和生成。"姓名": "小黑","年龄": 25,"技能": ["Java", "Python", "JavaScript"],
2024-03-05 12:27:13
1733
1
原创 使用AspectJ进行面向切面编程(AOP)
在AspectJ中,切面是通过使用@Aspect注解来定义的。切面可以包含多种类型的通知,这些通知定义了切面在目标对象的生命周期中的不同切入点。为了展示这一点,我们将创建一个简单的日志记录切面,它在方法执行之前和之后打印日志信息。import org// 在方法执行之前打印日志 @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) {
2024-03-04 22:56:04
1651
原创 Java中的数据压缩和存储技术:Zip、GZip与Brotli
数据压缩技术的目的是减少数据在存储和传输时所需的空间,它通过各种算法去除数据中的冗余信息来实现这一点。举个例子,如果一个文件里面充满了重复的信息,比如“哈哈哈哈哈哈”,使用数据压缩技术后,这串信息可能就被简化为“哈*6”,大大减少了数据的大小。数据压缩分为两种基本类型:无损压缩和有损压缩。无损压缩允许数据在压缩和解压缩后保持原样不变,而有损压缩则在压缩过程中丢弃了一些不那么重要的信息,以换取更高的压缩比。对于文本、源代码或者需要完整保留的数据,咱们通常使用无损压缩;
2024-03-04 13:34:40
2440
原创 构建安全的REST API:OAuth2和JWT实践
说到REST API,咱们先来搞清楚几个概念。REST(Representational State Transfer)是一种设计风格,它定义了一套规则,用于创建网络服务。通过使用HTTP协议的方法,如GET、POST、PUT、DELETE等,REST API允许应用程序或服务访问网络上的资源。举个例子,假如小黑现在要开发一个天气预报应用。这个应用需要从一个天气服务提供商那里获取数据。这时候,REST API就是小黑和天气服务提供商之间的桥梁。
2024-03-03 20:29:28
1602
原创 Reactive编程与Spring WebFlux
Spring WebFlux是Spring 5中引入的一个全新的响应式Web框架,用于支持Reactive编程模式,让咱们可以更加便捷地开发非阻塞式的、高性能的Web应用。那么,为啥Spring要推出WebFlux呢?其实原因很简单。随着现代Web应用对高并发和高性能的要求越来越高,传统的Spring MVC框架,基于同步阻塞I/O模型的处理方式,在某些情况下就显得力不从心了。
2024-03-03 19:25:41
1376
2
原创 Java中的异常处理最佳实践
在Java里,异常就像是生活中的小插曲,有时候它们让咱们的程序出乱子,但处理得当,也能让咱们的代码更加健壮。Java中的异常处理,其实就是一种错误管理策略,让小黑在遇到问题时,能有序地解决,而不是让整个程序崩溃。异常分为两大类:检查型异常(Checked Exceptions)和运行时异常(Runtime Exceptions)。检查型异常是那些编译期就需要咱们显式处理的异常,比如文件找不到时会抛出的。而运行时异常,如,则是编译期不检查的,它们多半是因为编码不当导致的。
2024-03-03 17:26:35
740
原创 Java中的图数据库应用:Neo4j入门
不管是哪个操作系统,安装完成后咱们都需要进行一些基本的配置。最重要的就是关于安全性的配置,特别是设置数据库的用户名和密码。Neo4j在首次启动时会要求设置这些信息,确保你的数据库不会被未授权的人访问。此外,还可以通过修改文件来进行更多高级配置,比如调整内存设置、配置日志文件的位置等。对于大多数初学者来说,刚开始使用默认配置就已经足够了。随着咱们对Neo4j的了解加深,再根据实际需要进行相应的调整。安装并配置好Neo4j之后,咱们就可以开始探索图数据库的强大功能了。
2024-03-02 22:41:41
2627
原创 模拟服务器响应的测试框架:moco
Moco在动态响应和条件模拟方面的能力是相当强大的。这些高级功能让Moco不仅仅是一个简单的模拟工具,而是一个能够应对复杂测试场景的强大助手。无论是需要根据请求内容动态生成响应,还是要根据不同的条件来模拟服务器的不同行为,Moco都能轻松搞定。通过灵活运用Moco的这些高级特性,你可以构建出几乎任何你想要的测试场景,使得测试工作更加高效和准确。
2024-03-02 22:17:34
1509
原创 Java中的动态代理与Spring AOP编程
一起深入了解Java中的动态代理和Spring AOP编程。从基本概念到高级应用,再到实战案例,希望这些内容能够帮助咱们更好地掌握这两项强大的技术。现在,让咱们在本章做一个总结回顾,巩固咱们所学的知识。通过动态代理和Spring AOP,咱们可以编写出更加模块化、可维护和可重用的代码,提高开发效率和代码质量。希望通过本系列文章的学习,咱们能够更加自信地在Java开发中使用这些强大的工具,写出更加优秀的代码。
2024-03-01 23:32:47
902
原创 利用Quartz实现复杂的任务调度
在前面的章节中,小黑带领咱们一起深入探讨了Quartz的基础知识、进阶用法、动态任务调度、集群部署以及性能优化和最佳实践。现在,通过几个实际的案例研究,咱们将看到Quartz如何在项目中解决复杂的任务调度问题,并从中总结一些关键的学习点。通过这些案例研究,咱们可以看到Quartz作为一个强大的任务调度框架,能够帮助解决各种复杂的调度问题。无论是需要精确控制执行时间的场景,还是需要在分布式环境中保持任务执行一致性的需求,Quartz都能提供有效的解决方案。关键学习点。
2024-03-01 13:41:31
1162
原创 Java中的时间API:Date、Calendar到Java.time的演变
java.time包的引入,无疑是Java平台一个重大的进步。它不仅解决了旧API的种种问题,更引入了一系列现代化的特性,如不可变性、清晰的API设计以及全面的时区支持,这些都大大提高了处理日期和时间的效率和准确性。通过使用java.time包,咱们可以更加自信地处理各种复杂的日期和时间场景,无论是简单的日期时间计算,还是复杂的时区转换和调整。小黑想强调的是,随着技术的发展,学习和适应新的工具和API是每个开发者不可或缺的能力。java.time。
2024-02-29 22:31:03
1264
原创 深入理解Java泛型及其在实际编程中的应用
泛型不仅仅局限于集合框架,咱们还可以在自己的类和方法中使用泛型。// 使用示例System.out.println("较大的数字是:" + intPair.getBigger());System.out.println("字典序较后的是:" + stringPair.getBigger());在这个例子中,Pair类使用了泛型T,并且限制了T必须是实现了Comparable接口的类型,这样就可以保证T类型的对象是可以比较的。这种方式不仅提高了代码的复用性,也保证了类型安全。
2024-02-29 21:54:55
964
原创 Java中的单元测试:JUnit5实践指南
不仅如此,JUnit5还提供了大量的注解和断言方法,让咱们可以针对不同的测试场景编写出更加精准和高效的测试代码。在下一章中,小黑将带咱们深入探讨JUnit5中的高级特性,让咱们的测试能力再上一个新的台阶。在接下来的章节中,小黑将继续带咱们深入探讨JUnit5中的更多高级特性,让咱们的测试技能更上一层楼。想象一下,一个支持Lambda表达式的测试框架,加上更灵活的测试实例管理和动态测试能力,这不仅仅是技术上的进步,更是对测试哲学的一种进化。在深入JUnit5的探索旅程中,理解测试的生命周期是至关重要的。
2024-02-28 21:21:27
2108
原创 深入理解Spring Security
大家好,我是小黑,在谈到网站安全的时候,Spring Security是个避不开的话题。它就像是个守门员,决定谁能进入我们的网站,又能在网站的哪些角落里走动。简单来说,Spring Security负责两大块:认证(Authentication)和授权(Authorization)。认证是确认咱们的身份,授权则是决定咱们能做什么、不能做什么。想象一下,小黑正在尝试进入一个只有VIP成员才能访问的网站区域。Spring Security首先会检查小黑是不是网站的注册用户,这就是认证。
2024-02-28 12:48:20
878
原创 深入浅出-高性能低延迟消息传递框架-Disruptor
说到Disruptor,咱们首先要了解它的核心组件:Ring Buffer。这不是一般的队列,而是一种环形的数据结构,能高效地在生产者和消费者之间传递数据。它的特点是预先分配固定数量的元素空间,这就减少了动态内存分配带来的性能损耗。// 定义事件工厂 EventFactory < LongEvent > eventFactory = new LongEventFactory();// 指定Ring Buffer的大小,必须是2的幂次方 int bufferSize = 1024;
2024-02-27 20:51:22
1184
原创 宋小黑的生财知识资料库第1012期
在不确定性日益增加的时代,副业也是一种风险分散策略。万一主职工作出现不稳定,副业可以作为一个经济安全网,为你提供必要的财务支持。它还可以帮助你建立起更广泛的职业网络,这个网络在未来寻找工作或商业机会时可能会派上用场。副业不仅是为了赚取额外收入,更是一个个人成长和职业发展的平台。它能够让你在安全的环境中尝试和学习,最终可能会发现自己真正热爱的事业,或者至少,为自己在不断变化的世界中增加一份保障。
2024-02-15 15:00:15
316
原创 深入理解SpringCloud之Eureka
Eureka允许服务实例在注册时添加元数据,这些元数据可以包含任何自定义信息,比如服务版本、环境标签等。这些信息可以用于服务间的智能路由决策。eureka:instance:version: 1.0.0 # 服务版本environment: 测试环境 # 服务运行的环境这样,当客户端发现服务时,就可以获取这些元数据,并据此做出智能决策,比如只调用特定版本的服务或者只在同一环境中的服务之间进行通信。通过这些高级特性,Eureka为微服务架构提供了更多的灵活性和可扩展性。
2024-02-15 14:29:17
1104
原创 宋小黑的生财知识资料库第1011期
在不确定性日益增加的时代,副业也是一种风险分散策略。万一主职工作出现不稳定,副业可以作为一个经济安全网,为你提供必要的财务支持。它还可以帮助你建立起更广泛的职业网络,这个网络在未来寻找工作或商业机会时可能会派上用场。副业不仅是为了赚取额外收入,更是一个个人成长和职业发展的平台。它能够让你在安全的环境中尝试和学习,最终可能会发现自己真正热爱的事业,或者至少,为自己在不断变化的世界中增加一份保障。
2024-02-15 13:31:18
755
原创 宋小黑原创高清壁纸分享之蓝白云海
大家好,我是小黑,最近迷上了制作壁纸,哈哈,给大家分享一波,小黑做的美图~现在分享一系列超清晰超漂亮的壁纸!一次性解决你的壁纸短缺问题!本期给大家分享的是,小黑原创的蓝白云海主题系统壁纸~
2024-02-08 23:56:44
556
原创 熔断机制解析:如何用Hystrix保障微服务的稳定性
熔断器模式是一种自我保护机制,它可以防止某个服务的问题影响到其他服务,从而保护整个系统的稳定性。这个模式有三个关键状态:闭合、开启和半开。闭合状态:一切正常,请求正常访问服务。开启状态:当错误数达到一定阈值,熔断器开启,后续请求不再调用本服务。半开状态:过一段时间后,熔断器进入半开状态,尝试放行部分请求。如果这些请求成功,熔断器闭合,否则继续开启。通过这种方式,熔断器能够有效地保护系统不被单个服务的失败所影响。
2024-02-08 21:51:15
1764
1
原创 Ribbon全方位解析:构建弹性的Java微服务
这是Spring Cloud的下一代负载均衡器,它是一个基于Spring Framework的响应式负载均衡客户端。与Ribbon相比,Spring Cloud LoadBalancer提供了更好的集成和更现代的编程模型支持。:Zuul是一个边缘服务,提供动态路由、监控、弹性、安全等功能。虽然它主要作为API网关使用,但其内部也包含用于服务路由的负载均衡机制。Istio:在Kubernetes生态系统中,Istio提供了一种不同于Ribbon的服务网格解决方案。
2024-02-08 21:11:03
1591
原创 深入理解ZooKeeper分布式锁
ZooKeeper,这个名字听起来就像是动物园的管理员,它在分布式系统中的角色也差不多。ZooKeeper是一个为分布式应用提供协调服务的软件,它的设计目标是将那些复杂的、易于出错的分布式协调工作封装起来,提供给我们一套简单易用的接口。ZooKeeper的架构很有意思。它基于一个主从结构(Leader-Follower模式)。在这个架构中,一个Leader节点负责处理写请求,多个Follower节点则处理读请求,这样既保证了数据的一致性,又提高了系统的读性能。
2024-01-26 22:25:06
928
原创 详解SpringCloud之远程方法调用神器Fegin
在Feign中,默认使用了Spring MVC的编解码器来处理请求和响应。但有时候,咱们可能需要对这些编解码器进行定制,比如使用不同的JSON解析库,或者处理一些特殊的数据格式。这时,咱们可以自定义编解码器。@Bean在这个例子中,继承了,并使用了来处理HTTP消息。然后,在配置类中注册这个自定义的解码器。Feign也允许咱们添加自定义的拦截器,这在处理一些如身份验证、日志记录等横切关注点时非常有用。自定义拦截器可以在发送请求之前或之后执行一些逻辑。@Override。
2024-01-26 21:49:06
1079
原创 性能利器Caffeine缓存全面指南
Caffeine是一个开源的Java缓存库,它的设计初衷就是替代Guava缓存,提供更加高效的缓存解决方案。为什么要替代Guava呢?因为Guava虽好,但在处理高并发和大数据量时,性能就显得有点吃力。Caffeine的特点可以用三个词概括:快、简单、强大。它的API设计得非常直观,让小黑们使用起来轻松自如。.build();这段代码创建了一个最大容量为10000的缓存,数据写入后5分钟过期。咱们看,是不是挺简单的?但别看Caffeine简单,它的内部实现可是非常巧妙和复杂的。
2024-01-22 23:07:24
1887
原创 Ehcache深度解析与实践指南
轻量级和易于集成:Ehcache作为一个轻量级的Java缓存框架,其简单易用的特性非常适合快速开发。灵活的配置:Ehcache提供了丰富的配置选项,可以满足不同场景下的缓存需求,比如内存和磁盘的缓存策略,缓存的过期时间等。与Spring框架的良好整合:Ehcache与Spring框架的整合为Java开发者带来了极大的便利,可以轻松实现声明式的缓存管理。性能优化:通过监控和调优,Ehcache能够提供高效的缓存性能,这对于提升应用性能尤其关键。
2024-01-22 22:55:25
1206
原创 再回首之SpringMVC深入解析
有时候,咱们需要自定义数据的转换逻辑。比如,从字符串到日期类型的转换。在Spring MVC中,可以自定义Converter来实现这一点。@Override// 实现从String到Date的转换逻辑try {throw new IllegalArgumentException("无效的日期格式,请使用yyyy-MM-dd格式");// 在配置类中注册这个转换器@Override这样,当Spring MVC遇到需要从字符串到日期的转换时,就会使用自定义的。
2024-01-21 19:00:17
1015
原创 详解Redisson
咱们今天来聊聊Redisson,Redisson不只是简单地对Redis进行了封装,它还提供了一系列高级的分布式Java数据结构,像是分布式锁、原子长整型这种。首先,Redisson的核心特点是什么呢?它提供了对Redis的各种操作的高层封装,这让咱们在使用Redis时更加方便、高效。再加上Redisson支持多种编码模式,比如JSON、Avro、Smile等,使得它非常灵活。再说说应用场景。
2024-01-21 14:43:24
1242
原创 深入剖析MyBatis缓存机制
在MyBatis中,常见的缓存策略有:先进先出(FIFO)、最近最少使用(LRU)、软引用(Soft)和弱引用(Weak)。每种策略都有其特点和适用场景。:这种策略是按照对象进入缓存的顺序来移除它们。最早进入的对象会最先被移除。:最近最少使用的对象会被首先移除。这种策略是基于对象被访问的次数和频率,适用于大部分缓存场景。软引用(Soft Reference):在这种策略下,对象会被封装在软引用中。当JVM内存不足时,这些对象可能会被垃圾回收器回收。弱引用(Weak Reference)
2024-01-20 19:03:53
933
原创 灵活扩展:深入理解MyBatis插件机制
现在咱们来看看如何开发自定义的MyBatis插件。开发插件听起来可能有点高大上,但其实步骤很简单,关键在于理解MyBatis提供的拦截器接口。所有的MyBatis插件都必须实现接口。interceptplugin和。intercept方法是插件的核心,用于定义插件的逻辑;plugin方法用于生成MyBatis要拦截的目标对象;则用于接收配置文件中的参数。假设小黑想写个插件来修改SQL语句,使得所有的查询语句都加上一个限制条件,比如“WHERE status = ‘ACTIVE’”。
2024-01-20 18:39:24
987
原创 Spring MVC精解:技术内幕与最佳实践
有时候,咱们需要自定义数据的转换逻辑。比如,从字符串到日期类型的转换。在Spring MVC中,可以自定义Converter来实现这一点。@Override// 实现从String到Date的转换逻辑try {throw new IllegalArgumentException("无效的日期格式,请使用yyyy-MM-dd格式");// 在配置类中注册这个转换器@Override这样,当Spring MVC遇到需要从字符串到日期的转换时,就会使用自定义的。
2024-01-20 18:15:02
1194
原创 深入理解Java中的ThreadLocal
ThreadLocal作为一个强大的工具,在多线程环境下解决了很多问题。但正如咱们之前讨论的,它并不是万能的。作为开发者,咱们应该明智地选择适合的工具来解决问题。咱们要记住的是,技术总是在发展的,咱们也需要不断学习和适应。对ThreadLocal的深入理解,不仅能帮助咱们现在写出更好的代码,也为将来的技术变革做好准备。好了,今天关于ThreadLocal的探讨就到这里。希望大家都能从中获得有价值的信息,也期待看到大家在实际工作中灵活运用ThreadLocal~
2024-01-18 22:54:19
1162
原创 深入浅出Spring AOP
首先,咱们需要定义一个切面来负责日志记录。这个切面将包含一个前置通知(Before advice)来在方法执行前记录日志,和一个后置通知(After advice)来在方法执行后记录日志。// 前置通知:在方法执行前调用 @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) {
2024-01-16 23:54:58
1007
原创 掌握Spring缓存-全面指南与最佳实践
Spring框架不仅仅是一个框架,它更像是一个庞大的生态系统,提供了从核心容器、数据访问/集成、Web应用到云服务等全方位的解决方案。Spring的核心是依赖注入(DI)和面向切面编程(AOP),这两个功能让代码更加模块化,易于管理和维护。来,咱们看个简单的例子,理解一下Spring是怎么工作的。想象咱们有个类,它依赖于另一个类。@Service@Autowired看到没有?这里的@Service和@Autowired就是Spring的用法。它们告诉Spring,
2024-01-16 21:20:53
1409
1
互联网高频Java后端面试题20道(适合1~3年)V1.0.98.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.97.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.96.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.95.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.94.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.93.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.92.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.91.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.90.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.89.docx
2024-01-31
互联网高频Java后端面试题20道(适合1~3年)V1.0.86.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.85.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.84.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.83.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.82.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.81.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.80.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.79.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.78.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.77.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.76.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.75.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.74.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.73.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.72.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.71.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.70.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.69.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.68.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.67.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.66.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.65.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.64.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.63.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.62.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.61.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.60.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.59.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.58.docx
2024-01-30
互联网高频Java后端面试题20道(适合1~3年)V1.0.57.docx
2024-01-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人