您所在的位置:主页 > 新闻资讯 > IT资讯 > Java资讯 >

java基础知识梳理:String在Java中不可变的五点原因分析

来源:未知

发布时间:2019-08-09

阅读量:

  “为什么String在Java中是不可变的”是 Java 中最常被问到的字符串访问问题之一,今天上元IT为大家对java基础知识梳理一下:它首先讨论了什么是 String,Java 中的 String 如何与 C 和 C++ 中的 String 不同,然后转向在Java中什么是不可变对象,不可变对象有什么好处,为什么要使用它们以及应该使用哪些场景。

  这个Java面试问题,很棘手,但同时也非常有用,一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的。

  字符串在 Java 中是不可变的,因为 String 对象缓存在 String 池中。由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作会影响所有其他客户。例如,如果一段代码将 String “Test” 的值更改为 “TEST”,则所有其他客户也将看到该值。由于 String 对象的缓存性能是很重要的一方面,因此通过使 String 类不可变来避免这种风险。

  同时,String 是 final 的,因此没有人可以通过扩展和覆盖行为来破坏 String 类的不变性、缓存、散列值的计算等。String 类不可变的另一个原因可能是由于 HashMap。

  由于把字符串作为 HashMap 键很受欢迎。对于键值来说,重要的是它们是不可变的,以便用它们检索存储在 HashMap 中的值对象。由于 HashMap 的工作原理是散列,因此需要具有相同的值才能正常运行。如果在插入后修改了 String 的内容,可变的 String将在插入和检索时生成两个不同的哈希码,可能会丢失 Map 中的值对象。

  字符串是Java的 VVS Laxman,即非常特殊的类。我还没有看到一个没有使用 String 编写的 Java 程序。这就是为什么对 String 的充分理解对于 Java 开发人员来说非常重要。

  String 作为数据类型,传输对象和中间人角色的重要性和流行性也使这个问题在 Java 面试中很常见。

  1.想象字符串池没有使字符串不可变,它根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如 “Test” 已被许多参考变量引用,因此如果其中任何一个更改了值,其他参数将自动受到影响;

  2.如果 String 不是不可变的,这将导致严重的安全威胁,我的意思是有人可以访问他有权授权的任何文件,然后可以故意或意外地更改文件名并获得对该文件的访问权限。由于不变性,你无需担心这种威胁。

  3.由于 String 是不可变的,它可以安全地共享许多线程,这对于多线程编程非常重要. 并且避免了 Java 中的同步问题,不变性也使得String 实例在 Java 中是线程安全的,这意味着你不需要从外部同步 String 操作。

  4.因为 String 是不可变的,所以没有人可以在创建后更改其内容,这保证了 String 的 hashCode 在多次调用时是相同的。

  5.String 不可变的绝对最重要的原因是它被类加载机制使用,因此具有深刻和基本的安全考虑。

  上元IT课程简介:

  上元Java精英班,作为全日制班级,5个月学习,半军事化管理,做到对学员负责。周周有周考,月月有月考。每周周一到周五上课,晚上有晚自习,助教陪同,周六老师带领复习以及考试!每三个月一次课程更新,紧跟企业需求。毕业前期有项目实践,校企合作协议,100+合作企业,企业来校招聘,保证学员顺利毕业!

  顺便说一句,如果大家还有其他问题,欢迎交流,更多java基础知识为大家带来,来上元,学IT,授课课程形式多样化,项目实训,让你学有所成。

免责声明:本站所提供资讯均来源于网友提供或网络搜集,由本站编辑整理, 仅供个人研究、交流学习使用,不涉及商业盈利目的。如涉及版权问题, 请联系本站管理员予以更改或删除。

相关资讯

免费预约试听课程

只要一个电话,即可获得免费试听的机会

选课报班:

×

TOP