Java基础18--泛型--工具类--JDK1.5新特性(四)

2014-11-24 03:26:40 · 作者: · 浏览: 2
return new MyList(list); } private class MyList implements List { private List list; private static final Object lock = new Object(); MyList(List list) { this.list = list; } public boolean add(Object obj) { synchronized(lock) { return list.add(obj); } } public boolean remove(Object obj) { synchronized(lock) { return list.remove(obj); } } } }

18-14,Arrays数组工具类方法介绍

1,binarySearch(...)二分查找法,返回索引。

2,equals(...)覆写了Object中的equals,比较内容是否相同,即长度相同且对应位上的元素相同。

3,static void fill(byte[] a,byte val)将val赋给byte[]中的每一个位置。

4,sort(...)将传入的数组排序。

5,toString(),覆写了Object中的toString(),直接打印数组中的元素。

6,toString()的经典实现:

public static String myToString(int[] a) {
	int iMax = a.length - 1;
	if(iMax == -1) {
		return "[]";
	}
	StringBuilder b = new StringBuilder();
	b.append('[');
	for(int i=0;;i++) {
		b.append(a[i]);
		if(i == iMax) {
			return b.append(']').toString();
		}
		b.append(",");
	}
}

18-15,Arrays-asList方法

1,static List asList(T... a)

返回一个受指定数组支持的固定大小的列表。

用asList的原因:Arrays中提供的方法也是相当有限的,如果把数组转换成集合操作就方便多了,比如判断一个元素是否在数组中,Arrays中没有这个方法,就需要自己写一个判断方法,但是如果将这个数组转换成List就可以直接用contains判断了。

2,好处:可以使用集合中的方法操作数组中的元素。

注意:数组的长度是固定的,所以对于集合的增删方法是不能使用的,否则会发生UnsupportedOperationException异常,只要不改变集合长度的方法都可以使用。

但是可以使用set方法用指定元素替换指定的元素。

3,如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行存储。如果数组中的数据是基本数据类型,那么会将该数组作为集合中的元素进行存储。

例如:

int[] arr = {31,11,51,61};

List list =Arrays.asList(arr);

System.out.prtinln(list);//[[I@C17164

这时list集合的长度是1,打印结果是打印数组对象。

但是如果定义一个Integer类型数组,即非基本数据类型数组:

Integer[] arr = {31,11,51,61};

List list =Arrays.asList(arr);

System.out.println(list);//打印[31,11,51,61]

说明,如果存入非基本数据类型数据,打印的是每个对象的toString()。

18-16,Collection-->toArray方法

1,如何将集合转化成数组呢?

使用的是Collection接口中的toArray方法。

2,集合转成数组:可以对集合中的元素操作的方法进行限定,不允许对其进行增删。

3,toArray方法需要传入一个指定类型的数组。

长度该如何定义呢?

如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同size的数组。

如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合的元素,其他位置默认为null。

所以建议,最好将长度指定为集合的size。

List
  
    list = new ArrayList
   
    (); list.add("abc1"); list.add("abc2"); list.add("abc3"); String[] arr = list.toArray(new String[list.size()]); System.out.println(Arrays.toString(arr)); 
   
  

18-17,JDK1.5新特性-ForEach循环

1,Collection的父接口是Iterable接口,该接口中只有一个iterator迭代器方法,在JDK1.5才出现,因为以后还有可能出现像Collection的顶层父类,都希望他们具备迭代功能,所以抽取出来,提高了扩展性。

2,ForEach循环,增强For循环

格式:for(类型 变量 :Collection集合或数组){...}

传统for和高级for的区别:

(1)传统for可以完成对语句执行很多次,因为可以定义控制循环的增量和条件。

(2)高级for是一种简化形式,它必须有被遍历的目标。该目标要么是数组,要么是Collection单列集合。

对数组的遍历如果仅仅是获取数组中的元素,可以使用高级for。

如果要对数组的角标进行操作建议使用传统for。

可以使用高级for遍历map集合么?

不能直接用,但是可以将map转换成单列的set就可以使用了。

4,实例:

public class Demo1 {
	public static void main(String[] args) {
		List
  
    list = new ArrayList
   
    (); list.add("abc1"); list.add("abc2"); list.add("abc3"); for(String s : list) {//简化了书写,底层其实是iterator System.out.println(s); } } } 
   
  

public class Demo2 {
	public static void main(String[] args) {
		int[] arr = {3,1,5,7,4};
		for(int i : arr) {
			System.out.println(i);
		}
	}
}

遍历Map示例:

public class Demo3 {
	public static void main(String[] args) {
		Map
  
    map = new HashMap
   
    (); map.put(3,"zhangsan"); map.put(1,"wangyi"); map.put(5,"wangcai"); map.put(7,"xiaoqiang"); for(Integer key : map.keySet()) { String value = map.getKey