JDK源码系列(3)-String
在JDK中,String的使用频率和被研究的程度都非常高,所以接下来我只说一些比较重要的内容。
一、String类的概述
String类的声明如下:
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence
类被final修饰,所以String类不能被继承。实现了3个接口。CharSequence有字符相关操作的默认实现方法。
二、String类的属性和方法介绍
两个重要的属性:
/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0
字符数组value[]中存的就是字符串对应的每个字符,注意也是用final修饰的,所以说字符串是不可变的。
构造方法一大队,都是为了给字符数组赋值的:
equals方法:
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}
hashcode方法:
public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}
还有很多其他方法,大部分对字符串的操作,都是生成一个新的字符串,对原来的字符串并无影响。
三、String在jdk8新增的方法
public static String join(CharSequence delimiter, CharSequence... elements) {Objects.requireNonNull(delimiter);Objects.requireNonNull(elements);// Number of elements not likely worth Arrays.stream overhead.StringJoiner joiner = new StringJoiner(delimiter);for (CharSequence cs: elements) {joiner.add(cs);}return joiner.toString();}
join方法作用是将字符序列数组或集合通过分割符delimiter连接成一个字符串。第一个方法使用的是可变参数,第二个方法使用的可迭代参数,通过遍历数组或集合将数组元素或集合元素添加到StringBuilder,添加前会先加入一个分割符delimiter,然后将StringBuilder中的内容返回。
参考资料:
- https://www.jianshu.com/p/13b10f44a7bb
- https://blog.csdn.net/weixin_39788856/article/details/95042195
JDK源码系列(3)-String相关推荐
- JDK源码学习笔记——String
1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() {i ...
- JDK源码系列(2)-Object类
引言 我们都知道,在Java中,Object是所有类的超类,所有的类其实都是隐含继承自Object类的,所以extends Object默认是不用写的,当然你写了也不会错.所有的类都可以使用Objec ...
- HashSet源码分析:JDK源码系列
1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...
- 大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal
引言 其实网上有很多关于ThreadLocal的文章了,有不少文章也已经写的非常好了.但是很多同学反应还有一些部分没有讲解的十分清楚,还是有一定的疑惑没有想的十分清楚.因此本文主要结合常见的一些疑问. ...
- JDK源码系列:Future是如何实现的?
大家好,我们在异步编程时向线程池提交(submit)一个任务后会得到一个 Future对象,通过 future.get() 方法可以堵塞等待结果的完成,例如: public static void m ...
- JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据
上一篇中老吕介绍了ThreadLocal线程数据绑定的原理,今天聊聊父子线程之间如何继承ThreadLocal上维护的数据. 开发过程中异步执行任务有两种情况,第一种情况是 主线程 通过 new Th ...
- JDK源码系列:ThreadLocal弱引用真的是过度设计吗?
在<码处高效:Java开发手册>这本书上详细描述了ThreadLocal的原理,也有过度设计的说法, 难道弱引用设计真的没必要吗?对此老吕要仔细分析分析,ThreadLocal到底该不该使 ...
- JDK源码系列:synchronized与wait、notify、notifyAll
大家好,今天聊一聊synchronized与obj.wait().obj.notify().obj.notifyAll() 之间的关系以及它们的实现原理. 我们今天采用边写demo边分析的方式来进行. ...
- JDK源码系列(6)-StringBuilder
一.概述 StringBuilder是一个可变的字符串序列,这个类被设计去兼容StringBuffer类的API,但不保证线程安全性,是StringBuffer单线程情况下的一个替代实现.在可能的情况 ...
最新文章
- Java中的==和equals区别
- 测试人员容易遗漏一些隐藏的缺陷
- python中通过pip安装套件
- 创意美食海报psd分层模板,开启奇思妙想
- jQuery LigerUI 插件介绍及使用之ligerTree
- Codeforces 57C Array dp暴力找到规律
- SQL Server 2008 对 T-SQL 语言的增强(转载)
- json数组对象转js数组对象
- stm32软件模拟I2C
- 蒙特卡罗仿真(1):入门求生指南(Python实例)
- IB中文阅读书单推荐
- chm之已取消到该网页的导航解决办法
- 3 FPGA时序约束理论篇之IO约束
- 总线揭密 串行传输VS并行传输
- github 首页 html,GitHub - merrier/github-html-preview: 一个可以直接预览html页面的chrome插件...
- C语言编写万年历,解决1582年历史问题
- 你需要知道的无代码数据分析工具
- js内置对象处理-打印学生成绩单
- FTP 基础配置,配置虚拟FTP账号
- php session 过期,session过期是什么意思
热门文章
- 在 Windows 下部署 Go 语言环境
- [圣诞记]HULK七周年庆
- HTTP/2 in GO(一)
- 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式
- oracle或mysql分组查询并且获取前3条排序后的数据
- 实战系列-分布式缓存
- android连接此设备时打开,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
- c语言不通包里的函数,C语言中实现不同函数间jump的方法 -电脑资料
- 像聊天机器人一样的c语言程序,示例:聊天机器人