Java字符串的不可变性
源码
在IDEA中找到,String的源码
// Java 11
public final class String implements Serializable, Comparable<String>, CharSequence {@Stableprivate final byte[] value;private final byte coder;private int hash;private static final long serialVersionUID = -6849794470754667710L;...
}
- String类是被
final
修饰的,意味着不能被继承。 - String类实现了
Serializable
接口,意味着它可以被序列化;序列化可以理解为版本号的迭代,通过serialVersionUID记录。 - String类实现了
Comparable
接口,意味着最好不要使用==
来比较两个字符串是否相等,应该使用compareTo()
方法比较 - StringBuffer、StringBuilder和String一样,都实现了
CharSequence
接口。由于String是不可变的,所有字符串拼接的时候尽量就考虑他们。 - Java 9以前,String是用char数组实现的,之后改成了byte数组实现,并增加了coder来表示编码。在Latin1字符为主的程序里,可以把String占用的内存减少一般。改进在节省内存的同时也增加了编码检测的开销。
- 每一个字符串都有一个hash值,大概率不会重复,所以String很适合来作为HashMap的键值。
Latin1
Latin1是 ISO-8859-1 的别名,有些环境下写作Latin-1。. ISO-8859-1编码是单 字节 编码,向下兼容 ASCII ,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是 控制字符 ,0xA0-0xFF之间是文字符号。
CharSequence接口
public interface CharSequence
CharSequence是char值的可读序列。
该接口提供对许多不同类型的char序列的统一,只读访问。
CharSequence是一个描述字符串结构的接口,在这个接口里面一般发现有三种常用的子类:
(1)Stirng类
(2)StringBuffer类
(3)StringBuilder类
String的不可变性
- String 类被 final 关键字修饰,所以它不会有子类,这就意味着没有子类可以重写它的方法,改变它的行为。
- String 类的数据存储在 byte[] 数组中,而这个数组也被 final 关键字修饰了,这就表示 String 对象是没法被修改的,只要初始化一次,值就确定了。
为什么要这样设计?
第一,可以保证 String 对象的安全性,避免被篡改,毕竟像密码这种隐私信息一般就是用字符串存储的。
第二,保证哈希值不会频繁变更。毕竟要经常作为哈希表的键值,经常变更的话,哈希表的性能就会很差劲。
第三,可以实现字符串常量池。
不管是截取、拼接,还是替换,都不是在原有的字符串上进行的,而是重新生成了新的字符串对象。也就是说,这些操作执行过后,原来的字符串对象并没有发生改变。
String 对象一旦被创建后就固定不变了,对 String 对象的任何修改都不会影响到原来的字符串对象,都会生成新的字符串对象。
Java字符串的不可变性相关推荐
- 你真的理解Java 字符串的不可变性吗?
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...
- Java 字符串的不可变性
String在Java中特别常用,而且我们经常要在代码中对字符串进行赋值和改变他的值,但是,为什么我们说字符串是不可变的呢? 首先,我们需要知道什么是不可变对象? 不可变对象是在完全创建后其内部状态保 ...
- java 不可变性_Java字符串的不可变性
简明现代魔法 -> Java编程语言 -> Java字符串的不可变性 Java字符串的不可变性 2009-11-08 String 对象是不可变的. 看似修改了 String 对象的方法, ...
- 深入理解字符串的不可变性[java]
深入理解字符串的不可变性 /* 这篇文章是我认为写的最好的一篇文章,只要认真去看,我相信你一定会有收获 */ //只要你把其中的例题做对,也就代表你掌握了 首先,我们要探讨字符串的不可变性,那么究竟什 ...
- Java字符串就该这样设计
一翻开Java面试题,基本上都会有考察字符串的不可变性,new String()和""的区别,字符串+内部实现等相关问题,您可能也知道常量池,看了一些堆栈图,了解了上述答案,可是过 ...
- java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...
- snmpset对象不可写_别再问了,好吗?Java字符串一定是不可变的
最近,又有好几个小伙伴问我这个问题:"二哥,为什么 Java 的 String 要设计成不可变的啊?"说实话,这也是一道非常经典的面试题,面试官超喜欢问.我之前写过这方面的文章,现 ...
- Java字符串的处理
文章目录 本章学习要点 Java定义字符串(2种方式) 直接定义字符串 例 1 使用 String 类定义 1. String() 2. String(String original) 3. Stri ...
- 再见,Java字符串是不可变的
最近,又有好几个小伙伴问我这个问题:"二哥,为什么 Java 的 String 要设计成不可变的啊?"说实话,这也是一道非常经典的面试题,面试官超喜欢问.我之前写过这方面的文章,现 ...
最新文章
- spring问题--Unable to validate using XSD
- 带界面的OCX制作实例
- linux的常用操作——压缩和解压缩
- XGBoost的安装与介绍
- Jenkins中执行batch和Python
- web面试 new操作符到底干了什么?
- treeview 如何从多个数据表中获取数据动态生成 [提问]
- Android11.0 V-A/B无缝OTA升级update_engine
- 节点name在graph中无法展示_小节点 · 大奥秘│这正是你想学习的精妙休闲观景空间!(内含视频讲解)...
- 2012年九月六号阿里巴巴面试
- 前端页面加蒙版的几种方法
- win10装win7装win7
- IOS错误之----警告 Local declaration of 'XXX' hides insta
- mongo数据库取并集
- 2022上海省赛(A,E,G,H,M,N)
- 【数据分析案例】美国2015-2018年牛油果销售数据分析
- unity笔记_四舍六入五成双
- Photoshop 使用钢笔工具 进行抠图 商业出图入门
- form表单的enctype
- LVGL misc log日志系统(lv_log.h)
热门文章
- [Google API](4)搜索结果
- linux-多任务同步和互斥
- 人群密度估计--Generating High-Quality Crowd Density Maps using Contextual Pyramid CNNs
- 【Harvest源码分析】GetFilteredSignal函数
- 修改Windows的cmd和PowerShell 的字体
- vue.js与ajax删除,javascript - VueJs和VueResource,从Ajax请求中删除标头字段 - 堆栈内存溢出...
- mysql悲观锁和乐观锁
- git命令从入门到实战,看这一篇足矣
- Logstash(四)插件Output详解
- pandas 排序 给excel_懂Excel轻松入门Python数据分析包pandas(二十五):循环序列分组...