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 条评论
登录 后参与评论

相关文章

来自专栏Java爬坑系列

【Java入门提高篇】Day2 接口

  上一篇讲完了抽象类,这一篇主要讲解比抽象类更加抽象的内容——接口。   什么是接口呢?先来看一个现实中的栗子,我们常用的插座,一般分为两孔和三孔,所以基本上...

1868
来自专栏黑泽君的专栏

名词小解

----------------------------------------------------------------------------- py...

600
来自专栏MixLab科技+设计实验室

关于编程语言OC之9个基础知识点

这是《给自己的一份自学IOS开发的学习清单》中的《关于编程语言OC》读书笔记系列的第1篇。 入门务必记住这9点。 1、MAC操作系统上的整个开发环境成为Coco...

3498
来自专栏编程

Python萌新在九九乘法表中栽过的跟头

对于一个只听过一节python视频课的新手,写出九九乘法表毫无疑问是一件充满挑战的事情,所以写之前我在菜鸟教程中看了一些基础知识,看了点儿之后觉得不是特别难,于...

2108
来自专栏顶级程序员

6 个新奇的编程方式,改变你对编码的认知

源 | Reddit 译 | OSC - 周其 我时不时会发现一种编程语言的不同用法它有时候会改变我对编程的看法啊。这篇文章中,我想分享一下让我惊讶的发...

2804
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理

正文之前 今天的主题就是,重新学一次汇编语言,不过总感觉跟单片机的汇编语言没啥差别,不过就是地址变宽,然后一些限制多了不少,因为计算机要进行大量的运算,所以更加...

7357
来自专栏Java帮帮-微信公众号-技术文章全总结

02.工厂模式/抽象工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在...

2993
来自专栏耕耘实录

漫谈正则表达式

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1064
来自专栏Crossin的编程教室

【Python 第5课】变量

先告诉一直用在线编辑器的同学一个不幸的消息:昨天有同学反馈了之后我才发现,在线编辑器没办法完全模拟控制台下输入输出的操作。所以,你可以通过它来学习和实验,但是想...

2757
来自专栏Crossin的编程教室

每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生。今天,我们就来探讨一下有助于我们获取更佳编程风格的一...

3408

扫码关注云+社区