图说:为什么Java中的字符串被定义为不可变的

转载自 图说:为什么Java中的字符串被定义为不可变的

字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。

上面的箭头可以理解为“存储他的引用”。

当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该字符串的引用。

但是,如果在程序中明确声明要新创建一个字符串的话是可以在堆上重新创建一个对象的。如String s = new String("Hollis")


接着,我们来看两个字符串中常用的操作:截取和连接会发生什么,是在原来的字符串对象上修改还是重新创建字符串呢?

字符串的连接。String s1 = s.concat("Chuang");



字符串的截取。String s1 = s.substring(0,2);

从上图中我们可以得到一个结论,那就是——字符串是不可变的,无论发生什么操作,一个已经创建好的字符串的内容不会被改变,对它的任何类似修改的操作其实都是新生成了一个字符串对象。

那么,为什么要定义出不可变对象呢?


  • 缓存Hashcode

Java中经常会用到字符串的哈希码(hashcode)。例如,在HashMap中,字符串的不可变能保证其hashcode永远保持一致,这样就可以避免一些不必要的麻烦。这也就意味着每次在使用一个字符串的hashcode的时候不用重新计算一次,这样更加高效。

在String类中,有以下代码:private int hash;

以上代码中hash变量中就保存了一个String对象的hashcode,因为String类不可变,所以一旦对象被创建,该hash值也无法改变。所以,每次想要使用该对象的hashcode的时候,直接返回即可。

  • 使其他类的使用更加便利

在介绍这个内容之前,先看以下代码:

在上面的例子中,如果字符串可以被改变,那么以上用法将有可能违反Set的设计原则,因为Set要求其中的元素不可以重复。上面的代码只是为了简单说明该问题,其实String类中并没有value这个字段值。

  • 安全性

String被广泛的使用在其他Java类中充当参数。比如网络连接、打开文件等操作。如果字符串可变,那么类似操作可能导致安全问题。因为某个方法在调用连接操作的时候,他认为会连接到某台机器,但是实际上并没有(其他引用同一String对象的值修改会导致该连接中的字符串内容被修改)。可变的字符串也可能导致反射的安全问题,因为他的参数也是字符串。


  • 不可变对象天生就是线程安全的

因为不可变对象不能被改变,所以他们可以自由地在多个线程之间共享。不需要任何同步处理。

总之,String被设计成不可变的主要目的是为了安全和高效。所以,使String是一个不可变类是一个很好的设计。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

值得推荐的微软技术公众号推荐

为开阔技术人眼界,促进技术人职业成长。小二在此诚意推荐最值得关注的微软技术公众号。平时关注推送的文章或多或少要么学到知识技能,要么收到一些启发,有利于个人成长。这些公众号为笔者个人积累,不一定都合大家口味,…

springboot:BeanPostProcessor示例及分析

【README】 1,本文主要分析 BeanPostProcessor 的作用, 开发方式; 2,BeanPostProcessor 是bean后置处理器, 简而言之就是bean被创建好了,之后如果需要对其属性进行修改,则 需要使用 BeanPost…

实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定

简介一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口。内部类先讲内…

Java 8 日期和时间解读

转载自 Java 8 日期和时间解读现在,一些应用程序仍然在使用java.util.Date和java.util.Calendar API和它们的类库,来使我们在生活中更加轻松的处理日期和时间,比如:JodaTime。然而,Java 8 引进的新的类库来处理日期和时…

云计算产值将超3000亿美元 亚马逊微软谷歌居三甲

腾讯科技讯 3月27日消息,据外电报道,云计算曾经主要是无法承担建造和维护基础设施的初创公司的解决方案,但对于管理数字业务的大型企业而言,云计算正快速成为省钱的管理数字业务的方式。市场调研公司IDC在上月的一份调查数据显示&…

oracle中join另一个表后会查询不出一些数据_面试必备 | 8个Hive数据仓工具面试题锦集!...

是新朋友吗?记得先点蓝字关注我哦~今日课程菜单Java全栈开发 | Web前端H5大数据开发 | 数据分析人工智能Python | 人工智能物联网进入数据时代,大数据技术成为互联网发展的核心要素之一。与此同时大数据开发工程师的薪资也成为行业内高薪的代…

