1、请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
内容相同的字串常量,只保存一份以节约内存,在这段代码中s0,s1,s2实际上引用的是同一个对象。
编译器在编译s2一句时,“+”号相当于字符串连接符,直接把两个字串连接起来得一个字串(“Hello”)。
当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但储存的地址不同,所以仍然是两个独立的对象。
2、为什么会有这样的输出结果?从中你又能总结出什么?
给字串变量赋值就是两个变量s1,s2现在引用同一个字符串对象“a”,使用“+”修改s1变量的值,实际上起到了连接符的作用,实际上是得到了一个新的字符串对象,其内容为“ab”,但是它与原先s1所引用的对象”a”无关。
所以,s1==s2返回false; 代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
String.equals()方法可以比较两个字符串的内容。
3、请查看String.equals()方法的实现代码,注意学习其实现方法。
1 public class StringEquals 2 { 3 public static void main(String[] args) 4 { 5 String s1=new String("HelloWorld!"); 6 String s2=new String("HelloWorld!"); 7 System.out.println(s1==s2); 8 System.out.println(s1.equals(s2)); 9 String s3="HelloWorld!"; 10 String s4="HelloWorld!"; 11 System.out.println(s3==s4); 12 System.out.println(s3.equals(s4)); 13 } 14 }
结果截图:
分析:
String类中的equals方法是对父类Object类中的equals方法的覆盖,它的判断方法是:
①若当前对象和比较的对象是同一个对象,即return true。也就是Object中的equals方法。
②若当前传入的对象是String类型,则比较两个字符串的长度,即value.length的长度。
③若长度不相同,则return false。
④若长度相同,则按照数组value中的每一位进行比较,不同,则返回false。若每一位都相同,则返回true。
⑤若当前传入的对象不是String类型,则直接返回false。
4、动手动脑:String类的方法可以连续调用:
1 String str=“abc”; 2 String result=str.trim().toUpperCase().concat(“defg”);
请阅读JDK中的String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为:
1 MyCounter counter1=new MyCounter(1); 2 MyCounter counter2=counter1.increase(100).decrease(2).increase(3); 3 ......
1 public class Stringtest 2 { 3 public static void main(String[] args) 4 { 5 String str="abc"; 6 String result=str.trim().toUpperCase().concat("defg"); 7 System.out.println(result); 8 } 9 }
结果截图:
1 class MyCounter 2 { 3 int data; 4 public void set(int g) 5 { 6 data=g; 7 } 8 public MyCounter increase(int i) 9 { 10 MyCounter a=new MyCounter(); 11 a.data=data+i; 12 return a; 13 } 14 public MyCounter decrease(int d) 15 { 16 MyCounter a=new MyCounter(); 17 a.data=data-d; 18 return a; 19 } 20 } 21 public class Counter 22 { 23 public static void main(String[] args) 24 { 25 MyCounter c1=new MyCounter(); 26 MyCounter c2=new MyCounter(); 27 c1.set(1); 28 c2=c1.increase(100).decrease(2).increase(3); 29 System.out.println(c2.data); 30 } 31 }
结果截图:
5、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记发表到博客园。
Length():获取字串长度, java中的length属性是针对数组和字符串String说的,如果想看这个数组或字符串的长度则用到length()这个方法.。
charAt():获取指定位置的字符。
getChars():获取从指定位置起的子串复制到字符数组中。
replace():子串替换,str.replace(char o,char n)返回一个新的字符串,它是通过用n替换此字符串中出现的所有o而生成的。
toUpperCase()、 toLowerCase():大小写转换,str.toUpperCase/()str.toLowerCase(),将所有在这个字符串的字符转换为大、小写。
trim():去除头尾空格。
toCharArray():将字符串对象转换为字符数组,str.toCharArray() 返回一个新分配的字符数组,它的长度是此字符串的长度,而且内容被初始化为包含此字符串表示的字符序列。