JDK源码学习--String篇(-)
工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水。
知耻而后勇,加油!!!
java.lang.String
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
}
String不属于基本的数据类型,由于是final类型不能被继承,可以序列化。
  /** The value is used for character storage. */
    private final char value[];
使用final类型的字符数组存储字符串内容,String初始化后就不能被改变。
String temp = "abc"; temp = "bcd";
这里并不是对temp的修改,而是重新指向新的字符串。
    /** Cache the hash code for the string */
    private int hash; // Default to 0
指定缓存字符串的hash code的值,默认为0
  /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
String实现了java.io.Serializable接口,支持序列化操作。
注:序列化是为了存储整个对象,对象序列化的最主要的用处就是在传递和保存对象(object)的时候,保证对象的完整性和可传递性。
譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口。
源码中提供了很多种构造方法,有采用字节数组来构造,有采用StringBuffer和StringBuilder来构造等。
    public String(byte bytes[]) {
        this(bytes, 0, bytes.length);
    }
    public String(StringBuffer buffer) {
        synchronized(buffer) {
            this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
        }
    }
    public String(StringBuilder builder) {
        this.value = Arrays.copyOf(builder.getValue(), builder.length());
    }
其中有一种特殊的构造方法:
    /*
    * Package private constructor which shares value array for speed.
    * this constructor is always expected to be called with share==true.
    * a separate constructor is needed because we already have a public
    * String(char[]) constructor that makes a copy of the given char[].
    */
    String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }
受保护的构造方法,提供两个参数,其中share参数未使用,对比前一个构造方法
  public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
  }
后一种采用Arrays的copyOf方法将value中的内容逐一复制到String当中,而前一种直接采用引用赋值的方式,共享一个数组。
这种特殊的构造方法优点:性能好,共享数组【节约内存】。
     // 返回字符串的长度
    public int length() {
        return value.length;
    }
    // 字符串是否为空
    public boolean isEmpty() {
        return value.length == 0;
    }
    // 字符串目标位置的字符
    public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }
    // 返回指定索引处的字符
    public int codePointAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return Character.codePointAtImpl(value, index, value.length);
    }
    // 返回指定索引之前的字符
    public int codePointBefore(int index) {
        int i = index - 1;
        if ((i < 0) || (i >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return Character.codePointBeforeImpl(value, index, 0);
    }
    // 返回此 String 的指定文本范围中的 Unicode 代码点数
    public int codePointCount(int beginIndex, int endIndex) {
        if (beginIndex < 0 || endIndex > value.length || beginIndex > endIndex) {
            throw new IndexOutOfBoundsException();
        }
        return Character.codePointCountImpl(value, beginIndex, endIndex - beginIndex);
    }
第二部分,介绍String中一些常用方法的重载和区别:
如:replace, replaceFirst, replaceAll区别,valueOf重载
JDK源码学习--String篇(-)的更多相关文章
- JDK源码学习--String篇(二) 关于String采用final修饰的思考
		JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ... 
- JDK源码学习--String篇(三) 存储篇
		在进一步解读String类时,先了解下内存分配和数据存储的. 数据存储 1.寄存器:最快的存储区,位于处理器的内部.由于寄存器的数量有限,所以寄存器是按需分配. 2.堆栈:位于RAM中,但是通过堆栈指 ... 
- JDK源码学习--String篇(四) 终结篇
		StringBuilder和StringBuffer 前面讲到String是不可变的,如果需要可变的字符串将如何使用和操作呢?JAVA提供了连个操作可变字符串的类,StringBuilder和Stri ... 
- JDK源码学习系列03----StringBuffer+StringBuilder
		JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ... 
- JDK源码学习系列01----String
		JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ... 
- JDK源码学习系列02----AbstractStringBuilder
		JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ... 
- JDK源码学习系列05----LinkedList
		JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ... 
- JDK源码学习系列04----ArrayList
		JDK源码学习系列04----ArrayList 1. ... 
- JDK源码学习笔记——LinkedHashMap
		HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ... 
随机推荐
- use magento default datepicker plugin in your project
			<action method="addItem"><type>js_css</type><name>calendar/calenda ... 
- Swift应用开源项目推荐
			1. 风靡全球的2048 2014年出现了不少虐心的小游戏,除了名声大噪的Flappy Bird外,最风靡的应该就是2048了.一个看似简单的数字叠加游戏,却让玩的人根本停不下来,朋友圈还一度被晒分数 ... 
- Java线程之二 锁定与等待堵塞原理图
			如上图所看到的. 
- AngularJS初始用之 中间件 connect .static 静态文件不能找到
			学习心得,软件更新太快,学习不能照书本. 在学习搭建Nodejs服务器时,掉坑了啦,太坑了,对于什么都不知道的初学者,开门就是坑...,怎么坚持学下去... 还好,现在的世界很大,如果你发现自己不是犯 ... 
- Moss 几个编程技巧
			1.提升权限执行的代码 SPSecurity.RunWithElevatedPrivileges(delegate() { // 需要提升权限执行的代码 }); 应用场景:当前用户可能没有权限执行的操 ... 
- iOS协议
			ios中的协议:大家猛一看 感觉挺高深的 其实ios中的协议就是c#,java中的接口 只是变了一个形式: 自我感觉ios中的协议没有c#中的接口好 人家的接口就是固定你的程序内容的 而ios中 ... 
- OC字符串的常用方法
			网上写的关于字符串常用方法的博客很多,这里我简单做了下总结!不喜勿喷哦! 一.创建字符串 #import <Foundation/Foundation.h> //NSString //创建 ... 
- jquery中validate插件表单验证
			<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ... 
- 解决“无法连接到Python代码运行助手。请检查本机的设置”问题
			廖雪峰老师python课程里有个代码运行助手,可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码,很方便的一个脚本工具,但是很多人用过之后出现了这样的提示:“无法连接到 ... 
- asp.net内置对象session和cookie
			1.各个机器的session对象不同,不同浏览器之间不通用(换个浏览器,是个新的session). 2.session状态对象起始于网页打开,终止于网页关闭,生命周期有限. 3.关闭浏览器/超时的情况 ... 
