Collections工具类
? Collections既然说明是工具类了,那么它就有他自己独特的作用。Collections 是为了方便使用集合而产生的工具类,Arrays 方便数组使用,Collections 是方便集合使用,可以直接调用Collections 里面的静态方法来对集合进行多种数据操作。
Collections可以直接对List、Map、Set等集合使用,下面是跟中Collections方法:
1、对于顺序的List容器,采用折半查找的方法查找特定对象:int binarySearch(List, Object)
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(456);
list1.add(789);
list1.add(123);
int i = Collections.binarySearch(list1, 789); //使用二分查询法
System.out.println(i);
2、对List容器内的元素进行随机排列:void shuffle(List)
Collections.shuffle(list1); //随机位置排序
System.out.println(list1); //随机位置
3、对List容器内的元素排序,排序的规则是按照升序进行排序:void sort(List)
Collections.sort(list1); //进行升序排序
System.out.println(list1); //[123, 456, 789]
4、对List容器内的元素进行逆续排列 :void reverse(List)
Collections.reverse(list1); //进行逆序排序
System.out.println(list1); //[789, 456, 123]
5、用一个特定的对象重写整个List容器:void fill(List, Object)
Collections.fill(list1,666); //将指定数据填满list集合
System.out.println(list1); //[666, 666, 666]
6、
public static <T> boolean addAll(Collection<? super T> c, T… elements)
向指定的集合c中加入特定的一些元素elements:
ArrayList<String> list2 = new ArrayList<>();
list2.add("abc");
list2.add("ABC");
list2.add("def");
list2.add("VVV");
System.out.println(list2);
Collections.addAll(list2,"aaa","bbb","ccc"); //向list添加指定的数据
System.out.println(list2); //[abc, ABC, def, VVV, aaa, bbb, ccc]
7、
public static <T> void copy(List<? super T> dest, List<? extends T> src)
将所有元素从一个列表复制到另外一个列表去:
注意:目标列表中的每个复制元素索引将于源列表中的所有相同。目标列至少跟源列表一样长。
ArrayList<String> list3 = new ArrayList<>();
list3.add("123");
list3.add("666");
list3.add("156");
System.out.println(list3);
Collections.copy(list2,list3); //将list3全部复制到list2中
System.out.println(list2); //[123, 666, 156, VVV, aaa, bbb, ccc]
Generics泛型:
所有的集合类再没先声明定义其数据类型时,都默认为Object类型,而需要自定义其他类型,就需要泛型了。
泛型:所谓泛型,就是允许再定义类,接口时通过一个标识符表示类中的某个属性的类型或者是某个方法的返回值及参数类型。这个数据类型参数将在使用时(如:继承、实现、声明变量、创建对象是确定)。
泛型可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下:
以下的定义,给了ArrayLIst集合定义了为String类型的集合,里面添加修改的数据都只能是String类型,不能是其他的。
接下来是泛型几种使用情况:泛型E像一个占位符一样表示“未知的某个数据类型”,我们在真正调用的时候传入这个“数据类型”。
1、自定义集合Map的数据类型:(数据类型不能使用基本数据类型,只能使用包装类):
ArrayList<String> list = new ArrayList<String>();
Map<String,Integer> map = new HashMap<String,Integer>();
2、自定义泛型类:
public class Genpy<T> { //定义了Genpy类的泛型为String后,下面的orderT也随之为String类型
String name;
int age;
T orderT; //自定义泛型类型的数据与类的类型等同
}
3、定义泛型方法:
public <E> List<E> test(E[] e) { //自定义泛型方法
ArrayList<E> list = new ArrayList<>();
for (E i : e) {
list.add(i);
}
return list;
}
public <E> E test1() { //自定义泛型方法
return null;
}
public <T> void test2(List<T> t) {
}
4、泛型通配符使用:
有些集合里面不知道存在什么数据类型,所有就不能先直接定义好类型;所以这时候就可以用到通配符了。
List<? extends Number> //List集合装载的元素只能是Number的子类或自身
public static void test(List<? extends Number> list) {}
<? super Type> //传递进来的只能是Type或Type的父类
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public void print(List<?> list) { //通配符?
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
public static void test(List<?> list) { } //可以为static
5、有限制条件的通配符的使用:
? extends A:
G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类。
? super A:
G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类。
最后,建议再使用集合类的时候最好使用泛型定义好数据类型,虽然说编译器不会出错,但是这种方法必须要掌握。
原文:https://www.cnblogs.com/vxzx/p/14635509.html