一、不可变String

String类型的对象是不可变的,所有的改变实际上都是创建了一个新的String对象,另外当String作为传入参数的时候,其实实际上传入的是这个引用的一个拷贝,这个方法结束了之后这个传入的引用也就消失了,原来的那个String不会受到方法内的影响而改变。

package tij.string;

public class Test {
    String s = "field";
    Object o = "123";
    void change(String change_s) {
        System.out.println(this.s == change_s);
        System.out.println(this.s.hashCode() + "---" + change_s.hashCode());
        change_s = "change";
        System.out.println(this.s == change_s);
        System.out.println(this.s.hashCode() + "---" + change_s.hashCode());
    }

    public static void main(String[] args) {
        Test t = new Test();

        t.change(t.s);
        System.out.println(t.s);

        System.out.println("--------");

        t.change(t.o);
        System.out.println(t.o);

    }

    void change(Object o) {
        o = 123;
        System.out.println(this.o == o);
        System.out.println(this.s.hashCode() + "---" + o.hashCode());
    }
}

这个例子是我自己想的,在接收string参数的change方法(就叫暂时就change1啦)里,传入的的确是t.s,在未对change_s进行操作的时候,传入的change_s与t.s也的确完全相同,但是当改变了传入参数change_s后,可以发现t.s并没有改变。这就证实了,传入的其实并不是t.s这个引用本身,而传入的其实是这个引用的拷贝,为了对比,我还加入了传入参数为object类型的change方法,对比可以发现,在接收Object方法的change中,传入的就是引用本身。
另外还发现= =,change方法存在重写,但是string是Object的子类,当传递string或string的子类的时候,优先调用传递参数是String的,没有的话再去调用传递参数是object的方法。就是跟谁更亲调用谁。
clipboard.png
这句话说的挺好。

二、重载“+”与StringBuilder

String是不可变对象,但是String对象可以适用“+”这个运算符,由于String的不可变性,当String类型对象会变化的时候,推荐适用StringBuilder

三、无意识的递归

有时候你不小心就会用递归了,比如ArrayList类型对象的toString方法就会遍历一圈,只不过你以为没有遍历而已。如果你真的想打印这个对象的地址,请用他父类Object的toString方法。

四、String上的操作

看API

五、格式化输出

1.运用printf()

System.out.printf("%d",x);

和C语言很相似

2.System.out.format()


public class Test {
    public static void main(String[] args) {
        int x = 5;
        double y = 5.332542;
        System.out.printf("%d  %f", x, y);
        System.out.format("%d  %f", x, y);
    }
}

format和printf是等价的哟

3.Formatter类

clipboard.png

import java.io.PrintStream;
import java.util.Formatter;

public class Test {

    public static void main(String[] args) {
        PrintStream outAlias = System.out;
        Turtle tommy = new Turtle("Tommy", new Formatter(outAlias));
        Turtle terry = new Turtle("Terry", new Formatter(outAlias));
        tommy.move(0, 0);
        terry.move(4, 0);
    }
}

class Turtle {
    private String name;
    private Formatter f;

    public Turtle(String name, Formatter f) {
        this.name = name;
        this.f = f;
    }

    public void move(int x, int y) {
        f.format("%s The Turetle is ad (%d,%d)\n", name, x, y);
    }
}

clipboard.png

4.格式化说明符

clipboard.png

import java.io.PrintStream;
import java.util.Formatter;

public class Test {

    public static void main(String[] args) {
        Receipt receipt = new Receipt();
        receipt.printTitle();
        receipt.print("Princess Peas", 3, 5.1);
    }
}

class Receipt {
    private double total = 0;
    private Formatter f = new Formatter(System.out);

    public void printTitle() {
        f.format("0123456789012345678901234567890\n");
        f.format("%-15s %5s %10s\n", "Item", "Qty", "Price");
        f.format("%-15s %5s %10s\n", "----", "---", "-----");
    }

    public void print(String name, int qty, double price) {
        f.format("%-15.15s %5d %10.2f\n", name, qty, price);
        total += price;
    }

}

5.Formatter转换

clipboard.png
clipboard.png

6.String.format

clipboard.png

public class Test {

    public static void main(String[] args) {
        int x = 3;
        double y = 5.1231315;
        String result = String.format("[%d %.2f]", x, y);
        System.out.println(result);
    }
}

六、正则表达式

网上教程学

七、扫描输入

Java SE5新增了Scanner类。
看书

八、StringTokenizer

废弃

end


z_dominic
115 声望15 粉丝

你有freestyle吗?