springboot-Initializer例子及分析

【README】 1,本文主要编写了 初始化器例子并分析了其调用路径; 2,初始化器的执行顺序 先于 后置处理器; 后置处理器,refer2 springboot:BeanPostProcessor示例及分析_PacosonSWJTU的博客-CSDN博客【RE…

ASP.NET 开发人员不必担心 Node 的五大理由

哦别误会……我真的很喜欢 Node,而且我觉得它提出的概念和模式将在很长一段时间内,对服务端 Web 编程产生深远的影响。即使随着时间的推移 Node 过气了,我们肯定可以从下一个牛逼玩意身上或多或少的感觉到它的影响(不管好的和/或坏的)。而在这…

Spring Boot面试题

转载自 Spring Boot面试题 Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家。问题一 Spring Boot、Spring MVC 和 Spring 有什么区别? SpringFrameSpringFramework 最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就…

synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。因此为了解决这个问题,我们可能需要这样一个方案&#xff0…

转:Java 7 种阻塞队列详解

转自: Java 7 种阻塞队列详解 - 云社区 - 腾讯云队列(Queue)是一种经常使用的集合。Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。和 List、Set ...https://cloud.tencent.com/de…

微软Build 2016前瞻:让开发者编写能畅行所有设备的app

本周三,5000名软件开发者将齐聚旧金山莫斯康展览中心参加微软公司年度开发者大会(Build 2016),和往年一样,微软在大会上发布了一系列新的技术支持。 据透露,微软将会让开发人员编写可以在任何Windows设备上…

XSS的那些事儿

转载自 XSS的那些事儿XSS是什么XSS,Cross-site scripting,跨站脚本攻击,为了区分与CSS,起名为XSS。黑客利用网站的漏洞,通过代码注入的方式将一些包含了恶意攻击脚本程序注入到网页中,企图在用户加载网页时…

js 时间戳转换成时间_JavaScript 时间戳转成日期格式

我们在开发中经常需要把时间戳转化成日期格式,但 JavaScript 本身自带的 Date 方法并不像 PHP date 的那么强大。因此,我们就需要自己动手写一个方法。首先我们要先了解下需要用到的 JavaScript 自带的 Date 对象的方法:getDate:获…

java阻塞队列小结

【README】 1,本文介绍了java的7个阻塞队列; 2,阻塞队列的作用 做缓冲作用,如缓冲kafka消息,而不是直接发送给kafka,减少kafka集群的压力;【1】阻塞队列 BlockingQueue 概述 1,队…

来自.NET FM的感谢信

掐指一算,我们的播客 .NET FM 已经上线一周了!!!不过瞅下节节攀升的流量,二位主播一边感叹 .NET 中文社区的热情,一边摸了摸瘪下去的荷包: • 首日访问 > 2000人次 • 五日访问 > 5000人次…

并发场景下MySQL存在的问题及解决思路

转载自 并发场景下MySQL存在的问题及解决思路 目录1、背景2、表锁导致的慢查询的问题3、线上修改表结构有哪些风险?4、一个死锁问题的分析5、锁等待问题的分析6、小结 一、背景对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据…

python queue 生产者 消费者_【python】-- 队列(Queue)、生产者消费者模型

队列(Queue)在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用队列的好处:提高双方的效率,你只需要把数据放到队列中,中间去干别的事情。完成了程序的解耦性,两者关系依赖性没有不大。一、队列的类型&…

关于.NET技术前途问题的讨论

我去年曾经在论坛发起过关于.NET技术前途问题这个话题的讨论,也引起了很多同行和朋友的回复,时间过去大半年,自己也有了一些新的理解。本文的目的就是将其中一些精彩的观点整理出来并谈谈自己的观点。 引子 我们都知道微软.NET技术更新速度快…

用枚举enum实现单例

【README】 1,effectivejava 讲到使用 枚举类实现单例的例子,非常好用;2,好处如下: 不用定义私有构造器;不用定义获取单例的方法,如 getInstance() ;通过 枚举类.INSTANCE() 就可以…