Java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。String是一个类不属于基本数据类型。

可以从源码中看到,String是一个final类型。

String被设计成不可变(immutable)类,所以它所有的对象都是不可变对象。

String为什么设计成不可变?

String不可变的原因包括: 设计考虑,效率优化问题,以及安全性这三大方面

(以下根据查询的资料,做一份精简化的总结)

1. 字符串常量池的需要字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

如下图所示:

2. 允许String对象缓存HashCode
Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。

String类中源码,用来缓存hashCode

3. 安全性
String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

(来自博客————

翻译人员: 铁锚

翻译日期: 2013年11月18日

原文链接: Why string is immutable in Java ?

那么因为这一特征,我们来了解String的特点

String类中“==” 和equals()的比较:

“==”进行的是数值比较,比较的是两个字符串的地址的数值;

equals()进行的是字符串内容的比较。

从结果使用“==”可以看到直接赋值所得为true,使用构造函数所得为false

采用直接赋值:在jvm底层会自动维护一个对象池(可以理解为对象数组),若采用直接赋值的操作,那么该实例化对象(字符串)将自动保存到对象池中,如果下次继续使用直接赋值声明了String类对象,那么如果此时对象池之中存在指定内容,则直接进行引用,若没有,则开辟新的字符串对象,然后将其保存在新的对象池之中以供下次使用。

也就是说,当我再创建另一个字符串,则是取得同一个地方的值。

采用构造方法:String str = new string("hello"):如果使用构造方法则会开辟两块堆内存空间,而且有一块会成为垃圾,且对字符串共享产生影响。

也就是说,当我再创建另一个字符串,原来的值依旧存在堆内存,在此基础上又开辟了一新的块内存。

结论:

所有的语言对于字符串的底层实现都是通过字符数组实现的,所以字符串常量不可改变。我们所见的字符串的变更,是字符串对象的变更

扩展:String与StringBuffer、StringBuilder的区别

  String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

最新文章

  1. ASP.NET Core Kestrel部署HTTPS
  2. 11g新特性:Health Monitor Checks
  3. C#的变迁史 - C# 5.0 之其他增强篇
  4. Scalaz(30)- Free :Natural Tranformation ~> - map higher kinded types for free
  5. 在MacBook Air 上装Win10的,反反复复的失败过程。
  6. HDU 1176免费馅饼 DP数塔问题转化
  7. 【SpringMVC】SpringMVC系列11之Restful的CRUD
  8. [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
  9. Java [leetcode 38]Count and Say
  10. SQL70001: This statement is not recognized in this context.
  11. 使用Windows2003的IIS发布网站 - 进阶者系列 - 学习者系列文章
  12. tp框架命名空间
  13. Java历程-初学篇 Day06 循环结构
  14. 总结,为什么要重写hashset的hashcode()和equals()?
  15. 【redis专题(5)】命令语法介绍之sets
  16. Nginx+keepalived 双机热备(主主模式)
  17. hdu 1828 Picture(线段树扫描线矩形周长并)
  18. day29-序列化 json、pickle、shelve
  19. file-downloader相关问题
  20. [转]谈谈 Mifare Classic 破解

热门文章

  1. 2019年春季学期第四周作业Compile Summarize
  2. canal 代码阅读
  3. ubuntu 切换到ROOT权限
  4. Unity shader之ColorMask
  5. rpgmakermv \c 常用颜色一览
  6. Idea导包与打包
  7. UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 166: illegal multibyte sequence
  8. 20175208 《Java程序设计》第八周学习总结
  9. Python数据分析Pandas库之熊猫(10分钟二)
  10. js中,转义字符的表示