以下学习根据JDK1.7String类源代码做注释

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
//String类是final的,也就是说String类不允许被继承,实现了Serializable接口(可以序列化和反序列化),Comparale(可以进行自定义的字符串比较) CharSequence(一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问。StringBuilder 和StringBuffer也实现了这个接口)
private final char value[]; //用于存放string字符的数组
private int hash; //表示string字符的哈希值,默认为0


//默认构造方法,一般不用,因为String字符串是不可改变的
    public String() {
            this.value = new char[0];
    }
//有参构造方法,使用已存在的一个字符串创建一个相同字符序列的字符串
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
 //使用一个字符数组创建一个字符串
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
        //使用Arrays类复制字符数组并赋值给String类声明的value
    }    

 //使用字符数组的一部分创建一个字符串对象 offset字符数组开始位置,count数组开始位置往后的长度
    public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // 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);
    }    

//将字节数组从offset开始,长度为length并以chatsetName编码转换成字符串
    public String(byte bytes[], int offset, int length, String charsetName)
            throws UnsupportedEncodingException {
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        checkBounds(bytes, offset, length);
        this.value = StringCoding.decode(charsetName, bytes, offset, length);
    }
    //返回字符串的长度
    public int length() {
        return value.length;
    }
//判断字符串长度是否为0
    public boolean isEmpty{
        retutn value.length==0

    }
//根据下标获取字符
   public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

    //equals 比较的是值
    public boolean equals(Object anObject) {
        if (this == anObject) {//如果是同一个对象,返回true
            return true;
        }
        if (anObject instanceof String) { //判断是否是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;
    }
//采用乘法hash算法,字符串相同hash值一定相同,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值乘31+该字符
            }
            hash = h;
        }
        return h;
    }
 
 

String类源码分析(JDK1.7)的更多相关文章

  1. String 类源码分析

    String 源码分析 String 类代表字符序列,Java 中所有的字符串字面量都作为此类的实例. String 对象是不可变的,它们的值在创建之后就不能改变,因此 String 是线程安全的. ...

  2. String类源码分析

    1.String类注释说明 /** * The {@code String} class represents character strings. All * string literals in ...

  3. ArrayList源码分析--jdk1.8

    ArrayList概述   1. ArrayList是可以动态扩容和动态删除冗余容量的索引序列,基于数组实现的集合.  2. ArrayList支持随机访问.克隆.序列化,元素有序且可以重复.  3. ...

  4. List 接口以及实现类和相关类源码分析

    List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除( ...

  5. ReentrantLock源码分析--jdk1.8

    JDK1.8 ArrayList源码分析--jdk1.8LinkedList源码分析--jdk1.8HashMap源码分析--jdk1.8AQS源码分析--jdk1.8ReentrantLock源码分 ...

  6. Java Properties类源码分析

    一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...

  7. Java并发编程笔记之Unsafe类和LockSupport类源码分析

    一.Unsafe类的源码分析 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通过使用JNI的方式来访问本地C++实现库. rt.jar ...

  8. Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

    上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...

  9. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

随机推荐

  1. Android基本控件之RadioGroup

    我们在手机上经常看到一堆选项,但是我们只能选择一个,那么在Android中,这个控件就叫做RadioButton,也就是单选按钮的意思,他们之所以能够达到只能选择一个的效果,是因为有一个RadioGr ...

  2. HBase-配置说明

    转载自:http://www.aboutyun.com/thread-7914-1-1.html hbase.rootdir这个目录是region  server的共享目录,用来持久化Hbase.UR ...

  3. 琐碎-hadoop2.2.0目录结构

    之前了解了一下0.20.2和1.1.0.以后现在主流肯定是2.x吧,包含了之前没有的yarn bin Hadoop最基本的管理脚本和使用脚本,这些脚本是sbin目录下管理脚本的基础实现,用户可以用这些 ...

  4. 装在u盘的linux

    有个8g的优盘,想利用下装linux,好久没碰Linux了,puppy Linux中文版已经不更新了,Ubuntu麒麟按部就班的跟着Ubuntu官方版的更新走,不过发现一个软件,满不错的,Ubuntu ...

  5. The First

    好吧,今天是第一次,写博客,虽然有点不明白,博客的作用.以后就写点感想,与每天的收获.既然,在博客园注册,自然也与IT相关了. hello,world!

  6. NODE编程(二)--异步编程技术

    在Node世界里流行两种响应逻辑管理方式,回调和事件监听. 回调通常用来定义一次性响应的逻辑.比如对于数据的查询,可以指定一个回调函数来确定如何处理查询结果. 事件监听器,本质上也是一个回调,不同的是 ...

  7. PureCSS框架

    http://www.tuicool.com/articles/iyiI32 Pure中的主要组件包括: 一个响应式网格,可根据需求定制. 一个基于 Normalize.css 的基础库,用于修复跨浏 ...

  8. Cisco 交换机的操作

    Cisco的工作模式 Cisco设备有常用模式为:用户模式.特权模式.全局模式.端口模式.首先它们之间呈现出递进关系:用户模式->特权模式->全局模式->端口模式 1.用户模式 交换 ...

  9. HDU 2181 哈密顿绕行世界问题 (DFS)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. [改善Java代码]避免在构造函数中初始化其他类

    建议35: 避免在构造函数中初始化其他类 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码: publ ...