java第四章动手动脑

动手动脑:

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()为将字符串转换为字符数组。

 

posted @ 2017-10-26 19:36  牛头怪  阅读(67)  评论(0编辑  收藏  举报