String的源码理解(未写完)
String本质上是一个char数组(jdk 9之后是byte数组),并且是一个声明为final的数组,并且String的不可变也是通过这种把数组声明为final来实现的
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
这个数组被声明为final之后,就意味着数组初始化之后值不可再变化,并且也不能再引用其他的数组,因此用这种方式可以保证String的唯一,那么为什么String要声明为不可变呢?好处主要有两个,安全和高效,从安全的角度上看,因为String是不可变的,因此可以一保证一个String的唯一性。提到高效的话,我们就需要引入String常量池这个概念,当一个声明一个String对象或者new 一个String对象时,首先会从常量池中进行查找是否有这个和这个字符串的值相等的字符串,如果有直接返回常量池中该字符串的引用,如果没有,在常量池中创建这个字符串常量,放入常量池。因此对于高效而言,当创建一个字符串的时候,从常量池中寻找是否有对应的字符串,如果有就返回引用,免去了频繁创建的性能开销。
new String 和声明String之间的区别
public class Main {
public static void main(String[] args) {
String a = "a";
String b = "a";
String c = new String("a");
String d = new String("a");
System.out.println(a == b);//true
System.out.println(c == d);//false
}
}
- String a = "a" ,String b = "a"会在首先在常量池中寻找是否有字符串"a",有则返回引用,没有则创建,因此这两个比较是true,因为是相同的引用,因此 String a 这种方式只会创建一个对象,或者不创建对象
- new String这种方式至少创建一个对象或者创建两个对象,首先 String c = new String("a");这句话,至少会在堆中创建一个为c的String对象,他的值为a,如果这个值在常量池中没有的话,那么还会创建一个值为a的常量对象放入常量池,所以说它至少创建一个,可能创建两个,
以下是 String 构造函数的源码,可以看到,在将一个字符串对象作为另一个字符串对象的构造函数参数时,并不会完全复制 value 数组内容,而是都会指向同一个 value 数组。
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
1
String的源码理解(未写完)的更多相关文章
- elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复
摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...
- 基于SpringBoot的Environment源码理解实现分散配置
前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...
- Caffe源码理解2:SyncedMemory CPU和GPU间的数据同步
目录 写在前面 成员变量的含义及作用 构造与析构 内存同步管理 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 在Caffe源码理解1中介绍了Blob类,其中的数据成 ...
- .NET Core 3.0之深入源码理解Startup的注册及运行
原文:.NET Core 3.0之深入源码理解Startup的注册及运行 写在前面 开发.NET Core应用,直接映入眼帘的就是Startup类和Program类,它们是.NET Core应用程 ...
- 深入源码理解Spring整合MyBatis原理
写在前面 聊一聊MyBatis的核心概念.Spring相关的核心内容,主要结合源码理解Spring是如何整合MyBatis的.(结合右侧目录了解吧) MyBatis相关核心概念粗略回顾 SqlSess ...
- HDU 4640 状态压缩DP 未写完
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...
- jedis的源码理解-基础篇
[jedis的源码理解-基础篇][http://my.oschina.net/u/944165/blog/127998] (关注实现关键功能的类) 基于jedis 2.2.0-SNAPSHOT ...
- AdvanceEast源码理解
目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...
- VUEJS2.0源码理解--优
VUEJS2.0源码理解 http://jiongks.name/blog/vue-code-review/#pingback-112428
随机推荐
- Java 入土之路
概述 变量与数据类型 运算符与方法 面向对象 异常处理 包装类与常量池 集合框架 多线程 网络通讯协议 socket 编程-概念未发布 socket 编程-java环境未发布 web入门 Servle ...
- DevExpress MVVM<1>
DevExpress MVVM 概念 模型 -定义数据和您的业务逻辑. 视图 -指定UI,包括绑定到ViewModel中的属性和命令的所有可视元素(按钮,标签,编辑器等). ViewModel-连接模 ...
- MySQL修改数据库时区
--查看数据库时区设置mysql> show variables like "%time_zone%"; +------------------+--------+ | Va ...
- 如何抓取 framework input 事件相关 log
出现事件输入相关的问题时, 建议先 followhttp://429564140.iteye.com/blog/2355405来检测对应的设备是否有响应输入 如果没有响应输入,则可能是 driver ...
- 《Python3 网络爬虫开发实战》学习资料
<Python3 网络爬虫开发实战> 学习资料 百度网盘:https://pan.baidu.com/s/1PisddjC9e60TXlCFMgVjrQ
- Github访问速度很慢的原因,以及解决方法
1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数据时,不需要直接从源站获取,通过CDN对于数 ...
- 教你如何在5分钟轻松部署squid正向代理
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返 ...
- Httpclient 4.5.2 请求重试机制
重点是HttpRequestRetryHandler.retryRequest()方法 public static String callHttpServer(String contentType,S ...
- pytest系列(一):什么是单元测试界的高富帅?
pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试.自动化测试工作中. unittest也是python语言中一款单元测试框架,但是功能有限,没有pyte ...
- 如何使用第三方ui库vant-weapp
如何使用第三方ui库vant-weapp 1==>创建文件夹demo 2==> 在小程序 中打开 注意 要先在小程序中打开 如果要想在小程序的开发工具中打开某一个 文件夹 要么是空文件夹 ...