jdk源码 String

jdk 8 API 文档中 String篇链接

https://docs.oracle.com/javase/8/docs/api/index.html

 0 . String

String 作为程序中常用的的一种类型,同样也是面试中经常出现的题目相关。

final 修饰  该类型为常量。创建后 值不能更改。字符串缓冲区支持可变字符串。

Serializable  支持序列化 

Comparable 用于不同值比较

 CharSequence    表示char值的一个可读序列。此接口对许多不同种类的char序列提供统一的自读访问

注释翻译

 此类 包括以下方法:检查序列的各个字符,比较字符串,搜索字符串,提取子字符串以及创建字符串的副本,并将所有字符转换为大写或小写。 

Java 为字符串连接操作符(+) 及 其他对象转换为字符串提供了特殊支持。

   public final class String

implements java.io.Serializable, Comparable, CharSequence

属性包含 

private final char value[];  字符数组

private int hash; // Default to 0  缓存字符串的哈希码

private static final long serialVersionUID = -6849794470754667710L;

除去String 直接创建 或 new String 之外 ,也可以通过 StringBuilder 或 StringBuffer 类 append方法实现字符串连接。


多种不同的String构造函数

调用构造函数创建,将会主动开辟新的内存地址存储初始值。常量创建时,若创建相同值,则他们内存地址为相同。若字符为常量拼接,内存地址也不相同。String str = "a"+"b"; 此时将有三块内存空间被开辟,(a b ab) 且 ab 与常量ab内存地址值也不相同。

StringBuilder 线程不安全 但效率较高

StringBuffer 线程安全 append方法实现过程使用 synchronized  关键字

记录 几类常使用的String方法:

1. length() 

            返回 对象表示的字符序列的长度。  value.length value为属性的数组

2. isEmpty()

       返回boolean 类型 如果当前 length() 值为0  返回true 否则为 false; 注意当前对象不能为null,否则报错。

3.equals(Object anObject)

    返回boolean 类型  比较当前对象与参数是否相等。  首先判断内存地址相等(常量赋值),然后判断参数是否为String 的一个实例,将其强转为String ,判断两者 字符属性数组value 长度是否相等,最后每个字符依次比对。 

3.1  public int hashCode() 

    equals()重写通常与 hashCode() 一起出现 ,部分 String 字符不同但是hash值相同,就是因为此方法的实现,int类型的hash值对字符串进行 * 31 累加。

    但hashCode() 可以使比较方法更快的进行判断,节省效率。 hash使查找效率变为O(1),如果hash值不同,则两者肯定不同。若hash相同,再进行equals()判断,此时相等则真正相同。

https://blog.csdn.net/fly_grass_fish/article/details/81742794

4. boolean startsWith(String prefix)

      返回boolean 类型  比较当前对象是否以指定前缀开始 调用 startsWith(String prefix, int toffset)

方法进行检测。toffset 为参数传入位置。

5.boolean endsWith(String suffix)

return startsWith(suffix, value.length - suffix.value.length);

       比较当前对象是否以指定后缀结束  实现方法是以startWith 将属性数组长度减去参数数组长度,此时就为要匹配的后缀长度。思考代码重用。

6.int indexOf(String str)

       指定的子字符串的第一次出现的索引,如果没有出现,则为{@code -1}

7.int lastIndexOf(String str)

       指定的子字符串的第一次出现的索引,如果没有出现,则为{@code -1}

8.String substring(int beginIndex)

Stringsubstring(int beginIndex, int endIndex)

        根据传入的索引进行截取字符串

9. String concat(String str)

一个字符串,表示此对象的字符的连接,后跟字符串参数的字符。

10.String replace(char oldChar, char newChar)

    通过用{@code newChar}替换每次出现的{@code oldChar},从该字符串派生的字符串。

11.boolean matches(String regex)

当且仅当此字符串匹配给定的正则表达式返回true

12. boolean contains(CharSequence s)

如果此字符串包含{@code s},则为true,否则为false 

 使用indexOf(s.toString())>1 进行实现,如果没有出现返回-1 即不存在

13. String replaceAll(String regex, String replacement)

    请注意当前方法与replace()实现方式并不同,替换字符串中的反斜杠({@code \})和美元符号({@code $})可能导致结果与被视为文字替换字符串的结果有所不同。

此方法实现方式使用Pattern类其他方法,最终调用replaceAll(),其中再调用appendReplacement() 这时 源码中有直接判断字符即 ($ \)等字符。



14. String[] split(String regex)

通过在给定正则表达式的匹配项周围拆分此字符串所计算出的字符串数组。

源码实现方式为:判断是否为正则表达式

如果非正则表达式:将当前字符串根据传入的参数进行substring切割副本,以List 进行存储, 当最后找不到 则返回最后的字符串。

如果为正则表达式:当前参数传入Pattern进行截取返回

indexOf(ch ,off )寻找 ch 字符出现索引,此索引需大于等于 传入off 。当indexOf() == -1 即 next 为true 时,已经找不到 匹配字符串将 off 至字符串末尾进行存储。


最后会根据list中每项的值判断 将末尾空字符串进行剔除

15.  1) String join(CharSequence delimiter, CharSequence... elements)

2)String  join(CharSequence delimiter,

        Iterable elements)

    根据传入字符进行拼接其他参数得到一个特定的字符串。1) 第二个参数为可变长参数,

String message = String.join("-", "Java", "is", "cool");     // message returned is: "Java-is-cool"

2)  第二个参数为可迭代类型参数 list set 等


16.   String toLowerCase(Locale locale) 

 String toLowerCase()

字符串进行转换小写

17. String toUpperCase(Locale locale)

 String toUpperCase()

字符串进行转换为大写

18.String trim()

截取任何前导和结尾的空格 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • Tip:笔者马上毕业了,准备开始 Java 的进阶学习计划。于是打算先从 String 类的源码分析入手,作为后面...
    石先阅读 12,011评论 16 58
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,793评论 0 38
  • String源码阅读 wiki 通过反编译深入理解Java String及intern 成神之路-基础篇 Java...
    uranusleon阅读 737评论 0 1
  • 一、概念 类定义: 实现了Serializable接口,可进行序列化。 实现了Comparable接口,可进行比较...
    TomyZhang阅读 251评论 1 0
  • 相声,绝对的媒体热词,随便打开个新闻页面总能看到,就像当初的二人转。 赵本山老迈,二人转也逐渐势微了,郭德纲强势的...
    心甲阅读 199评论 1 0