JAVA基础复习(六)泛型和集合

1、泛型的优点是能在编译时检测出错误,一旦编译器认为泛型类型是安全使用的,就会将它转换为原始类型,泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型

2、泛型类型必须是引用类型,不能使用int、double等基本类型来替代泛型集合

3、泛型集合类的构造方法和普通类相同,定义一个泛型类需要将泛型类型放在类名之后,定义一个泛型方法需要将泛型类型放在方法之前

4、调用泛型方法,需要将实际类型放在尖括号内作为方法名的前缀,如

ClassDemo.<String>methodDemo(strings);

5、非受限泛型类型<E>和<E extends Object>是一样的

6、通配泛型包括三类形式:?(非受限泛型类型)、?extends T 或者? super T(受限泛型),其中T是某个泛型类型

7、不能使用泛型类型参数创建实例,不能使用泛型类型参数创建数组,不能使用泛型类创建数组,但是可以使用如下方法分别规避:

​
E[] elements=(E[])new Object[capacity];//将导致免检的编译警告

ArrayList<String>[] list=(ArrayList<String>[])new ArrayList[10];

 8、在静态方法、数据域或者初始化语句、静态代码块中,为了类而引用泛型类型参数是非法的

9、异常类不能使用泛型类型参数

10、Java集合框架支持两种类型的容器:一种是为了存储一个元素集合,简称为集合;另一种是为了存储键值对,称为图。

Java集合框架支持三种主要类型的集合:规则集(Set:不重复)、线性表(List:有序)和队列(Queue:先进先出)。

图中不能有重复的键值,有三种类型:散列图HashMap、链式散列图LinkedHashMap和树形图TreeMap。

11、Collection接口是处理对象集合的根接口【add()、addAll()类似规则集的并、clear()、contains()、containsAll()类似规则集的交、equals()、hashCode()、isEmpty()、itreator()、remove()、removeAll()类似规则集的差、retainAll()、size()、toArray()】,AbstractCollection类除了size()和iterator()之外,实现了Collection的所有方法。Iterator接口【hasNext()、next()、remove()】提供了对不同类型集合的元素进行遍历的统一方法,只能使用迭代器进行集合删除操作,其他操作会出现不稳定的异常情况,尤其是在并发编程中,注意事项可以参考其他大佬的文章http://blog.csdn.net/izard999/article/details/6708738

for(Iterator it = list.iterator(); it.hasNext;) {
    Object o = it.next();
}

12、HashSet类是一个用于实现Set接口的具体类,默认情况下初始容量为16而客座率为75%,也可以在构造方法中指定初始容量和客座率,考虑到效率因素,添加到散列集中的对象必须以一种正确分散散列码的方式来实现hashCode方法,两个不相等的对象可能有相同的散列码(哈希冲突),应该在实现hashCode方法时尽量避免这种情况。如果不需要维护元素被插入的顺序,应该使用HashSet,它会比LinkedHashSet更加高效;当需要一个排好序的集合时,可以从这个散列集创建一个树形集。

13、SortedSet【first()、last()返回规则集第一个和最后一个元素、headSet()、tailSet()返回规则集中元素小于或者不小于的那一部分】是Set的一个子接口,它可以确保元素是有序的。NavigableSet拓展了SortedSet,并提供导航方法lower()小于、floor()小于或等于、ceiling()大于或等于、higher()大于、pollFirst()删除和返回树形集的第一个元素、pollLast()同前最后一个元素。TreeSet实现了SortedSet接口的一个具体类

14、比较器接口Comparator定义及使用如:(用于比较没有实现Comparable类的对象)

class MyComparator implements Comparator{
   @Override
   public int compare(xx, xx) {
    ...
   }
}

15、线性表中List接口【add()、addAll()、get()、indexOf()、lastIndexOf()、listIterator()、remove()、set()、subList()】拓展了Collection接口,但是增加了面向位置的接口和增加了一个能够双向遍历线性表的新列表迭代器。ArrayList是一个动态数组,适合提取元素或在线性表的尾部插入和删除元素,LinkedList适合在任意位置上插入和删除元素【为了从泛型类型的可变长参数表创建线性表,Java提供了静态的asList方法,如:List<String> list=Arrays.asList(...);】。可以用TreeSet在规则集中存储有序的元素,但是线性表不支持有序存储,但是Collections类中提供了对于线性表进行排序的静态方法【Collections.sort(list);】,还有其他静态方法,如binarySearch二分查找list、reverse颠倒list、shuffle打乱指定list、copy将源列表复制给指定目标列表、fill用对象填充列表、disjoint如果两个集合没有公共元素则返回true、frequency返回集合指定元素的出现次数

16、除了包含用于访问和修改向量的同步方法之外,向量类Vector类与ArrayLsit一样,可防止两个或多个线程同时访问某个向量时引起数据损坏也可实现可表大变小的数组,但是不需要同步还是使用ArrayList效率更高。

17、LinkedList类实现了Dwque(双端队列)接口,Deque又拓展了Queue接口,PriorityQueue类实现了一个优先队列,默认情况下,优先队列使用Comparable以元素的自然顺序排序,拥有最小数值的元素被赋予最高优先值。如:

Java.util.Queue<String> queue=new Java.util.LinkedList<String>();//使用LinkedList方法创建队列
PriorityQueue<String> queue=new PriorityQueue<String>();//创建优先队列

18、Map接口提供了查询、更新和获取集合的值和键值的方法,更新方法包括clear删除所有条目、put将一个值和图中的一个键值相关联、putAll指定图添加到这个图和remove将指定键对应的图元素从图中删除,查询方法包括containsValue检测图中是否包含指定键值的映射、isEmpty、size、keySet、entrySet。对于定位一个值、插入删除一个映射,使用HashMap类是高效的,随机(Hashtable类似,但是具有同步功能);TreeMap类在遍历排好序的键值时是高效的,键值可以使用Comparable接口或者Comparator接口来排序,按键值升序;LinkedHashMap按最后一次访问的时间从早到晚排序

猜你喜欢

转载自blog.csdn.net/qq_37575994/article/details/83450555