美文网首页
String源码阅读

String源码阅读

作者: 以梦为马驾驾驾 | 来源:发表于2018-12-19 11:34 被阅读0次

String类是final类,且实现了java.io.Serializable,Comparable<String>,CharSequence 接口

主要有三个属性,都是private:

  • 内部的字符存储是final 的char[], 由于没有暴露给外界的修改char[] 的接口,所以String是不可变对象
  • serialVersionUID用于序列化反序列化的验证
  • hash值

重载构造器

String重载了许多构造器方法,可以通过现有的String对象创建string对象(仅仅此方法对hash的值进行了更新),截取byte[]数组某段创建,通过char[]对象创建,通过存储着codepoint的int[]创建对象,甚至可以指定字符集。

通过codepoint的数组创建对象时,涉及到的知识:BMP,utf-8,utf-16等,见链接:
Plane
utf-8
utf-16
在java中默认采用的是unicode字符集和utf-16编码.(对utf-16的编码方法了解不够,有一些codepoint的方法没看).

发现了一个稍微有点特别的构造方法:

String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }

value对象直接复制给String,share是true,为了保持封装,其他的方法都是利用Arrays.copyOf(char[] , length)或者是Arrays.copyOfRange([],offset, offset+count),所以这个构造方法可以创建出一个可变String对象,然而是包可见。

实用的方法:

  • void getChars(char dst[] , int dstBegin): 此方法仅包可用,调用了System.arraycopy(source,sourceBegin, dst, detBegin,length);
  • public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin),同样调用了System.arraycopy();
  • public boolean equalsIgnoreCase(String anotherString)
  • public int compareToIgnoreCase(String str)
  • public boolean startsWith(String prefix)
  • public boolean endsWith(String suffix)
  • public int indexOf(int ch)
  • public int indexOf(int ch, int fromIndex)
  • public int lastIndexOf(int ch, int fromIndex)(searching backward starting at the specified index. )
  • static int indexOf(char[] source, int sourceOffset, int sourceCount,
    String target, int fromIndex)
  • public String substring(int beginIndex)并不能创建相同值的另一个String对象,因为beginIndex==0时返回this
  • public String concat(String str)
char buf[] = Arrays.copyOf(value, len + otherLen);
//Arrays.copyOf如下
public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

  • public String replace(char oldChar, char newChar)
  • public boolean matches(String regex)
  • public boolean contains(CharSequence s)
  • public String toUpperCase()
  • public String trim()
  • public static String format(String format, Object... args
  • public static String valueOf(boolean b)
  • public native String intern();(原生方法)

重写的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;
    }

1. 如果是同一个对象,true
2. anobject是否是string,不是false
3. 此时先比较比较具体的值char v2[] = anotherString.value;之所以private的value可以被访问是因为在同一个类中
String对象不仅可以和String对象比较还可以和CharSequence(contentEquals)对象,AbstractStringBuilder对象(private),StringBuffer对象(public boolean contentEquals)

f

相关文章

  • 面试准备

    1. java基础 String源码阅读 String忽略大小写比较源码阅读 String的不变性 ArrayLi...

  • String源码阅读分享(一)

    String源码阅读分享(一) 查看String、StringBuffer与StringBuilder的关系 直接...

  • String源码阅读

    String源码阅读 wiki 通过反编译深入理解Java String及intern 成神之路-基础篇 Java...

  • String源码阅读

    String类是final类,且实现了java.io.Serializable,Comparable ,CharS...

  • String源码阅读

    1. 类的继承关系 2. 数据存储 private final char value[]; //String的字...

  • String源码阅读(一)

    概述 查阅String的源码时,首先需要阅读一下它的顶部注释,它里面说明了一些String在Java中的一些...

  • String源码阅读(二)

    构造方法 查阅String源码可以发现,它内部定义了很多构造方法,其中有些构造方法也都已经过时了,不建议使用...

  • String源码阅读(三)

    常用的几个方法 length() 它返回的是字符串的长度,length的数值其实是字符串中Unicode的code...

  • String类源码阅读

    1. 简介 String表示字符串,Java中所有字符串的字面值都是String类的实例,例如“ABC”。Stri...

  • 第一天

    2022准备面试,阅读一些源码,提升自己. 一.String Stringbuffer Stringbuild ...

网友评论

      本文标题:String源码阅读

      本文链接:https://www.haomeiwen.com/subject/pxscgftx.html