电子书 – Spring Cloud 指南 – NPI EA (分类=Spring Cloud)
announcement - icon

让我们开始使用 Spring Cloud 的微服务架构

>> 加入 Pro 并下载电子书

电子书 – Mockito – NPI EA (标签 = Mockito)
announcement - icon

模拟是单元测试的重要组成部分,Mockito 库使编写 清晰直观的单元测试 变得容易,用于您的 Java 代码。

通过我们的 Mockito 指南 开始模拟,并改进您的应用程序测试

下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – 响应式 – NPI EA (分类=响应式)
announcement - icon

Spring 5 增加了对使用 Spring WebFlux 模块进行响应式编程的支持,此支持自那时起不断改进。 开始使用 Reactor 项目基础知识和 Spring Boot 中的响应式编程

>> 加入 Pro 并下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – Jackson – NPI EA (分类=Jackson)
announcement - icon

用 Jackson 正确处理 JSON

下载电子书

电子书 – HTTP 客户端 – NPI EA (分类=Http 客户端)
announcement - icon

充分利用 Apache HTTP 客户端

下载电子书

电子书 – Maven – NPI EA (分类 = Maven)
announcement - icon

开始使用 Apache Maven

下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

电子书 – RwS – NPI EA (分类=Spring MVC)
announcement - icon

使用 Spring 构建 REST API 吗?

下载电子书

课程 – LS – NPI EA (分类=Jackson)
announcement - icon

通过 Learn Spring 课程开始学习 Spring 和 Spring Boot

>> 学习 SPRING
课程 – RWSB – NPI EA (分类=REST)
announcement - icon

通过构建一个完整的 REST API,深入了解 Spring Boot 3 和 Spring 6,使用该框架

>> 全新的“REST With Spring Boot”

课程 – LSS – NPI EA (分类=Spring Security)
announcement - icon

是的,Spring Security 可能很复杂,从核心内的更高级功能到框架中深入的 OAuth 支持。

我将安全材料构建为 两个完整的课程 - 核心和 OAuth,以针对这些更复杂的场景进行实践。 我们探索何时以及如何使用每个功能,并 在后台项目中对其进行编码

您可以在这里探索该课程

>> 学习 Spring Security

课程 – LSD – NPI EA (标签=Spring Data JPA)
announcement - icon

Spring Data JPA 是处理 JPA 复杂性的绝佳方式,它具有 Spring Boot 的强大简洁性

通过引导式参考课程开始使用 Spring Data JPA

>> 查看课程

合作伙伴 – Moderne – NPI EA (类别=Spring Boot)
announcement - icon

使用 OpenRewrite 安全且自动地重构 Java 代码。

手动重构大型代码库既缓慢、有风险,又容易拖延。OpenRewrite 应运而生。这个用于大规模、自动化代码转换的开源框架可以帮助团队安全、一致地进行现代化改造。

每个月,OpenRewrite 的创建者和维护者 Moderne 都会举办现场、实践培训课程——一个面向初学者,一个面向经验丰富的用户。您将了解配方的运作方式、如何将其应用于项目,以及如何自信地进行代码现代化改造。

参加下一次课程,带来您的问题,并学习如何自动化通常会占用您 sprint 时间的工作。

合作伙伴 – LambdaTest – NPI EA (类别=测试)
announcement - icon

回归测试是发布流程中的重要步骤,以确保新代码不会破坏现有功能。随着代码库的不断发展,我们希望频繁运行这些测试,以便尽早发现任何问题。

确保这些测试以自动化的方式频繁运行的最佳方法当然是将其包含在 CI/CD 管道中。 这样,每次向仓库提交代码时,回归测试将自动执行。

在本教程中,我们将学习如何使用 Selenium 创建回归测试,然后使用 GitHub Actions 将它们包含在我们的管道中,在 LambdaTest 云网格上运行

>> 如何使用 GitHub Actions 运行 Selenium 回归测试

课程 – LJB – NPI EA (类别 = Core Java)
announcement - icon

通过编码方式构建 Java 的坚实、实用的基础

>> 学习 Java 基础

1. 简介

在 Java 中,字符串是不可变的。一个在面试中经常被问到的问题是“为什么 Java 中的 String 被设计成不可变的?”

Java 的创建者 James Gosling 在一次采访中被问到应该在什么时候使用不可变对象,他回答说

只要可能,我都会使用不可变对象。

他进一步阐述了他的观点,说明了不可变性提供的特性,例如缓存、安全性、易于重用而无需复制等。

在本教程中,我们将进一步探讨 Java 语言设计者决定保持 String 不可变的原因。

2. 什么是不可变对象?

不可变对象是 在完全创建后其内部状态保持不变的对象。这意味着一旦对象被赋值给一个变量,我们就不能通过任何方式更新引用或改变内部状态。

我们有一篇单独的文章详细讨论了不可变对象。有关更多信息,请阅读 Java 中的不可变对象 文章。

3. 为什么 Java 中的 String 是不可变的?

保持这个类不可变的主要好处是缓存、安全性、同步和性能。

让我们讨论一下这些是如何运作的。

3.1. 介绍 String

String 是使用最广泛的数据结构。缓存 String 字面量并重用它们可以节省大量的堆空间,因为不同的 String 变量指向 String 池中的同一个 对象。String 驻留池(intern pool)正是为了这个目的而服务的。

