java_聚合框架中的工具类,Foreach

java_集合框架中的工具类,Foreach

                           ------- android培训、java培训、期待与您交流! ----------

 

 

 

Collections和Arrays都是集合框架中的工具类,提供了对集合进行操作的方法,所以方法都是静态的。

 

 

Collections

 

Collections和Collection在名称上看上去很像,实际上它们是完全不同的。

 

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。

它有两个常用的子接口,

List:对元素都有定义索引。有序的。可以重复元素。

Set:不可以重复元素。无序。

 

Collections是集合框架中的一个工具类。该类中的方法都是静态的
提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安全的。因为要提高效率。
如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
 
排序方法
sort(List<T> list)
在集合中经常需要对集合中的对象进行排序,Set和Map集合中都提供了对元素排序的方式,而List集合中没有。Collections正好提供了list的排序方法sort(),根据元素自然顺序排序。
List<String> list = new ArrayList<String>();

		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		list.add("qq");
		list.add("z");
		Collections.sort(list);//调用sort方法,对list集合进行排序
 
在此方法中还可传入自定义比较器。
		Collections.sort(list,new StrLenComparator());
 
class StrLenComparator implements Comparator<String>
{
	public int compare(String s1,String s2)
	{
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()<s2.length())
			return -1;
		return s1.compareTo(s2);
	}
}
 
比较器中首先比较的上长度,其次再用compareTo方法比较。这样list中的字符串首先按照长度排序,如果长度相同,再按自然顺序排序。
 
最值
可以求获取Collection集合总的最大值和最小值,方法分别为max,min。
这里以最大值为例
max(Collection<? extends T> coll)
还可以通过max方法获取集合中的最大值。
String max = Collections.max(list);
 
 此方法中同样可以传入比较器。意思是获取按照指定比较器排序后的最大值。
String max = Collections.max(list,new StrLenComparator());
 获取最小值的方法min与max相似,这里不再介绍。
 
二分法查找
binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。如果查找到,则返回索引,否则返回-1。
这也只能用于List集合,并要求传入的List集合,已按排好了序。
此方法中也可以传入比较器,表示使用指定比较器排好序,再查找key的索引。
int index = halfSearch2(list,"aaaa",new StrLenComparator());
 
 
 
替换和反转
replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值

reverse(List<?> list)
反转指定列表中元素的顺序。
List<String> list = new ArrayList<String>();

		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		//用"pp"替换"aaa"
		Collections.replaceAll(list,"aaa","pp");
		//将list集合反转
		Collections.reverse(list);
 
 
反转比较器
reverseOrder()
返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序
在这个方法中也可以传入自定义比较器,reverseOrder会将其逆转
new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
 此TreeSet集合将按照StrLenComparator比较器的相反顺序排序。
 
将list集合中元素随机排列
shuffle(List<?> list)
使用默认随机源对指定列表进行置换。
Collections.shuffle(list);
 
 
集合变数组
这个方法不属于Collections工具类,而是属于Collection接口中的。这个方法经常需要用到。
toArray()
返回包含此 collection 中所有元素的数组。
也可传入参数,参数表示toArray返回的类型。
ArrayList<String> al = new ArrayList<String>();

al.add("abc1");
al.add("abc2");
al.add("abc3");		
//toArray中指定了返回的数组类型,为String数组
String[] arr = al.toArray(new String[al.size()]);
//通过调用Arrays工具类中的方法,可将数组变为字符串
System.out.println(Arrays.toString(arr));
 
 
 
Arrays工具类
Arrays:用于操作数组的工具类。
里面都是静态方法。
将数组变为集合
asList将数组变成list集合,这个方法和Collection中的toArray方法是对应的,经常用于数组于Collection集合相互转换。

把数组变成list集合的好处
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。
因为数组的长度是固定。如果你增删。那么会反生UnsupportedOperationException。
如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
int[] arr = {2,4,5};
		String[] str = {"abc","cc","kkkk"};
		//数组变为了list集合
		List<String> list = Arrays.asList(str);
		sop("contains:"+list.contains("cc"));
		//抛出UnsupportedOperationException异常,不能改变长度
		list.add("qq");
 
 


Foreach语法


这是JDK1.5引进的一种简洁的for语法,由于容器和数组。与普通for语句不同在于,它不用定义变量来表示角标,它会自动计数。也称这种for语句为高级for语句

格式:

for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)

{

 

}

 

 

与迭代器区别

 

对集合进行遍历。

只能获取集合元素。但是不能对集合进行操作。

迭代器除了遍历,还可以进行remove集合中元素的动作。

如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。

 

传统for和高级for有的区别

高级for有一个局限性。必须有被遍历的目标。
建议在遍历数组的时候,还是希望是用传统for。因为传统for可以定义脚标。
int[] arr = {3,5,1};
		//for语句定义了变量,表示角标
		for(int x=0; x<arr.length; x++)
		{
			System.out.println(arr[x]);
		}
		//没有定义变量来表示角标,每次循环自动指向下一个
		for(int i : arr)
		{
			System.out.println("i:"+i);
		}