Java漫谈11

这次我们接着聊String,这次我们聊聊String类为什么是final的。

之所以聊这个,是因为在知乎上看了一篇帖子,看完后让我对这个点有了认识,在这里跟你分享分享我的理解。

点击原文给你看这篇帖子。

总结来说,String之所以设计成final,是为了数据安全。

因为String不是8大基本的数据类型,所以String的值其实存的是一个内存地址,在这个地址就相当于存储值的那个仓库的编号。例如:

String a = "hello world";

这之中,a的实际值并不是hello world,而是类似于0x0045这样的内存地址值。因此,假设一种场景,假设String并不是final。此时,新定义一个变量b,并将变量a赋值给b。逻辑上是变量a将值赋给了变量b,可实际上是变量a将刚才提到的代表内存地址的“门牌号”赋值了了b。此时,如果我们要是修改b的值(变成“hello world-b”),其实,a的值也会一并修改。

而这样就与我之前的想要的逻辑结果不一致了,因为我只是仅仅想要b的值变成“hello world-b”,而a的值仍然保持“hello world”不变。

好,现在我们来看看在final修饰的场景下,String的结果又会怎样。注意,此时我们重新定义一下String的修饰场景,即String是有final修饰,但String并未启用常量池。同样是b复制了a的地址,b修改值,也就是b按照门牌号码找到仓库,去仓库里修改商品去了。所以b修改完之后,当a再顺着地址值(门牌号码)去提取商品信息的时候,发现商品也变了。

咦……这还是不对啊,实际当中的String遇到这种情况,结果是b变,a不变的呀。难道是常量池的作用,不对,常量池只是保证了读取速度的提高,而不会对值进行改变。如此一来,一个比较靠谱的解释就如文章中@胖胖所说:

所以 String 是不可变,关键是因为 SUN 公司的工程师,在后面所有 String 的方法里很小心的没有去动 Array 里的元素,没有暴露内部成员字段。

好了,逻辑分析完了,我想说说我自己弄清这些这个逻辑之后的感受。Java的String这个类是我在一开始学习的时候遇到的,起初一直把它误认为是一个基本的数据类型,以为它就是很简单的一个底层的实现。聊了这两期漫谈之后,才发现,在它平淡的外表下,原来隐藏着一个比较深的逻辑设计回路。而这个回路也正是工程师构造数据类型,封装数据功力的体现。

而这样的功力让我想到了一个词——静水流深。意思是通过表面平静的水并不知道水底有多深,来暗喻表面不声不响的人却藏着大智慧。我想这个词即适用于String这个类,也适用于构造String这个类的那些工程师们。

向String这个类,向构造这些类的工程师们致敬。愿你我有一天也能踏入这层境界。

清 单

  1. String的final主要的作用是保证了数据的安全。
  2. 表面上看它的数据安全来源于final的不可变性,实际上是来源于String类底层的封装。

原文发布于微信公众号 - 怀英的自我修炼(hydzwxl)

原文发表时间:2017-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

32710
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2932
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4075
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25410
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4878
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2627
来自专栏落花落雨不落叶

canvas画简单电路图

65711
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2232
来自专栏杨龙飞前端

scrollto 到指定位置

2554
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7

扫码关注云+社区