Java 字符串池是 JVM 中存储 Strings 的特殊内存区域。由于 Strings 在 Java 中是不可变的,JVM 通过在池中存储每个字面量 String 的唯一副本来优化为其分配的内存量。这个过程称为驻留(interning)

String s1 = "Hello World";
String s2 = "Hello World";
         
assertThat(s1 == s2).isTrue();

由于前面示例中存在 String 池,两个不同的变量指向池中的同一个 String 对象,从而节省了宝贵的内存资源。

Why String Is Immutable In Java

我们有一篇专门介绍 Java String 池的文章。有关更多信息,请访问那篇文章

3.2. 安全性

String 在 Java 应用程序中被广泛用于存储敏感信息,例如用户名、密码、连接 URL、网络连接等。它也被 JVM 类加载器在加载类时广泛使用。

因此,从总体安全角度来看,保护 String 类至关重要。例如,考虑以下简单的代码片段

void criticalMethod(String userName) {
    // perform security checks
    if (!isAlphaNumeric(userName)) {
        throw new SecurityException(); 
    }
	
    // do some secondary tasks
    initializeDatabase();
	
    // critical task
    connection.executeUpdate("UPDATE Customers SET Status = 'Active' " +
      " WHERE UserName = '" + userName + "'");
}

在上面的代码片段中,假设我们从不可信来源收到了一个 String 对象。我们正在执行所有必要的安全检查,以检查 String 是否仅为字母数字,然后执行一些其他操作。

请记住,我们不可信的来源调用者方法仍然对这个 userName 对象有引用。

如果 Strings 是可变的,那么在我们执行更新的时候,我们无法确定我们接收到的 String,即使在执行安全检查之后,是否安全。 不可信的调用者方法仍然拥有引用,并且可以在完整性检查之间更改 String。因此,在这种情况下,我们的查询容易受到 SQL 注入的攻击。因此,可变的 Strings 可能会随着时间的推移导致安全性的降低。

也可能出现String userName 对另一个线程可见的情况,该线程可以在完整性检查之后更改其值。

通常,不变性在这种情况下起到了救援作用,因为当值不会改变时,使用敏感代码更容易操作,因为可能影响结果的操作交错情况更少。

3.3. 同步

由于String 不会被更改,因此自动使其成为线程安全的,即使从多个线程访问时也是如此。

因此,**总的来说,不可变对象可以在同时运行的多个线程之间共享。它们也是线程安全的**,因为如果一个线程更改了值,那么它不会修改相同的对象,而是在String池中创建一个新的String。因此,Strings 对于多线程操作是安全的。

3.4. Hashcode 缓存

由于String 对象被大量用作数据结构,因此它们也被广泛用于像HashMapHashTableHashSet等哈希实现中。在对这些哈希实现进行操作时,hashCode() 方法会被频繁调用用于分桶。

不变性保证了Strings 的值不会改变。因此,**hashCode() 方法在String 类中被重写以实现缓存,以便在第一次hashCode() 调用期间计算并缓存哈希值,并且之后每次都返回相同的值。**

这反过来提高了使用哈希实现与String 对象进行操作时集合的性能。

另一方面,如果String 的内容在操作之后被修改,可变的Strings 会在插入和检索时产生两个不同的哈希码,从而可能在Map 中丢失值对象。

3.5. 性能

正如我们之前看到的,String 池存在是因为Strings 是不可变的。反过来,它通过节省堆内存并在与Strings操作时更快地访问哈希实现来提高性能。

由于String 是使用最广泛的数据结构,因此提高String 的性能对提高整个应用程序的性能有相当大的影响。

4. 结论

通过本文,我们可以得出结论:**Strings 是不可变的,正是为了使它们的引用可以像普通变量一样处理,并且可以在方法之间和线程之间传递,而不必担心它们指向的实际String 对象会发生更改。**

我们还了解到,可能还有其他原因促使Java 语言设计者将此类设计为不可变的。

Baeldung Pro – NPI EA (类别 = Baeldung)
announcement - icon

Baeldung Pro 具有完全无广告以及最终具有深色模式,提供干净的学习体验

>> 探索干净的 Baeldung

一旦早期采用者的席位全部用完,价格将上涨并保持在每年 33 美元。

电子书 – HTTP 客户端 – NPI EA (类别=HTTP 客户端)
announcement - icon

Apache HTTP Client 是一个非常强大的库,适用于简单和高级用例,在测试 HTTP 端点时尤其适用。 查看我们的指南,涵盖基本请求和响应处理,以及安全性、Cookie、超时等。

>> 下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

课程 – LS – NPI EA (类别=REST)

announcement - icon

从 Spring Boot 开始,通过 Learn Spring 课程了解核心 Spring。

>> 查看课程

合作伙伴 – Moderne – NPI EA (标签=重构)
announcement - icon

现代 Java 团队行动迅速——但代码库并不总是跟上。 框架会发生变化,依赖关系会漂移,技术债务会累积,直到它开始拖慢交付速度。 OpenRewrite 就是为此而构建的:一个开源重构引擎,可在保持开发人员意图不变的同时自动化重复的代码更改。

由 Moderne 的 OpenRewrite 创建者和维护者领导的每月培训系列,将介绍实际的迁移和现代化模式。 无论您是重构配方的新手,还是准备编写自己的配方,您都将学习以安全且可扩展的方式进行重构的实用方法。

如果您曾经希望重构感觉像编写代码一样自然——并且一样快速——这是一个很好的起点

电子书 Jackson – NPI EA – 3 (类别 = Jackson)
© .