java源码阅读-String类

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

实现了序列化和比较器

    /** The value is used for character storage. */
    private final char value[];

这个属性是用来存储string中的内容的

   /** Cache the hash code for the string */
   private int hash; // Default to 0

缓存hashcode

//不带参数初始化
    public String() {
        this.value = "".value;
    }
   //拷贝初始化
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
//字符数组初始化
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }
//数组中拷贝部分
 public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count <= 0) {
            if (count < 0) {
                throw new StringIndexOutOfBoundsException(count);
            }
            if (offset <= value.length) {
                this.value = "".value;
                return;
            }
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
//StringBuffer构造
  public String(StringBuffer buffer) {
        synchronized(buffer) {
            this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
        }
    }
//builder构造
    public String(StringBuilder builder) {
        this.value = Arrays.copyOf(builder.getValue(), builder.length());
    }

比较每一位上面的字符是否相同

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 equalsIgnoreCase(String anotherString) {
        return (this == anotherString) ? true
                : (anotherString != null)
                && (anotherString.value.length == value.length)
                && regionMatches(true, 0, anotherString, 0, value.length);
    }

hash算法

 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 全局唯一

    public native String intern();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • Tip:笔者马上毕业了,准备开始 Java 的进阶学习计划。于是打算先从 String 类的源码分析入手,作为后面...
    石先阅读 12,060评论 16 58
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,532评论 0 3
  • 今天开的会,很开心,确定了每个人的业绩和确定了奖励和惩罚,和每个人的需求,和家人对我们的要求,和一些平时没有注意的...
    思_3a2d阅读 208评论 0 0
  • docker 镜像重命名# 如何找出docker容器日志文件 容器日志一般存放在/var/lib/docker下面...
    EddieZhang阅读 451评论 0 0