源码

在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;...
}
  1. String类是被final修饰的,意味着不能被继承
  2. String类实现了Serializable接口,意味着它可以被序列化;序列化可以理解为版本号的迭代,通过serialVersionUID记录。
  3. String类实现了Comparable接口,意味着最好不要使用==来比较两个字符串是否相等,应该使用compareTo()方法比较
  4. StringBuffer、StringBuilder和String一样,都实现了CharSequence接口。由于String是不可变的,所有字符串拼接的时候尽量就考虑他们。
  5. Java 9以前,String是用char数组实现的,之后改成了byte数组实现,并增加了coder来表示编码。在Latin1字符为主的程序里,可以把String占用的内存减少一般。改进在节省内存的同时也增加了编码检测的开销。
  6. 每一个字符串都有一个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字符串的不可变性相关推荐

  1. 你真的理解Java 字符串的不可变性吗?

    作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...

  2. Java 字符串的不可变性

    String在Java中特别常用,而且我们经常要在代码中对字符串进行赋值和改变他的值,但是,为什么我们说字符串是不可变的呢? 首先,我们需要知道什么是不可变对象? 不可变对象是在完全创建后其内部状态保 ...

  3. java 不可变性_Java字符串的不可变性

    简明现代魔法 -> Java编程语言 -> Java字符串的不可变性 Java字符串的不可变性 2009-11-08 String 对象是不可变的. 看似修改了 String 对象的方法, ...

  4. 深入理解字符串的不可变性[java]

    深入理解字符串的不可变性 /* 这篇文章是我认为写的最好的一篇文章,只要认真去看,我相信你一定会有收获 */ //只要你把其中的例题做对,也就代表你掌握了 首先,我们要探讨字符串的不可变性,那么究竟什 ...

  5. Java字符串就该这样设计

    一翻开Java面试题,基本上都会有考察字符串的不可变性,new String()和""的区别,字符串+内部实现等相关问题,您可能也知道常量池,看了一些堆栈图,了解了上述答案,可是过 ...

  6. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  7. snmpset对象不可写_别再问了,好吗?Java字符串一定是不可变的

    最近,又有好几个小伙伴问我这个问题:"二哥,为什么 Java 的 String 要设计成不可变的啊?"说实话,这也是一道非常经典的面试题,面试官超喜欢问.我之前写过这方面的文章,现 ...

  8. Java字符串的处理

    文章目录 本章学习要点 Java定义字符串(2种方式) 直接定义字符串 例 1 使用 String 类定义 1. String() 2. String(String original) 3. Stri ...

  9. 再见,Java字符串是不可变的

    最近,又有好几个小伙伴问我这个问题:"二哥,为什么 Java 的 String 要设计成不可变的啊?"说实话,这也是一道非常经典的面试题,面试官超喜欢问.我之前写过这方面的文章,现 ...

最新文章

  1. spring问题--Unable to validate using XSD
  2. 带界面的OCX制作实例
  3. linux的常用操作——压缩和解压缩
  4. XGBoost的安装与介绍
  5. Jenkins中执行batch和Python
  6. web面试 new操作符到底干了什么?
  7. treeview 如何从多个数据表中获取数据动态生成 [提问]
  8. Android11.0 V-A/B无缝OTA升级update_engine
  9. 节点name在graph中无法展示_小节点 · 大奥秘│这正是你想学习的精妙休闲观景空间!(内含视频讲解)...
  10. 2012年九月六号阿里巴巴面试
  11. 前端页面加蒙版的几种方法
  12. win10装win7装win7
  13. IOS错误之----警告 Local declaration of 'XXX' hides insta
  14. mongo数据库取并集
  15. 2022上海省赛(A,E,G,H,M,N)
  16. 【数据分析案例】美国2015-2018年牛油果销售数据分析
  17. unity笔记_四舍六入五成双
  18. Photoshop 使用钢笔工具 进行抠图 商业出图入门
  19. form表单的enctype
  20. LVGL misc log日志系统(lv_log.h)

热门文章

  1. [Google API](4)搜索结果
  2. linux-多任务同步和互斥
  3. 人群密度估计--Generating High-Quality Crowd Density Maps using Contextual Pyramid CNNs
  4. 【Harvest源码分析】GetFilteredSignal函数
  5. 修改Windows的cmd和PowerShell 的字体
  6. vue.js与ajax删除,javascript - VueJs和VueResource,从Ajax请求中删除标头字段 - 堆栈内存溢出...
  7. mysql悲观锁和乐观锁
  8. git命令从入门到实战,看这一篇足矣
  9. Logstash(四)插件Output详解
  10. pandas 排序 给excel_懂Excel轻松入门Python数据分析包pandas(二十五):循环序列分组...