黑马程序员 + 第17天 Collections类和Arrays类

来源:互联网 发布:冒泡排序算法 编辑:程序博客网 时间:2024/05/16 01:34

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


day17

1、Collections常用方法(静态):集合框架的工具类,里面定义的都是静态方法。可以List排序,不可以对Set排序,因为有TreeSet

CollectionCollections有什么区别?

Collection是集合框架中的一个顶层接口。它里面定义了单列集合的共性方法。它有两个常用的子接口,List(对元素都有定义索引,元素有序且可以重复),Set(元素不可重复且无序)。

Collections是集合框架中的一个工具类。该类中的方法都是静态的,提供的方法可以对List集合进行排序,二分查找等操作。通常常用的集合都是线程不安全的(因为要提高效率)。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合转换成安全的。

static <T extends Comparable<? super T>> void sort(List<T> list) 

static <T> void sort(List<T> list, Comparator<? super T> c) 

static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 

static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) 

static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)  

static <T> void fill(List<? super T> list, T obj) :使用指定元素替换指定列表中的所有元素。

static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) 

static void reverse(List<?> list) 

static <T> Comparator<T> reverseOrder():返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。

static <T> Comparator<T> reverseOrder(Comparator<T> cmp) :返回一个比较器,它强行逆转指定比较器的顺序。

static <T> List<T> synchronizedList(List<T> list):返回指定列表支持的同步(线程安全的)列表。 

static void swap(List<?> list, int i, int j):在指定列表的指定位置处交换元素。 

static void shuffle(List<?> list):使用默认随机源对指定列表进行置换。

参见:CollectionsDemo.java CollectionsDemo2.java

2、Arrays常用方法(静态):Arrays:用于操作数组的工具类,里面都是静态方法。

static int[] copyOf(int[] original, int newLength):复制指定的数组,截取或用 填充(如有必要),以使副本具有指定的长度。

static int[] copyOfRange(int[] original, int from, int to):将指定数组的指定范围复制到一个新数组。

static boolean deepEquals(Object[] a1, Object[] a2):如果两个指定数组彼此是深层相等 的,则返回 true

static boolean equals(int[] a, int[] a2):如果两个指定的 int 型数组彼此相等,则返回 true。 

static void fill(int[] a, int fromIndex, int toIndex, int val):将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。 

static int hashCode(int[] a):基于指定数组的内容返回哈希码。

static void sort(int[] a, int fromIndex, int toIndex):对指定 int 型数组的指定范围按数字升序进行排序。

static String toString(int[] a):返回指定数组内容的字符串表示形式。

3、static <T> List<T> asList(T... a):返回一个受指定数组支持的固定大小的列表。 

asList将数组变成list集合。 参见:CollectionToArray.java

数组变成list集合的好处:可以使用集合的思想和方法来操作数组中的元素。

注意

1将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。

可以进行的操作有:contains,get,indexOf(),subList();如果进行增删操作那么会反生UnsupportedOperationException

2如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

4、集合变数组:Collection接口中的toArray方法。  参见:CollectionToArray.java

1,指定类型的数组到底要定义多长呢?

当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大于了集合的size,就不会再新创建数组,而是使用传递进来的数组。所以创建一个刚刚好的数组最优。

2,为什么要将集合变数组?为了限定对元素的操作。不需要进行增删操作了。

5、List取出元素方式有两种:一个是Iterator迭代器,另一个是for循环,结合它特有的get方法。而Set只有一种取出元素的方式,即Iterator迭代器。

6、JDK1.5新特性:增强for循环foreach输出Collectionjdk1.5之后出现的父接口Iterator提供的。

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

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

迭代器除了遍历,还可以进行remove集合中元素的动作。如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。

传统for和高级for有什么区别呢

高级for有一个局限性:必须要有被遍历的目标。建议在遍历数组的时候使用传统for。因为传统for可以定义脚标。

7、遍历Map集合。HashMap集合的高级For循环: 参见ForEachDemo.java

HashMap<Integer,String> hm = new HashMap<Integer,String>();

hm.put(1,"a");

hm.put(2,"b");

hm.put(3,"c");

Set<Integer> keySet = hm.keySet();

for(Integer i : keySet)  //键值

{

System.out.println(i+"::"+hm.get(i));

}

// Set<Map.Entry<Integer,String>> entrySet = hm.entrySet();

// for(Map.Entry<Integer,String> me : entrySet)

for(Map.Entry<Integer,String> me : hm.entrySet())  //映射关系

{

System.out.println(me.getKey()+"------"+me.getValue());

}

Set中存什么类型,for遍历时就写什么

8JDK1.5版本出现的新特性

方法的可变参数,在使用时注意:可变参数一定要定义在参数列表最后面

隐式将要操作的元素作为参数传递,封装成了数组。 参见:ParamMethodDemo.java

public static void main(String[] args)

{ show("haha",2,3,4,5,6); }

public static void show(String str,int... arr)

{ System.out.println(arr.length); }

9StaticImport  静态导入

当类名重名时,需要指定具体的包名。

当方法重名,需要指定具备所属的对象或者类。

import java.util.*;  //导入util包中的所有类

import static java.util.Arrays.*;  //导入Arrays类中的所有静态成员

import static java.util.Collections.*;

import static java.lang.System.*;  //导入System类中所有静态成员