Java笔记 split/不定长度参数/泛型类型通配符

今天看了一下午《Java学习笔记》,作者林信良,花名良葛格。从书中所获颇多,正所谓温故而知新,我就把今天的“新”总结一下,加深记忆。良葛格也提倡“在网上写文章是我记录所学的一种方式”。

split的正则式和其中的正则式

C语言其中有函数strtok,就是按某些char对字符串进行切割。下面给出一个C下面的范例

char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "#";
char *result = NULL;

result = strtok( str, delims );

while( result != NULL ) {
	printf( "result is \"%s\"\n", result );
	result = strtok( NULL, delims );
}

在Java中也有类似的StringTokenizer,但是在JDK5中,已经被标记为Legacy Class(遗产类),推荐使用String.split(String regex),可以接受正则表达式。范例如下。

private void init() {
	Scanner scanner = new Scanner(System.in);

	System.out.println("input n and data");
	n = scanner.nextInt();
	data = new int[n];

	String input = scanner.next().trim();

	//String[] strData = splitByTokenizer(input);
	String[] strData = input.split("[,\\s]");

	int i = 0;
	for (String t : strData) {
		data[i] = Integer.parseInt(t);
		i++;
	}
}

//已过时,Legacy Class(遗产类)
private String[] splitByTokenizer (String input, String regex) {

	String [] result = null;
	if (input != null && !input.equals("")) {
		StringTokenizer commaToker = new StringTokenizer(input, ",");
		result = new String[commaToker.countTokens()];
		int i = 0;
		while (commaToker.hasMoreTokens())
		{
			result[i] = commaToker.nextToken();
			i++;
		}
	}
	return result;
}

不定长度参数

听名字这东西就相当有用,也是JDK5开始支持的。(话说现在都JDK6.0了,我们很多童鞋对Java的概念还停留在最开始,其中也包括我,咱们要与时俱进嘛)直接上代码,就知道怎么用了。

package dddspace.job.exercise1115;

/**
 * 使用不定长度参数
 * 参考《Java学习笔记》P153相关内容
 *
 */
public class VarArgs {

	public static void main(String[] args) {

		int sum = 0;
		sum = VarArgs.sum(1, 2);
		System.out.println(sum);

		sum = VarArgs.sum(1, 3, 5, 7);
		System.out.println(sum);
	}

	//关键在 "int..."
	private static int sum(int... nums) {
		int sum = 0;
		for (int num : nums) {
			sum += num;
		}
		return sum;
	}

}

泛型类型通配符

如果你还不知道泛型是什么,那么最好补一下基础(via Baidu Zhidao),这个在C++中运用广泛,在JDK5.0加入Java大家族。我这里要解释的是泛型类型的通配符,呃,有点绕口。其实就是让泛型T这个T通过支持一个接口来支持其实现类。

咱们还是让代码来反应思想吧。

package dddspace.job.exercise1115;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 泛型类型通配符
 * 参考《Java学习笔记》P249相关内容
 *
 */
public class WildcardTest<T> {

	public static void main(String[] args) {

		/*想定义泛型为List接口,错误
		WildcardTest<List> wildcardTestW= null;
		wildcardTestW = new WildcardTest<ArrayList>();
		wildcardTestW = new WildcardTest<LinkedList>();
		*/

		//关键词 "<? extends Class>"匹配正确
		WildcardTest<? extends List> wildcardTest= null;
		wildcardTest = new WildcardTest<ArrayList>();
		wildcardTest = new WildcardTest<LinkedList>();
	}

}

补遗:关于String/StringBuilder/StringBuffer

简单来说,String是不可变的,每次都是指向不同的内存空间。StringBuilder是可变的,线程不安全。StringBuffer是可变的并且线程安全。StringBuilder是JDK5.0加入的。(今天5.0开心了,都是推它的)

A.shun有一篇关于String/StringBuilder/StringBuffer的文,可以移步到这里看详细介绍。

版权所有 © 2010 转载本站文章请注明: 转载自Log4D
原文链接: http://dddspace.com/2009/11/java-notes-_split-variable-length-parameter-generic-type-wildcard.html
您可以随意地转载本站的文章,但是必须在醒目位置注明来源及本站链接,不可以将本站文章商业化使用,或者修改、转换或者以本作品为基础进行创作。
3a1ff193cee606bd1e2ea554a16353ee

分享家:Addthis中国
相关文章

留下一条评论

你的邮箱不会被公开 . *标注为必填

*
*