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记录从右往左不出现空格的下标,最后根据
下标截取字符串;