Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.介绍

在Java中,字符串是不可变的。在访谈中非常普遍的一个明显的问题是“为什么字符串在Java中设计是不可变的?”

James Gosling,Java的创造者,曾经在面试中被问到这个问题吗什么时候应该使用不变变量呢?他的回答是:

只要有可能,我会使用不可变的。

他进一步支持他的论点,说明不断的能力提供的功能,如缓存,安全性,轻松重用而没有复制等。

在本教程中,我们将进一步探索为什么Java语言设计人员决定保留细绳不可变。

2.什么是不可变对象?

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

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

3.为什么是细绳在Java中不可变?

将此类视为不可变的关键优势是缓存,安全性,同步和性能。

让我们讨论这些事情如何工作。

3.1。介绍给细绳水池

细绳是最广泛使用的数据结构。缓存细绳文字并重新使用它们,因为不同的堆空间细绳变量引用了相同的对象细绳水池。细绳实习池确切地用了这个目的。

java字符串池是特殊的内存区域,其中由JVM存储。自从在Java中是不可变的,JVM通过存储每个文字的一个副本来优化为它们分配的内存量细绳在游泳池。这个过程称为Interning:

string s1 =“Hello World”;string s2 =“hello world”;assertthat(s1 == s2).istrue();

因为细绳池在前面的例子中,两个不同的变量指向相同的变量细绳来自池的对象,从而节省了重要的记忆资源。

我们有一个致力于Java的单独文章细绳水池。想要查询更多的信息,前往那篇文章

3.2。安全

细绳广泛应用于Java应用程序,以存储用户名,密码,连接URL,网络连接等的敏感信息。它也通过JVM类加载器在加载类时广泛使用。

因此固定细绳班级对整个申请的安全性至关重要。例如,考虑这个简单的代码片段:

void criticalMethod(String userName){//执行安全检查if (!isAlphaNumeric(userName)) {throw new SecurityException();} //执行一些次要任务initializeDatabase();//关键任务连接。executeUpdate("UPDATE Customers SET Status = 'Active' " + " WHERE UserName = '" + UserName + "'");}

在上面的代码片段中,假设我们收到了一个细绳来自不值得信任的来源的对象。我们正在做所有必要的安全检查,最初检查是否存在细绳只是字母数字,后跟一些操作。

请记住,我们的不可靠的源呼叫者方法仍然对此引用用户名对象。

如果是可变的,然后在我们执行更新时,我们无法确定细绳我们收到的东西,即使经过安全检查,也会是安全的。不值得信任的来电方式仍然具有参考,可以改变细绳在完整性检查之间。从而在这种情况下使我们的查询容易出现SQL注入。如此可变的可能会随着时间的推移导致安全退化。

它也可能发生这种情况细绳用户名另一个线程可见,然后可以在完整性检查后更改其值。

一般来说,在这种情况下,不可改性是我们的救援,因为当值不会改变时,在敏感代码中运行更容易,因为可能会影响结果的操作较少。

3.3。同步

不可变会自动生成细绳线程安全,因为当从多个线程访问它们时,它们不会被更改。

因此通常,不可变对象可以在同时运行的多个线程之间共享。他们也是线程安全的因为如果线程更改值,那么而不是修改相同,是一个新的细绳将被创造在细绳水池。因此,对于多线程来说是安全的。

3.4。Hashcode缓存

自从细绳对象大量用作数据结构,它们也广泛用于散列实现(如Hashmap.哈希表hashset.等。当对这些哈希实现进行操作时,hashcode()方法被调用非常经常用于铲斗。

不规则性保证他们的价值不会改变。所以hashcode()方法是覆盖的细绳类以方便缓存,以便在第一个缓存期间计算和缓存散列hashcode()调用后,将返回相同的值。

反过来,这改善了使用散列实现的集合的性能细绳对象。

另一方面,可变的如果内容的内容,在插入和检索时会产生两个不同的哈希码细绳操作后修改的值,可能丢失地图

3.5。表现

正如我们之前看到的,细绳池存在是因为是不可变的。反过来,它通过保存堆存储器并在运行时更快地访问哈希实现的性能字符串。

自从细绳是最广泛使用的数据结构,提高了性能细绳对于提高整个应用程序的总体性能有相当大的影响。

4。结论

通过本文,我们可以得出结论字符串精确地是不可变的,因此它们的引用可以被视为普通变量,并且可以在方法和跨线之间传递它们,而不担心是否实际金宝搏官网188be细绳对象它指向将改变。

我们还了解到其他可能的原因java.语言设计师将此课程成为不可变。

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
本文评论关闭!