String类型中ToString hashCode equals compareTo等方法的经典实现

   private final char value[];
   private int hash; // Default to 0

 public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

 public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

String:
 |--CompareTo
 public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);         //取较小长度的字符串作为比较长度
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {                    //逐个比较
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

|--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;
    }  

|--hashCode

 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;
    }

 //toString的经典实现
     public static String toString(int[] a) {
            if (a == null)
                return "null";
            int iMax = a.length - 1;
            if (iMax == -1)
                return "[]";

            StringBuilder b = new StringBuilder();
            b.append(‘[‘);
            for (int i = 0; ; i++) {//中间省略判断,提高效率
                b.append(a[i]);
                if (i == iMax)
                    return b.append(‘]‘).toString();
                b.append(", ");
            }
        } 
时间: 2024-08-07 11:37:34

String类型中ToString hashCode equals compareTo等方法的经典实现的相关文章

String类型中的intern方法

jdk7之后 String s = new String("a") 如果执行intern方法时 字符串常量池中已有字符串"a"的引用 那么intern不执行任何操作 s的指向不变 intern方法返回"a"的引用 String s2 = new String("a") + new String("a") 如果字符串中没有"aa"的引用 那么intern方法调用时,首先在字符串常量池中建立

从String类型字符串的比较到StringBuffer和StringBuilder

1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they ca

java动手动脑和课后实验型问题String类型

1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? true true false 总结: 使用new关键字创建字符串对象时, 每次申请新开辟一个地址空间,存储的地址空间不一样(对象不同),string类型下hello是同一个对象,其内容和地址都相容. 2. public class StringEquals { /** * @param args the command line arguments */ public stati

千万不要误用 java 中的 HashCode 方法

刚才debug追堆栈的时候发现一个很奇怪的问题 我用IE8和Google的浏览器访问同一个地址 Action的 scope="session" 也设置了 而且两个浏览器提交的参数map也是互相独立的 不过很奇怪的一个 两个Action对象的hashmap是不同的但是它们的对象变量 paraterMap 的 哈希值 居然是一个 我大不解!( 找到原因以后发现这个问题其实只是一个好多年没有再提起的基础问题 ) 不过发现确实有朋友在网上说这个问题曾经引发过bug Java中的hashCode

String.equals(Object anObject)方法

首先注意,equals()方法接受的是Object类型的对象,并不一定是String类型. public boolean equals(Object anObject) { //两个对象地址是否一样,是,肯定是同一个对象 if (this == anObject) { return true; } //目前这个对象是否是String的实例(这也是为什么犯法传入的是Object对象) if (anObject instanceof String) { //强转为String类型 String an

java学习中,object 对象的使用(toString、equals、hashCode)(java 学习中的小记录)

java学习中,object 对象的使用(java 学习中的小记录)作者:王可利(Star·星星) object 对象(参考API学习) 重点掌握三个方法: 1.toString 返回该对象的字符串表示. 2.equals(object obj)指示其他某个对象是否与这个对象相等. 3.hashCode() 返回对象的哈希码. 详见代码的注释分析(一个是Person类重写方法,一个是Star类使用方法) Star类代码: 1 package study; 2 3 public class sta

理解Java中的hashCode和equals 方法

在Java里面所有的类都直接或者间接的继承了java.lang.Object类,Object类里面提供了11个方法,如下: Java代码   ```` 1,clone() 2,equals(Object obj) 3,finalize() 4,getClass() 5,hashCode() 6,notify() 7,notifyAll() 8,toString() 9,wait() 10,wait(long timeout) 11,wait(long timeout, int nanos) ``

矩阵的加、减、乘、除、toString、equals、hashCode、clone

1 package com.jdk7.chapter4; 2 3 import java.text.DecimalFormat; 4 import java.util.Arrays; 5 6 /** 7 * 数组的加减乘除 8 * @author Administrator 9 * 10 */ 11 12 public class MatrixData implements Cloneable{ 13 //声明一个私有double类型的二维数组存放数据,私有变量只能在该类中使用,不能被外部调用

[每天一个知识点]18-Java语言-在switch中接受String类型

在Java7中增加了一个新特性,switch可以接受String类型的变量,这就省下了书写大量if ("xxx".equals(yyy))的繁复工作.示例代码就免了,仅仅是一个数据类型的改变而已,如果会用原来的switch而在5分钟内搞不定String类型的switch,建议还是放弃做程序员吧-- 至于内部实现,java一点都没增加新内容,其实代码是被转换成了这个样子 switch (xxx.hashCode()) { case 1024: // 假设原来是"aaa"