----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Collections:为集合提供了很多功能方法,此类不需要创建对象,内部提供的方法都是静态的。这些静态方法有:
1,Collections.sort(list); //集合进行元素的自然排序。
2,Collections.sort(list,new ComparatorByLen()); //按指定的比较器方法排序。
例:class ComparatorByLen implements Comparator<String>
{
public int Compare(String s1,String s2)
{
int temp = s1.length()-s2.length();
return temp==0?s1.compareTo(s2):temp;
}
}
3,Collections.max(list); //返回list中字典顺序最大的元素。
4,int index = Collections。binarySearch(list,”aa”); //二分查找,返回角标。
5,Collections.reverseOrder(); //逆向反转排序。
6,Collections.shuffle(list); //随机对list中的元素进行位置的置换。
Collection与Collections的区别:
Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列的静态方法,实现对集合的查找、排序、替换、线程安全化(将非线程同步的集合转换成同步的)等操作。
Collection是个java.util下的接口,它是各种集合结构接口的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断及遍历等。
将集合由非同步转成同步的方法:
原理:定义一个类,将集合所有的方法加同一把锁后返回。
Collections中的XX synchronizedXX(XX);
如:List synchronizedList(list);
Map synchronizedMap(map);
Arrays:用于操作数组对象的工具类,里面都是静态方法。
1,asList方法:将数组转换成list集合。
String[] arr = {“czbk”,”hm”,”jy”};
List<String> list = Arrays.asList(arr); //将arr数组转成list集合。
注意:数组是固定长度的,不可以使用集合对象增加或者删除等,会改
变数组长度的功能方法。(局限性)
如果数组中存储的是引用数据类型,直接作为集合的元素可以直接用集合方法操作。
如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。
2,toArray():集合转换成数组。
如果给toArray传递的指定类型的数据长度小于了集合的size,那么,toArray方法会自定再创建一个该类型的数据,长度为集合的size。
如果给toArray传递的指定类型的数据长度大于了集合的size,那么,toArray方法就不会创建数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他为存储元素的位置默认值为null。
所以,在传递给指定类型数据时,最好的方式就是指定的长度和size相等的数组。
将集合转换成数组后,限定了对集合中的元素进行增删操作,只要获取这些元素即可。
增强for循环:foreach语句,foreach简化了迭代器。
格式:
/*
增强了for循环括号里面写两个参数,第一个是声明一个变量,第二个
就是需要迭代的容器。
*/
for(元素类型变量名 : Collection集合&数组)
{
........
}
高级for循环和传统for循环的区别:
高级for循环在使用时,必须要明确遍历的目标。这个目标可以是Collection集合或者数组。如果遍历Collection集合,在遍历过程中还需要对元素进行操作,比如删除,需要使用迭代器;如果遍历数组,还需要对数组元素进行操作,建议用传统for循环,因为传统for循环可以定义角标,可以通过角标来操作元素。如果只为了遍历获取,可以简化成高级for循环。
高级for循环不可以遍历map集合,但可以将map转成set后再使用foreach语句。
几个小问题:
1,对存储对象的容器进行迭代。数组、Collection、map。
2,增强for循环迭代数组:
String[] arr = {“c”,”z”,”b”,”k”};
for(String s : arr)
{
System.out.println(s);
}
3,单列集合Collection:
List list = new ArrayList();
List.add(“czbk”);
for(Object obj : list)
{
String s = (String)obj;
System.out.println(s);
}
4,双列集合Map
Map map = new HashMap();
map.put(“h”,”m”);
//传统方式。
Set entrys = map.entrySet();//获得所有的键值对Entry对象
Iterator it = entrys.iterator();//迭代所有的entry
while(it.hasNext())
{
Map.Entry entry = (Entry)it.next();
String key = (String)entry.getKey();
String value= (String)entry.getvalue();
System.out.println(key+”=”+value);
}
//增强for循环迭代。
for(Object obj : map.entrySet())
{
Map.Entry entry = (Entry)obj;
System.out.println(entry.getKey()+”=”+entry.getValue());
}
5,集合迭代器注意的问题:在迭代集合的过程中,不能对集合进行增删操作,可以用迭代器的方法进行操作。
6,增强for循环注意的问题:在使用增强for循环时,不能对元素进行赋值。
int[] arr = {1,2,3};
for(int num : arr)
{
num = 0;
}
System.out.println(arr[1]);
可变参数(...):用到函数上,当要操作的同一个类型元素个数不确定的时候,可以用这个方式,这个参数可以接受任意个数的同一类型的数据。
与之前接收数组的区别:
之前定义数组类型,需要创建一个数组对象,再将这个数组对象作为参数传递给函数。现在,直接将数组中的元素作为参数传递即可。底层其实就是将这些元素进行数组的封装,而这个封装动作是在底层完成的,被隐藏了,所以简化了用户的书写,少了调用者定义数组的动作。
若在参数列表中使用可变参数,那么可变参数必须定义在参数列表结尾。