一、不可变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的方法。就是跟谁更亲调用谁。
这句话说的挺好。
二、重载“+”与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类
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);
}
}
4.格式化说明符
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转换
6.String.format
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。