动手动脑:
1.请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。
这种优化工作由Java编译器自动完成。 当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
2.
.
给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;
代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。 String.equals()方法可以比较两个字符串的内容。
3.
String类的方法可以连续调用: String str="abc"; String result=str.trim().toUpperCase().concat("defg");
请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为: MyCounter counter1=new MyCounter(1); MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
原理:连续调用特点是返回值类型为同一个类型,且与等号左边的类型一致,这样就可以连续调用了。
相关代码:
public class MyCounter { int num; MyCounter(int n) { num = n; } MyCounter increase(int n)//返回值类型为MyCounter类型 { this.num +=n; return this; } MyCounter decrease(int n)//返回值类型为MyCounter类型 { this.num -=n; return this; } public static void main(String[] args) { // TODO Auto-generated method stub MyCounter counter1=new MyCounter(1); MyCounter counter2=counter1.increase(100).decrease(2).increase(3); System.out.println(counter2.num); } }
整理String类常用的方法:
1 string.length()是用来求字符串的长度,返回值为字符串的长度。
2 string.charAt()为取该字符串某个位置的字符,从0开始,例如string.charAt(0)就会返回该字符串的第一个字符。
3 string.getChars()为将这个字符串中的字符复制到目标字符数组。
4 string.replace()为将原string 中的元素或子串替换。返回替换后的string。
5 string.toUpperCase()为将字符串string中字符变为大写。
6 string.toLowerCase()为将字符串string中字符变为小写。
7 string.trim()为去除字符串的头为空格。
8 string.toCharArray()为将字符串转换为字符数组。