7、黑马程序员——泛型、集合框架工具类

来源:互联网 发布:日照淘宝代运营 编辑:程序博客网 时间:2024/06/07 00:35

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



7.1 泛型


泛型(Generic):是指在定义类或者接口的时候可以为类和接口指定类型形参。
没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据。所以,泛型是JDK1.5版本以后出现的新特性。用于解决安全问题,是一个类型安全机制。


通配符

1)<?>:当传入的类型不确定时,可以使用通配符?。也可以理解为占位符。
如:ArrayList<? >x = new ArrayList<Integer>();
2)<? extends E>:可接收E类型或E类型的子类型;称之为上限。
如:ArrayList<? extends Number>x = new ArrayList<Integer>();
3)<? super E>:可接收E类型或E类型的父类型;称之为下限。
如:ArrayList<? super Integer>x = new ArrayList<Number>();

这样做的好处是:
a、将运行时期出现的问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时期问题减少、安全。
b、避免了强制转换的麻烦。如在实现某一个接口时,指定传入接口方法的实参的类型的话,在复写该接口方法时就可以直接使用指定类型,而不需要强制转换。
泛型的定义原则:
通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
这样做的好处是:
a、将运行时期出现的问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时期问题减少、安全。
b、避免了强制转换的麻烦。如在实现某一个接口时,指定传入接口方法的实参的类型的话,在复写该接口方法时就可以直接使用指定类型,而不需要强制转换。




7.2 Collections工具类


Collections是对集合框架的一个工具类。它里边的方法都是静态的,不需要创建对象。并未封装特有数据。
在Collections工具类中大部分方法是用于对List集合进行操作的,如比较,二分查找,随机排序等。

Collections类常见方法:
1、查找
T max(Collection<? extends T> coll);//根据集合的自然顺序,获取coll集合中的最大元素
T max(Collection<? extends T> coll,Comparator<? super T> comp);//根据指定比较器comp的顺序,获取coll集合中的最大元素
Int binarySearch(Lsit<? extends Comparable<? super T>> list,T key);//二分法搜索list集合中的指定对象
2、替换
Void fill(List<? super T> list, T obj);//将list集合中的全部元素替换成指定对象obj
Boolean replaceAll(List<T> lsit,T oldVal,T newVal);//用newVal替换集合中的oldVal值
void swap(Listlist,int i,int j);/在指定列表的指定位置处交换元素
3排序:
void shuffle(List<?> list);//使用默认随机源对list集合中的元素进行随机排序
void sort(Lsit<T> list);//根据自然顺序对list集合中的元素进行排序
voidsort(List<T> lsit,Comparator<? super T> c);//根据指定比较器c的排序方式对list集合进行排序
4、反转
reverse(List<?> list);//反转list集合中元素的顺序
Comparator reverseOrder();//返回一个比较器,强行逆转了实现Comparable接口的对象的自然顺序
Comparator reverseOrder(Comparator<T> cmp);//返回一个比较器,强行逆转了指定比较器的顺序
5、同步的集合
List<T>synchronizedList(List<T> list);//返回支持的同步(线程安全的)List集合
Map<K,V>synchronizedList(Map<K,V> m);//返回支持的同步(线程安全的)Map集合

package day7;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class CollectionsDemo {public static void main(String[] args) {demo1();}public static void demo1(){List<String> list = new ArrayList<String>();list.add("abcde");list.add("cba");list.add("aa");list.add("zzz");list.add("cba");list.add("nbaa");//使用默认随机源对list集合中的元素进行随机排序Collections.shuffle(list);System.out.println(list);//根据自然顺序对list集合中的元素进行排序Collections.sort(list);System.out.println(list);//根据指定比较器c的排序方式对list集合进行排序Collections.sort(list, new ComparatorByLength());System.out.println(list);mySort(list, new ComparatorByLength());System.out.println(list);int index = Collections.binarySearch(list, "aaa");//-2  -index-1System.out.println("index = " + index);//获取最大值String max = Collections.max(list, new ComparatorByLength());System.out.println("max = "+ max);//替换Collections.replaceAll(list, "cba", "nba");System.out.println(list);}public static <T> void mySort(List<T> list, Comparator<? super T> comp){for(int i = 0; i < list.size()-1; i++){for(int j = i + 1; j < list.size(); j++){if(comp.compare(list.get(i),list.get(j)) > 0){Collections.swap(list, i, j);}}}}}class ComparatorByLength implements Comparator<String>{public int compare(String o1, String o2){int temp = o1.length() - o2.length();return temp == 0 ? o1.compareTo(o2) : temp;}}





7.3 Arrays工具类


Arrays:是用于操作数组的工具类。里边的方法也全是静态的。不需要创建对象。

Arrays常见方法:
1、Lsit<T> asList(T... a);//将数组转换为集合
好处:可以使用集合的思想和方法来操作数组中的元素。如:contains,get,indexOf,subList等方法。
注意:
a、将数组转换成集合,不可使用集合的增删方法,因为数组的长度是固定的。如果进行增删操作,则会产生UnsupportedOperationException的编译异常。
b、如果数组中的元素都是对象,则变成集合时,数组中的元素就直接转为集合中的元素。
c、如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
2、String toString();//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。
package day7;import java.util.Arrays;import java.util.List;public class ArraysDemo {public static void main(String[] args) {String[] arr = {"aaa","bbb", "ccc", "ddd"};//将数组转换为集合List<String> list = Arrays.asList(arr);boolean b = list.contains("ccc");System.out.println(b);int[] arr1 = {31, 11, 51, 61};List<int[]> list1 = Arrays.asList(arr1);System.out.println(list1);Integer[] arr2 = {31, 11, 51, 61};List list2 = Arrays.asList(arr2);System.out.println(list2);//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。System.out.println(Arrays.toString(arr));}}


集合转数组:

使用的就是Collection接口中的toArray方法。
集合转成数组,可以对集合中的元素操作方法进行限定,不允许对其进行增删。
toArray方法需要传入一个指定类型的数组。
指定类型的数组长度定义原则:
如果数组长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
如果数组长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其它位置默认为null。
所以建议,创建一个数组长度为集合的size最优。
package day7;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class ToArray {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("abc1");list.add("abc2");list.add("abc3");String[] arr = list.toArray(new String[list.size()]);System.out.println(Arrays.toString(arr));}}





------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



0 0
原创粉丝点击