第四章动手动脑
1.请运行以下示例代码StringPool.Java,查看其输出结果。如何释这种输出结果?从中你能总结出什么?
运行截图:
在java中,内容相同的字符串常量只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
两个变量值一样时,字符串==符号比较地址,所以前两个是true
当直接使用new关键字创建字符串对象时,虽然值一致,但仍然是两个独立的对象。两个变量不同,所以是false
2.为什么会有这样的输出结果? 从中你又能总结什么?
给字串变量赋值意味着:两个变量()现在引用同一个字符串对象“a”!,String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象“a”无关,所以,返回false。代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
3.
请查看String.equals()方法,学习其实现方法。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) { //判断anObject是不是String类的一个实例
String anotherString = (String)anObject; //把anObject赋值给anotherString
int n = count; //count是String的成员代表原始字符串长度
if (n == anotherString.count) {
char v1[] = value; //把原来的字符串和要比较的字符串以字符形式存入数组
char v2[] = anotherString.value;
int i = offset; //分别取数组下标
int j = anotherString.offset;
while (n-- != 0) { //遍历数组,比较 数组元素是否相同
if (v1[i++] != v2[j++]) //在遍历的过程中如果有不同的就返回false
return false;
}
return true; //相等返回true
}
}
return false; //不是String实例返回false
}
4.整理String类
length() 求长度
字符串A.length(); //返回int
charAt() 求指定位置的字符
char a=字符串A.charAt(第几个);//返回一个字符
replace()
替换 原字符串中的某个字符并赋值给新字符串
语法
此方法定义的语法如下:
public String replace(char oldChar, char newChar)
toUpperCase()
转换为大写
被转换的字符串.toUpperCase()
toLowerCase()
转换为小写
被转换的字符串.toLowerCase()
trim() 去掉开头结尾的空格
toCharArray() 把字符串转换为字符数组