JAVA基础知识回顾-----String详解-----随想随写

1.String
 ①:String是不可变的;声明一个String对象,对他进行二次赋值时,实际上
 是再次创建了一个String对象
 ep:
    String s1="Hello";
    s1="World";
 解释:在s1="Hello",在内存中创建了一个String对象,而在s1="World"时,
又在内存创建了一个对象,而不是用"World"去覆盖"Hello";
 ②String是一个最终类(final),在src下是这样声明的:
   public final class String
 ③关于String对象之间的比较:
   ==:String为引用数据类型,所以比较的其实是它的hashCode值
   equals:比较的是String的值
   ep1:

   String s1="Hello";
   String s2="Hello";

 
   ep2:
 

  String s1=new String("Hello");
  String s2=new String("Hello");

 
   问题:s1==s2?
   解释:成立,首先会在内存(字符串常量池)中创建一个"Hello"的对象s1,
然后在创建s2的时候会将s1的值赋值给s2,同时也会将s1的hash值赋值给s2,
所以s1和s2其实指向的是内存的同一块区域,只是他们有着不同的名字;
下面src中String的构造方法可以印证上述所说:

  public String(String original) {

        this.value = original.value;

        this.hash = original.hash;
 
       }

 
  ④String类里的常用方法解析(按字母排序):
  String中我们需要用到的字段:
   

 /** The value is used for character storage. */

    private final char value[];


    /** Cache the hash code for the string */

    private int hash; // Default to 0

  a)方法一:public char charAt(int index)
   

 public char charAt(int index) {

        if ((index < 0) || (index >= value.length)) {
 
           throw new StringIndexOutOfBoundsException(index);

        }

        return value[index];

    }

 
    作用:获取string对象中对应下标得字符值(下标是从0开始的)
    返回值:char类型的一个字符
    解释:如果下标小于0或者下标大于等于字符串的长度,则抛出
    字符串下标越界异常(StringIndexOutOfBoundsException),否则
    则返回对应下标得字符值;
  b)方法二:public int compareTo(String anotherString)
 

   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;

    }

 
    作用:两个字符串进行比较
    返回值:int型,
           如果相等,则返回值为0;
           如果不等,且相互无子集关系,则返回不同的那两个字符的ASCII码的差值
           如果不等, 存在子集关系,则返回两个字符串的长度差
  c) 方法三:public String concat(String str)
   

 public String concat(String str) {

        int otherLen = str.length();

        if (otherLen == 0) {

            return this;

        }

        int len = value.length;

        char buf[] = Arrays.copyOf(value, len + otherLen);

        str.getChars(buf, len);

        return new String(buf, true);

    }

 
    作用:两个字符串进行连接
    返回值:连接后的新字符串
    解释:如果str为空字符串,则直接返回调用该方法的对象即可
    如果不为空字符串,则先建立一个字符数组,调用Arrays.copyOf()方法,
    将第一个源字符串的值赋值给字符数组,然后再调用getChars()方法,
    将第二个源字符串的值赋值给字符数组,最后返回一个String对象即可;

   d)方法四:public boolean equals(Object anObject)
 

    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;

    }

 
    作用:对象比较
    返回值:如果两个对象的值相等,则返回true,否则返回false;
    解释:首先判断两个对象是否为同一个对象,如果是同一个对象则返回true;
          然后判断参数对象是否是String的实例,如果不是String的实例,则
          返回false,如果是,则倒叙比较String中的每个字符,如果全部相等,
          则返回true,否则返回false;
   e)方法五:public static String format(String format, Object... args)
    

public static String format(String format, Object... args) {

        return new Formatter().format(format, args).toString();

    }

 
   作用:格式化字符串
   返回值:格式化后的字符串
   ep:
  

String str=null;
   int year=2016,month=06,day=05;
   str=String.format("%d-%d-%d",year,month,day);
   System.out.println(str);

   e)方法六:public String trim()
   

 public String trim() {

        int len = value.length;

        int st = 0;

        char[] val = value;
    /* avoid getfield opcode */


        while ((st < len) && (val[st] <= ' ')) {

            st++;

        }

        while ((st < len) && (val[len - 1] <= ' ')) {

            len--;

        }

        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;

    }
   

 作用:去除前导空格和后到空格
   返回值:返回去除空格后的字符串
   解释:st从左往右记录不出现空格的下标,len记录从右往左不出现空格的下标,最后根据
   下标截取字符串;

猜你喜欢

转载自ye-wolf.iteye.com/blog/2303166