JAVA中的String类(详解)
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:适用多线程下在字符缓冲区进行大量操作的情况
最新文章
- ASP.NET Core Kestrel部署HTTPS
- 11g新特性:Health Monitor Checks
- C#的变迁史 - C# 5.0 之其他增强篇
- Scalaz(30)- Free :Natural Tranformation ~>; - map higher kinded types for free
- 在MacBook Air 上装Win10的,反反复复的失败过程。
- HDU 1176免费馅饼 DP数塔问题转化
- 【SpringMVC】SpringMVC系列11之Restful的CRUD
- [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
- Java [leetcode 38]Count and Say
- SQL70001: This statement is not recognized in this context.
- 使用Windows2003的IIS发布网站 - 进阶者系列 - 学习者系列文章
- tp框架命名空间
- Java历程-初学篇 Day06 循环结构
- 总结,为什么要重写hashset的hashcode()和equals()?
- 【redis专题(5)】命令语法介绍之sets
- Nginx+keepalived 双机热备(主主模式)
- hdu 1828 Picture(线段树扫描线矩形周长并)
- day29-序列化 json、pickle、shelve
- file-downloader相关问题
- [转]谈谈 Mifare Classic 破解
热门文章
- 2019年春季学期第四周作业Compile Summarize
- canal 代码阅读
- ubuntu 切换到ROOT权限
- Unity shader之ColorMask
- rpgmakermv \c 常用颜色一览
- Idea导包与打包
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 166: illegal multibyte sequence
- 20175208 《Java程序设计》第八周学习总结
- Python数据分析Pandas库之熊猫(10分钟二)
- js中,转义字符的表示