基础知识巩固四
使用泛型的主要优点是能够在编译时检测出错误
非受限泛型类型<E>和<E extends Object>是一样的
<E extends 父类>为受限泛型,必须为父类的子类型
将一个类定义成泛型:类名<泛型类型>
将一个方法定义成泛型,<E> void 方法名(E e),调用方式:类名.<泛型类型>方法名().
通配泛型:
- 无界通配符:<?>
- 上界通配符:<? extends E>
- 下界通配符:<? super E>
注意:Integer是Object的子类,但T<Integer>不是T<Object>的子类,T<Object>要转换成T<?>才可以
泛型类型的限制:
- 不能使用new E()
- 不能使用new E[],但可以通过1、E[] element = (E[])new Object[10]规避 2、ArrayList<E>[] list = (ArrayList<E>[])new ArrayList[10]规避
- 在静态环境下不允许类的参数是泛型类型
- 异常类不能是泛型
java集合框架支持以下两种类型的容器:
- 为了存储一个元素集合,简称为集合(Collection)
- 存储键/值对,成为图(map)
集合:1、规则集(set)2、线性表(List)3、队列(Queue)
集合框架中所有具体类都实现了Cloneable与Serializable接口
Collection.retainAll(c:Collection<?>)返回boolean值:保留既出现在这个集合中,也出现在指定集合中的元素
Set:不允许出现重复的元素
- 散列类HashSet:元素没有特定顺序
- 链式散列集LinkedHashSet:元素按照插入顺序排列
- 树形集TreeSet:元素按照字母顺序排列
数组线性表类:ArrayList,链表类LinkedList
ArrayList.trimToSize()可以将数组容量减小到线性表的大小
ListIterator接口扩展了Iterator接口,增加对线性表双向遍历的能力
e.g:ListIterator<Object> list = linkedList.listIterator()
list.hasNext():从前遍历
list.hasPrevious():从后遍历
Collections类中提供了用于对线性表进行排序的静态方法
Collections.sort(list)
Collections.reverse(list)
reverseOrder():以逆序对元素排序
copy方法执行的是潜伏之,复制的只是线性表中元素的引用
nCopies(int n,object o):创建一个包含指定对象的n个副本的不可变线性表
fill(List list,Object o):用指定元素替换线性表中所有元素
disjoint(collection1,collection2):如果这两个集合没有相同的元素,返回true,否则false
shuffle()打乱线性表中元素
注意:规则集在性能上要由于线性表
向量类Vector是栈类Stack的父类
Stack的方法有(相对重要的):
- peek():返回栈顶元素
- pop():返回并删除栈顶元素
- push():在栈顶增加一个新元素
Queue:
- offer():向队列中插入一个元素
- poll():获取并删除队列头,如果队列为空,返回Null
- remove():与poll相似,但队列为空会抛出异常
- peek():获取但不删除队列头,如果为空返回null
- element():获取但不删除队列头,如果为空抛出异常
双端队列Deque:
- addFirst(e) ,removeFirst();
- addLast(e) ,removeLast();
双端队列的父类是Queue,是LinkedList的父类即:Queue<----Deque<----LinkedList
图(map):1、HashMap 2、LinkedHashMap 3、TreeMap
keySet():获取一个包含图中键值的规则集
values():获得一个包含图中值的集合
entrySet():返回一个实现MapEntry<K,V>接口的对象集合
除了HashTable具有同步功能之外,它与HashMap的用法是一样的
LinkedHashMap既可按插入顺序排序,也可按最早到最晚的访问顺序排序
一个提示点:
在JDK中 Integer.intValue解释的用法是:以int类型返回该Integer的值
也可以用于int和Integer的相互转换
int---->Integer
Integer A = new Integer(3);
或
Integer A = Integer.intValue(3);
Integer---->int
Integer A = new Integer(3);
int a = A.intValue();