黑马程序员__集合中的两个工具类以及一些新特新

时间:2023-02-19 13:56:05

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

 

collections工具类
是一个专门用于对集合进行操作的攻击类,类中都是静态方法,可以自动用类名调用。
sort中的参数是List集合,用于给List集合进行相关排序,不能对set集合进行操作。默认按升序排序,重复元素也能排序,List是数组结构可以存储重复元素(有索引)。如果不用默认的那就得传入比较器进行比较,也就是采用下面的Sort方法。
static <T> void  sort(List<T> list, Comparator<? super T> c)
以上方法中Comparator做了泛型限定,在自定义比较器类实现该Comparator接口时,可以是Sort的List参数的T的类型或者是其父类型
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

这个max函数的理解是:T必须是Object类的子类对象,并且Comparable中只能传入T或者T的父类,并且所要取最大值的集合中只能传入T或者是T的子类,而且返回一个T类型。
max的重载函数可以加入一个比较器:
public static <T> T max(Collection<? extends T> coll,
                        Comparator<? super T> comp)


public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)返回的是Key在集合中的位置(角标)。如果找不到则返回(-(插入点) - 1)
此方法的原理就是前面学习过的二叉查找法。然后返回的是那个-min-1
而min之所以称作插入点,是因为当所要找的元素不存在时,可以在min上插入。
static <T> Comparator<T> reverseOrder()
此方法的使用必须要先让元素具备比较性。所以首先应该知道集合是否具备比较性。
static <T> Comparator<T> reverseOrder(Comparator<T> cmp)将比较器强行逆转。(都是静态方法) 

记住:comparable里面的方法叫做compareTo,此方法一般是容器中需要存放的元素自身去实现comparable接口并复写compareTo方法。
而comparator接口则一般用于需要传入此比较器的方法或者容器的构造函数。实现此接口必须得创建一个能够实现此接口并复写该接口中的compare方法的类,也叫做比较器。
static <T> List<T> synchronizedList(List<T> list)
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
 static <T> Set<T> synchronizedSet(Set<T> s)
都是用于返回一个线程安全的另一个集合。可以看看源码。源码中覆盖list中的各种方法,比如说添加,删除等等加上同步锁就行。
 
static void swap(List<?> list, int i, int j)   用于任意两个元素换位置。
static void shuffle(List<?> list) 将集合中的元素重新按照随机的顺序进行排放。
static void shuffle(List<?> list, Random rnd)  指定随机源。

arrays
里面都是静态方法,
static <T> List<T> asList(T... a) (可变参数)
asList方法返回一个List集合
数组转换成List集合的好处是,可以用List中的方法对数组中的元素进行操作。注意一点的是,不能使用List中的增删操作,如果使用会抛出运行时异常。因为数组的长度是固定的。
字符串数组变成集合时能够打印,而int类型数组如果要转成List集合
总结:如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转换成集合中的元素,如果数组中的元素都是基本数据类型,那么就将数组作为集合中的元素存在。

Collection方法中有一个toarray方法用于将集合转换成数组。
 Object[] toArray()  返回包含此 collection 中所有元素的数组。
<T> T[] toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size.
当指定类型的数组长度大于了集合的size,就不会新创建数组,而是使用传递进来的数组。
为何要将集合变成数组?
为了限定对元素的操作。因为对容器的操作都做完了,所以可以将它变为一个数组。
 
增强for循环
Iterable接口将itrator迭代方法单独提取,用于增强集合框架的扩展性。
for(数据类型 变量名:被遍历的集合(collection或者数组))
例子:

ArrayLsit<String> al=new ArrayList<String>();
al.add("123")

for(String s:al){
s="kk"
system.out.println(s);//s第一次指向al的一个元素,以后顺延。
//
}
只能用于获取,不能对元素进行操作,而迭代器中除了遍历还能remove集合中元素的动作。迭代完,集合可以改变。如上述代码添s="kk"是不会改变集合中内容的。如果迭代器是ListIterator,还可以做更多动作。


增强for循环与传统的for循环的区别是,增强for循环有一个局限性是必须有被遍历的目标。建议在遍历数组时希望使用传统for,因为传统for可以定义角标。
注意for中的String这个必须根据集合指定的泛型,如果没有指定,需写Object。

 

1.5版本新特性。

可变参数
public static void show(int...arr){

}

此时可以这样调用show方法
show(2,3,6,7,2,9,4)
//隐示封装数组,简化代码。也可以不传参数。
asList方法就是可变参数。
使用时应注意:可变参数一定要定义在参数列表的最后面。

静态导入

import static java.util.类名.*
当类名重名时,需要指定具体的包名
当方法重名时,指定具备所属方法的对象或者类。

import static java.lang.system.*//导入了system类中的所有静态成员。
可以省略system关键字。