一、不可變String
需要明確的是,Java中只有值傳遞。對於一個方法而言,參數是爲該方法提供信息的,而不是爲了讓方法改變自己。
二、Java中僅有的2個被重載過的操作符
- +與+=在String類型中被重載
- Java不允許程序員重載任何操作符
三、考慮性能與線程安全問題請使用StringBuffer
- 在循環體內使用String的+拼接操作,會創建很多無用對象。
- 不考慮線程安全問題,可以使用StringBuider
- 線程安全,需要用StringBuffer
四、避免無意識遞歸
public class InfiniteRecursion {
public String toString() {
/*
這裏使用this關鍵字不妥,由於String類重載了操作符+
“InfiniteRecursion address: ”調用+操作符,
會使得this也調用自己的toString方法,使自己變爲String類型
造成無限遞歸!
*/
return "InfiniteRecursion address: " + this + "\n";
}
public static void main(String[] args) {
List<InfiniteRecursion> v = new ArrayList<>();
for(int i = 0; i < 10; i++) {
v.add(new InfiniteRecursion());
System.out.println(v);
}
}
}
五、正則表達式
- 三種模式
String str = "aa<tr>sdfc</tr>abb<tr>asdas</tr>ccc"
一、貪婪型(最大匹配):先掃描全部,若不匹配,再縮小範圍
若reg = <.*>會得到:<tr>sdfc</tr>abb<tr>asdas</tr>
X?
X+
X*
X{n}
X{n,}
X{n,m}
二、勉強型(最小匹配):從小範圍開始掃描,只要匹配到一個就立馬返回
若reg = <.*?>會得到:<tr>sdfc</tr>
X??
X+?
X*?
X{n}?
X{n,}?
X{n,m}?
三、佔有型(完全匹配):先掃描全部,若不匹配,也不會縮小範圍
若reg = <.*+>,這個還不知道得到啥,沒看明白,待填坑
X?+
X++
X*+
X{n}+
X{n,}+
X{n,m}+