在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中的内容返回。

参考资料:

  1. https://www.jianshu.com/p/13b10f44a7bb
  2. https://blog.csdn.net/weixin_39788856/article/details/95042195

JDK源码系列(3)-String相关推荐

  1. JDK源码学习笔记——String

    1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() {i ...

  2. JDK源码系列(2)-Object类

    引言 我们都知道,在Java中,Object是所有类的超类,所有的类其实都是隐含继承自Object类的,所以extends Object默认是不用写的,当然你写了也不会错.所有的类都可以使用Objec ...

  3. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  4. 大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal

    引言 其实网上有很多关于ThreadLocal的文章了,有不少文章也已经写的非常好了.但是很多同学反应还有一些部分没有讲解的十分清楚,还是有一定的疑惑没有想的十分清楚.因此本文主要结合常见的一些疑问. ...

  5. JDK源码系列:Future是如何实现的?

    大家好,我们在异步编程时向线程池提交(submit)一个任务后会得到一个 Future对象,通过 future.get() 方法可以堵塞等待结果的完成,例如: public static void m ...

  6. JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据

    上一篇中老吕介绍了ThreadLocal线程数据绑定的原理,今天聊聊父子线程之间如何继承ThreadLocal上维护的数据. 开发过程中异步执行任务有两种情况,第一种情况是 主线程 通过 new Th ...

  7. JDK源码系列:ThreadLocal弱引用真的是过度设计吗?

    在<码处高效:Java开发手册>这本书上详细描述了ThreadLocal的原理,也有过度设计的说法, 难道弱引用设计真的没必要吗?对此老吕要仔细分析分析,ThreadLocal到底该不该使 ...

  8. JDK源码系列:synchronized与wait、notify、notifyAll

    大家好,今天聊一聊synchronized与obj.wait().obj.notify().obj.notifyAll() 之间的关系以及它们的实现原理. 我们今天采用边写demo边分析的方式来进行. ...

  9. JDK源码系列(6)-StringBuilder

    一.概述 StringBuilder是一个可变的字符串序列,这个类被设计去兼容StringBuffer类的API,但不保证线程安全性,是StringBuffer单线程情况下的一个替代实现.在可能的情况 ...

最新文章

  1. Java中的==和equals区别
  2. 测试人员容易遗漏一些隐藏的缺陷
  3. python中通过pip安装套件
  4. 创意美食海报psd分层模板,开启奇思妙想
  5. jQuery LigerUI 插件介绍及使用之ligerTree
  6. Codeforces 57C Array dp暴力找到规律
  7. SQL Server 2008 对 T-SQL 语言的增强(转载)
  8. json数组对象转js数组对象
  9. stm32软件模拟I2C
  10. 蒙特卡罗仿真(1):入门求生指南(Python实例)
  11. IB中文阅读书单推荐
  12. chm之已取消到该网页的导航解决办法
  13. 3 FPGA时序约束理论篇之IO约束
  14. 总线揭密 串行传输VS并行传输
  15. github 首页 html,GitHub - merrier/github-html-preview: 一个可以直接预览html页面的chrome插件...
  16. C语言编写万年历,解决1582年历史问题
  17. 你需要知道的无代码数据分析工具
  18. js内置对象处理-打印学生成绩单
  19. FTP 基础配置,配置虚拟FTP账号
  20. php session 过期,session过期是什么意思

热门文章

  1. 在 Windows 下部署 Go 语言环境
  2. [圣诞记]HULK七周年庆
  3. HTTP/2 in GO(一)
  4. 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式
  5. oracle或mysql分组查询并且获取前3条排序后的数据
  6. 实战系列-分布式缓存
  7. android连接此设备时打开,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
  8. 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
  9. c语言不通包里的函数,C语言中实现不同函数间jump的方法 -电脑资料
  10. 像聊天机器人一样的c语言程序,示例:聊天机器人