简单介绍JAVA语言源码中,String对象的几个常用细节点
小标 2019-01-09 来源 : 阅读 1454 评论 0

摘要:本文主要向大家介绍了简单介绍JAVA语言源码中,String对象的几个常用细节点,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了简单介绍JAVA语言源码中,String对象的几个常用细节点,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

概述


简要的介绍了JDK源码中,String对象的几个常用细节点,以加深对其内部原理的认识。


分析


String对象内容存储于字符数组中


private final char value[];

   


构造函数有多个,可以创建空字符串对象,也可以利用其他字符串对象,new出新的字符串对象


String()

String(String original)

String(char value[])

String(char value[], int offset, int count)

String(int[] codePoints, int offset, int count)

...

   


该构造方法会创建空的字符序列,注意这个构造方法的使用,因为创造不必要的字符串对象是不可变的。因此不建议采取下面的创建 String 对象:


String str = new String()


str = “sample”;


这样的结果显而易见,会产生了不必要的对象。


长度就是其内部数组的长度


public int length() {

       return value.length;

}

public boolean isEmpty() {

        return value.length == 0;

}

   


相等性判断函数equals,比较


boolean equalsIgnoreCase(String anotherString);忽略大小写比较字符串对象

int compareTo(String anotherString); 比较字符串

int compareToIgnoreCase(String str); 忽略大小写比较字符串

 

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;

    }

 

public boolean contentEquals(CharSequence cs) {

        // Argument is a StringBuffer, StringBuilder

        if (cs instanceof AbstractStringBuilder) {

            if (cs instanceof StringBuffer) {

                synchronized(cs) {

                   return nonSyncContentEquals((AbstractStringBuilder)cs);

                }

            } else {

                return nonSyncContentEquals((AbstractStringBuilder)cs);

            }

        }

        // Argument is a String

        if (cs instanceof String) {

            return equals(cs);

        }

        // Argument is a generic CharSequence

        char v1[] = value;

        int n = v1.length;

        if (n != cs.length()) {

            return false;

        }

        for (int i = 0; i < n; i++) {

            if (v1[i] != cs.charAt(i)) {

                return false;

            }

        }

        return true;

    }

   


contentEquals((CharSequence) sb) 分两种情况,一种是 cs instanceof AbstractStringBuilder,另外一种是参数是 String 类型。


具体比较方式几乎和 equals 方法类似,先做“宏观”比较,在做“微观”比较。


- 判断开始或结束是否包含某子串


public boolean startsWith(String prefix, int toffset) {

        char ta[] = value;

        int to = toffset;

        char pa[] = prefix.value;

        int po = 0;

        int pc = prefix.value.length;

        // Note: toffset might be near -1>>>1.

        if ((toffset < 0) || (toffset > value.length - pc)) {

            return false;

        }

        while (--pc >= 0) {

            if (ta[to++] != pa[po++]) {

                return false;

            }

        }

        return true;

}

 

public boolean startsWith(String prefix) {

        return startsWith(prefix, 0);

}

 

public boolean endsWith(String suffix) {

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

}

   


字符串的hashcode计算方式


结果公式:s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]


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;

}

   


字符串中某字符的位置


public int indexOf(int ch) {

        return indexOf(ch, 0);

}

public int indexOf(int ch, int fromIndex) {

        final int max = value.length;

        if (fromIndex < 0) {

            fromIndex = 0;

  &n    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved