JDK源码阅读之二-----String

原创 2012年03月31日 15:53:39
package java.lang;

import java.io.ObjectStreamClass;
import java.io.ObjectStreamField;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Formatter;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; // 我擦嘞,String类import了这么多包啊

/**
 * Strings是固定不变的; 被创建后值就不能改变了. String buffers支持可变的strings.
 * Because String objects are immutable they can be shared. For example:
 *     String str = "abc";
 * 相当于:
 *     char data[] = {'a', 'b', 'c'};
 *     String str = new String(data);
 * @see     java.lang.Object#toString() 
 * @see     java.lang.StringBuffer
 * @see     java.lang.StringBuilder
 * @see     java.nio.charset.Charset 源码里让看这个,好吧,看完StringBuffer和StringBuilder就看看NIO吧
 */
public final class String
    implements java.io.Serializable, Comparable, CharSequence
{
    /** The value用来存储字符. */
    private final char value[];


    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** count是字符数组的长度,final的,长度也不能变了. */
    private final int count;

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

    // 构造方法很多,以后再补充吧

    // 列举一些常见方法
    /**
     * Returns the length of this string.
     */
    public int length() {
        return count;
    }

    public boolean isEmpty() {
	return count == 0;
    }

    /**
     * @param      index   the index of the char value.
     * @return     the char value at the specified index of this string.
     *             The first char value is at index 0.
     * @exception  IndexOutOfBoundsException  if the index
     *             argument is negative or not less than the length of this
     *             string.
     */
    public char charAt(int index) {
        if ((index < 0) || (index >= count)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index + offset];
    }

    // 重写了equals方法
    public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

    // 重写hashcode方法
    public int hashCode() {
	int h = hash;
        int len = count;
	if (h == 0 && len > 0) {
	    int off = offset;
	    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

    public String toString() {
	return this;
    }
    
    public native String intern(); // 这个是干嘛滴
}

相关文章推荐

JDK1.8源码阅读系列之二:LinkedList

本篇随笔主要描述的是我阅读 LinkedList 源码期间的对于 LinkedList 的一些实现上的个人理解,有不对的地方,请指出~   先来看一下 LinkedList 的继承图:...

JDK动态代理源码分析之二

在上篇文章里对JDK动态代理的方法和源码进行了简单的分析,这篇主要讲述怎么将JDK的代理生成的class文件进行输出。 以下是调用的文件,其他的文件均和 JDK动态代理之一 中的一致(http://b...

nginx源码解读之二--nginx_string_t

最近没少看nginx基础数据结构,但感觉实力不如大牛,网上文章也很多,难得我就不写了,怕自己没那水平。 推介两款源码阅读工具:Sublime2和VS Code,windows和linux下均有。 ...

JDK源码阅读之String

String是平常使用最多的结构之一,String提供来很多方便的接口来处理字符串,同时其支持正则表达式,所以字符串处理能力很强,下面我们简单介绍下String的内部实现,重点关注下常用的一些方法实现...

JDK 1.7源码阅读笔记(一)String,StringBuilder,StringBuffer

其实对于JDK源码一直有一种情愫,希望能看到前辈们的精华之处,感受代码之美,今天起我也去感受下,如果有和我志同道合的盆友呢,希望咱们一起努力,多多指教吧!   先来看下JDK帮助文档对于三个类的解释...

JDK1.8源码阅读之——String,StringBuffer, StringBuilder

惭愧的说,工作快三年了。还没有读过jdk源码,随着工作时间越来越长,如果再不学点什么或许和刚毕业的实习生差不了多少了。为了跨出这个分水岭决定还是学点什么,那么就从面试经常问到的各种类之间的区别来看吧,...

阅读String源码总结【jdk1.6】

1、打开String源码发现String其实就是字符数组char[]; 2、String定义了三个变量value、offset、count(hash暂且不说),value是String的值,offse...

jdk类库源码分析-String类

从今天开始研究jdk基础类库的源码,从中学习优秀的设计思想,提高自己的能力。至于怎么查看源码,这里不多说,网上很多教程,直接上干货儿,欢迎大家提出宝贵意见,共同学习,一起进步。(这里我研究的是jdk1...

JDK1.7源码笔记之String类

1. class 简介  String类代表多个单个字符的集合体,所有的字符串字面常量如”abc”等都是String类的实例,String对象所代表的字符串一旦创建其内部内容就不可改变,也正因为这一点...

JDK源码-java.lang.String

0.本文目录本文目录 开篇明志 Java7 API String介绍 源码分析 类 属性 构造方法 使用char字符数组字符串构造一个String 使用byte字节数组构造一个String 使用Str...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDK源码阅读之二-----String
举报原因:
原因补充:

(最多只允许输入30个字)