三:字符串的特点
1. 字符串的特点:
1)
一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,引用可以改变。
2)
String字面值对象和构造方法创建对象的区别
栈--方法区常量池 String s = new String(“hello”)
和栈--方法区常量池String s = “hello”;的区别?
有。前者会创建2个对象,后者创建1个对象。
3)
==:比较引用类型 比较的是地址值是否相同
equals:比较引用类型默认也是比较地址值是否相同,
而String类重写了equals()方法,比较的是内容是否相同。
4)
字符串如果是变量相加,先开空间,在拼接。
字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
5)
String s1 = "hello";
String s2 = "hel";
6)
System.out.println(s1.compareTo(s2)); // 2
字符串会自动转换为一个字符数组。
private final char value[];
字符串会自动转换为一个字符数组。
public int compareTo(String anotherString) {
//this -- s1 -- "hello"
//anotherString -- s2 -- "hel"
int len1 = value.length; //this.value.length--s1.toCharArray().length--5
int len2 = anotherString.value.length;//s2.value.length -- s2.toCharArray().length--3
int lim = Math.min(len1, len2); //Math.min(5,3); -- lim=3;
char v1[] = value; //s1.toCharArray()
char v2[] = anotherString.value;
//char v1[] = {'h','e','l','l','o'};
//char v2[] = {'h','e','l'};
int k = 0;
while (k < lim) {
char c1 = v1[k]; //c1='h','e','l'
char c2 = v2[k]; //c2='h','e','l'
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2; //5-3=2;
}
关于compareTo()的问题:如果比较的两个字符串长度不一样,较短的和较长的前一部分一样。
这是返回两个字符串之差。如果前一部分就不一样,就按照字典顺序比较规则返回-1,1,0
|
|