先看属性
底层是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相关推荐

  1. STL 源码分析之string(一)基础篇

    STL源码下载: https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996 ...

  2. 【Java源码分析】String 方法 startsWith

    startsWith() startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean startsWith(String prefix, int toffs ...

  3. 【Java源码分析】String 比较 equals

    equals() equals() 方法用于将字符串与指定的对象比较. String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等. 语法 public boolean equa ...

  4. 【Java源码分析】String 检测 startsWith

    目录 startsWith() 语法 参数 返回值 实例 源码 startsWith() startsWith() 方法用于检测字符串是否以指定的前缀开始. 语法 public boolean sta ...

  5. StringBuffer类【JDK源码分析】

    StringBuffer类[JDK源码分析] 前言 推荐 说明 StringBuffer类 基本信息 属性 构造方法 部分方法 length capacity append insert revers ...

  6. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  7. 【转】源码分析C++的string实现

    转自:源码分析C++的string实现 - 知乎 我们平时使用C++开发过程中或多或少都会使用std::string,但您了解string具体是如何实现的吗,这里程序喵给大家从源码角度分析一下. 读完 ...

  8. 源码分析 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 ...

  9. startsWith(String prefix,int toffset)源码分析

    startsWith(String prefix)是String类的一个方法 String类代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. /* ...

最新文章

  1. 2019寒假作业二:PTA7-1币值转换
  2. java web购物车代码_java web开发之购物车功能实现示例代码
  3. yuv格式转换是那个组织定义的_AI 如何赋能摄像机?这场沙龙为你解锁“软件定义”新概念...
  4. 安卓文本编辑器php cpp,用安卓原生控件封装一个简易的富文本编辑器
  5. Android应用程序消息处理机制
  6. Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
  7. python—IFrame:在jupyter notebook中展示某个网页的情况
  8. 多模态multi-modal 与多视图multi-view
  9. php创建游戏房间思路,用Swoole来写个联机对战游戏呀!(八)创建游戏房间
  10. 惠普打印机故障代码_HP激光打印机常见故障代码
  11. vtuber面部捕捉工具_NOKOV(度量)动作捕捉携专业虚拟直播解决方案亮相世界VR产业大会...
  12. 伦敦交通局设置较低的速度限制
  13. 巴特沃斯滤波器、切比雪夫、椭圆滤波
  14. 【面经——虎牙实习+一面+HR面+offer】
  15. SAP SD基础知识之免费货物(Free Goods)
  16. 《Java核心卷 I》第10版阅读笔记第八章(书第九章)
  17. html怎样图片不会失真,如何解决图片放大画质失真问题
  18. 咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序
  19. 多微源储能系统调频控制matlab/simulink模型
  20. 最新苹果开发者账号添加设备UDID​

热门文章

  1. delphi 异步 调用 带参数_Dubbo 关于同步/异步调用的几种方式
  2. python导入自定义模块_如何Import自定义的Python模块?
  3. 教你彻底卸载Ubuntu双系统,去污不残留
  4. Java基础教程【第五章:Java数组】
  5. spring学习--AOP术语
  6. linux系统上安装远程软件下载,如何安装向日葵远程控制软件Linux被控端?
  7. 真深复制python_Python深复制浅复制or深拷贝浅拷贝
  8. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
  9. neo4j 查询同一节点的两个上级_链表的魅力:两个单向链表的第一个交点
  10. python中tile的用法_Python:numpy中的tile函数