Java编程思想(第十三章字符串)学习笔记

一、不可变String

需要明确的是,Java中只有值传递。对于一个方法而言,参数是为该方法提供信息的,而不是为了让方法改变自己。

二、Java中仅有的2个被重载过的操作符

  1. +与+=在String类型中被重载
  2. Java不允许程序员重载任何操作符

三、考虑性能与线程安全问题请使用StringBuffer

  1. 在循环体内使用String的+拼接操作,会创建很多无用对象。
  2. 不考虑线程安全问题,可以使用StringBuider
  3. 线程安全,需要用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);
		}
	} 
}

五、正则表达式

  1. 三种模式
String str = "aa<tr>sdfctr>abb<tr>asdastr>ccc"
一、贪婪型(最大匹配):先扫描全部,若不匹配,再缩小范围
	若reg = <.*>会得到:<tr>sdfctr>abb<tr>asdastr>
	X? 
	X+ 
	X* 
	X{n} 
	X{n,} 
	X{n,m}
二、勉强型(最小匹配):从小范围开始扫描,只要匹配到一个就立马返回
	若reg = <.*?>会得到:<tr>sdfctr>
	X?? 
	X+? 
	X*? 
	X{n}? 
	X{n,}? 
	X{n,m}?
三、占有型(完全匹配):先扫描全部,若不匹配,也不会缩小范围
	若reg = <.*+>,这个还不知道得到啥,没看明白,待填坑
	X?+ 
	X++ 
	X*+ 
	X{n}+ 
	X{n,}+ 
	X{n,m}+

你可能感兴趣的:(Java编程思想)