• Home
  • 归档
文章检索 作品与友邻 关于我
暴君乔博客
Home 归档

JDK11-String源码

发布于: 2018-10-23
更新于: 2023-07-09
文章目录
  1. 使用版本:JDK10.0.1
    1. 首先是从String开头源码开始解读

使用版本:JDK10.0.1

先从String的源码开始解析,然后再慢慢拓展到相关的部分

首先是从String开头源码开始解读

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

Serializable

Serializable 实现这个接口可以使得对象序列化。

使用场景:

  1. 像在使用MyBatis之类的映射时,我们往往需要让entity类实现这个接口。
  2. 我们需要保存对象流时,就需要实现这个接口,然后通过以下代码实现
FileOutputStream fileOutputStream=new FileOutputStream(".");
ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
objectOutputStream.write(Integer.parseInt(a));

应该注意实现序列化接口,不代表就能序列,首先这个类的属性也得是序列化,比如String就是属于序列化属性的,或者像我们数据类abstract class Number implements java.io.Serializable。

Comparable

Comparable<String> 使得String对象可以有各种各样的操作。

String通过复写int compareTo(T o)实现比较操作:

public int compareTo(String anotherString) {
        byte v1[] = value;
        byte v2[] = anotherString.value;
        if (coder() == anotherString.coder()) {
            return isLatin1() ? StringLatin1.compareTo(v1, v2)
                                : StringUTF16.compareTo(v1, v2);
        }
        return isLatin1() ? StringLatin1.compareToUTF16(v1, v2)
                            : StringUTF16.compareToLatin1(v1, v2);
}

像这里就可以问Comparable和Comparator的区别?
前者可以和自己比较,而后者则不行

CharSequence

CharSequence 提供可读序列元素接口

方法:

  1. charAt()
  2. chars()
  3. toString()等等
final

final 每个String类都是不可变的,我们日常对它的操作只是对引用操作。

String a="hello"
a="world"

这里a引用指向world而已,而hello就废置了,等待GC回收

final使得String不可变,每个String的值都会存入常量值,当调用时若相同值则两者是同一个对象。虽然String、StringBuilder、StringBuffer都是以final标注的,但后两者是以AbstractStringBuilder的byte value[]来存储字符串的

继续源码部分

存放以及格式
@Stable
private final byte[] value;
private final byte coder;
/** Cache the hash code for the string */
private int hash; // Default to 0

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;

@Stable 用来标注最多修改一次的变量,当用于数组时也就保证数组永远不为null,且虚拟机HotSpot VM通过这个注解确保non-null component to a constant。PS:这个标注仅针对了用启动类Bootstrap ClassLoader加载的类【java.开头的类】coder 【encoding】LATIN1和UTF16

static final boolean COMPACT_STRINGS;

static {
    COMPACT_STRINGS = true;
}

当为false时,以UTF16形式存在,不过通常这个东西其实意义不大,主要是当它为true时,然后我们在一些对性能敏感的操作时,可以通过检测这个是不是用LATIN1形式存在的,若是的话,则可以借此进行优化【JIT Compiler】

流
private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

每个对象都会以流的形式存储,结构紧凑,高效阅读的缘故,想象一下字节流,就会好理解很多了。

JDK11-String源码
/archives/1102da6f/
作者
tyrantqiao
发布于
2018-10-23
更新于
2023-07-09
许可协议
CC BY-NC-SA 4.0
赏

蟹蟹大佬的打赏,大家一起进步

支付宝
微信
  • Java
  • 面经
  • 源码

扫一扫,分享到微信

微信分享二维码
面试测评常考的图像推理,如何推理解答呢!?
ClassLoader源码解析
© 2026 tyrantqiao 本站总访问量次 本站访客数人次 载入天数...载入时分秒...
  • 文章检索
  • 作品与友邻
  • 关于我

展开标签

  • 随笔
  • 旅行
  • Java
  • 面经
  • 源码
  • 计算机网络
  • 技术
  • 架构
  • Hadoop
  • IDEA
  • maven
  • JDK
  • Linux
  • MySQL
  • 性能
  • 数据库
  • Redis
  • MQ
  • Spring
  • SquirrelFin
  • 记账
  • Android
  • 个人财务
  • unity
  • TIDB
  • chatgpt
  • 前端
  • Vue
  • Git
  • Hexo
  • shadowsocks
  • 问题排查
  • 业务
  • JVM
  • 算法
  • nginx
  • ssh
  • Python
  • 爬虫
  • test
  • vim
  • 影视剧
  • 中间件
  • 事务
  • 表达
  • 运动
  • mybatis
  • AI
  • 产品
  • 家装
  • 土巴兔
  • 域名
  • github
  • 软件
  • 个人项目
  • Leaves
  • Chrome
  • 浏览器插件
  • 开源
  • Balance Voice
  • 穿搭
  • 幽默
  • 画画
  • 缓存
  • 摄影
  • c
  • 课程设计
  • 调酒
  • 设计模式
  • 数学

Collection

作品与友邻

我做的小工具、朋友的站点和一些长期值得回访的灵感来源。

  • 土 土巴兔 AI 导购交互演示 可点击体验用户导购、平台运营、装修公司、材料商及 AI 话术知识库的多端增长流程。 /demos/tubatu-ai-guide/
  • L Leaves 行程记录 我做的行程记录页面小工具,用来沉淀旅行路线、日程安排和途中的灵感。 https://leaves.tyrantqiao.com/
  • 本 本网站主题yilia设计者的主页 http://litten.me/
tyrantqiao的头像

tyrantqiao

github rss qq mail facebook linkedin

About

关于我

代码、海浪和持续折腾,都是生活的一部分。

<div class="aboutme-card"> <p class="aboutme-eyebrow">tyrantqiao</p> <h3>Java 全栈开发</h3> <p>常年和 Java、后端服务、前端工程、数据与部署打交道,喜欢把复杂问题拆开、写清楚,也把踩坑过程整理成文章留给后来的人。</p> <div class="aboutme-tags"> <span>Java</span> <span>Full Stack</span> <span>Backend</span> <span>Frontend</span> <span>Extreme Sports</span> </div> <p>工作之外偏爱冲浪等极限运动,享受在浪上找平衡,也享受在代码里找边界。</p> <div class="aboutme-contact"> <a href="mailto:[email protected]">Gmail</a> <a href="mailto:[email protected]">QQ Mail</a> </div> </div>