源码分析之String
先看属性
底层是char数组,一目了然
可以看到,value[]是存储String的内容的,即当使用String str = “abc”;的时候,本质上,"abc"是存储在一个char类型的数组中的。
**
String底层的存储结构是一个字符类型的数组,同样也是被final修饰,因此一旦这个字符数组被创建后,value变量不可再指向其他数组,但是可以改变value数组中某一个元素的值。
/** The value is used for character storage. */private final char value[];
而hash是String实例化的hashcode的一个缓存。因为String经常被用于比较,比如在HashMap中。如果每次进行比较都重新计算hashcode的值的话,那无疑是比较麻烦的,而保存一个hashcode的缓存无疑能优化这样的操作。
hash用来保存某一个String实例自己的哈希值,可以说是哈希值的一个缓存,因此String特别适合放入HashMap中,作为key来使用。每次插入一个键值対时,不需要重新计算key的哈希值,直接取出key的缓存hash值即可,在一定程度上,加快了HashMap的效率。
/** Cache the hash code for the string */private int hash; // Default to 0
序列化id,用于判断序列化时候的版本啥的
/** use serialVersionUID from JDK 1.0.2 for interoperability */private static final long serialVersionUID = -6849794470754667710L;
构造方法
String支持多种初始化方法,包括接收String,char[],byte[],StringBuffer等多种参数类型的初始化方法。但本质上,其实就是将接收到的参数传递给全局变量value[]。
public String() {this.value = "".value;this.coder = "".coder;}
方法
知道了String其实内部是通过char[]实现的,那么就不难发现length(),isEmpty(),charAt()这些方法其实就是在内部调用数组的方法。
public int length() {return value.length >> coder();}
public boolean isEmpty() {return value.length == 0;}
public char charAt(int index) {if (isLatin1()) {return StringLatin1.charAt(value, index);} else {return StringUTF16.charAt(value, index);}}
public static char charAt(byte[] value, int index) {checkIndex(index, value);return getChar(value, index);}
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String aString = (String)anObject;if (!COMPACT_STRINGS || this.coder == aString.coder) {return StringLatin1.equals(value, aString.value);}}return false;}
源码分析之String相关推荐
- STL 源码分析之string(一)基础篇
STL源码下载: https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996 ...
- 【Java源码分析】String 方法 startsWith
startsWith() startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean startsWith(String prefix, int toffs ...
- 【Java源码分析】String 比较 equals
equals() equals() 方法用于将字符串与指定的对象比较. String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等. 语法 public boolean equa ...
- 【Java源码分析】String 检测 startsWith
目录 startsWith() 语法 参数 返回值 实例 源码 startsWith() startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean sta ...
- StringBuffer类【JDK源码分析】
StringBuffer类[JDK源码分析] 前言 推荐 说明 StringBuffer类 基本信息 属性 构造方法 部分方法 length capacity append insert revers ...
- Java源码详解四:String源码分析--openjdk java 11源码
文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...
- 【转】源码分析C++的string实现
转自:源码分析C++的string实现 - 知乎 我们平时使用C++开发过程中或多或少都会使用std::string,但您了解string具体是如何实现的吗,这里程序喵给大家从源码角度分析一下. 读完 ...
- 源码分析 There is no getter for property named '*' in 'class java.lang.String
2019独角兽企业重金招聘Python工程师标准>>> There is no getter for property named '*' in 'class java.lang.S ...
- startsWith(String prefix,int toffset)源码分析
startsWith(String prefix)是String类的一个方法 String类代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. /* ...
最新文章
- 2019寒假作业二:PTA7-1币值转换
- java web购物车代码_java web开发之购物车功能实现示例代码
- yuv格式转换是那个组织定义的_AI 如何赋能摄像机?这场沙龙为你解锁“软件定义”新概念...
- 安卓文本编辑器php cpp,用安卓原生控件封装一个简易的富文本编辑器
- Android应用程序消息处理机制
- Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
- python—IFrame:在jupyter notebook中展示某个网页的情况
- 多模态multi-modal 与多视图multi-view
- php创建游戏房间思路,用Swoole来写个联机对战游戏呀!(八)创建游戏房间
- 惠普打印机故障代码_HP激光打印机常见故障代码
- vtuber面部捕捉工具_NOKOV(度量)动作捕捉携专业虚拟直播解决方案亮相世界VR产业大会...
- 伦敦交通局设置较低的速度限制
- 巴特沃斯滤波器、切比雪夫、椭圆滤波
- 【面经——虎牙实习+一面+HR面+offer】
- SAP SD基础知识之免费货物(Free Goods)
- 《Java核心卷 I》第10版阅读笔记第八章(书第九章)
- html怎样图片不会失真,如何解决图片放大画质失真问题
- 咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序
- 多微源储能系统调频控制matlab/simulink模型
- 最新苹果开发者账号添加设备UDID​
热门文章
- delphi 异步 调用 带参数_Dubbo 关于同步/异步调用的几种方式
- python导入自定义模块_如何Import自定义的Python模块?
- 教你彻底卸载Ubuntu双系统,去污不残留
- Java基础教程【第五章:Java数组】
- spring学习--AOP术语
- linux系统上安装远程软件下载,如何安装向日葵远程控制软件Linux被控端?
- 真深复制python_Python深复制浅复制or深拷贝浅拷贝
- nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
- neo4j 查询同一节点的两个上级_链表的魅力:两个单向链表的第一个交点
- python中tile的用法_Python:numpy中的tile函数