Java学习日记17——集合、泛型
分类
Collection接口:两个子接口
List:记录元素的保存顺序,且可以有重复的元素
Set:不保存记录元素的顺序,且没有重复的元素
Map接口:即映射,键-值对的集合
collection接口的方法:
add();//添加元素,返回布尔
remove();//删除元素,返回布尔
size();//获得大小,返回int
isEmpty();//判断是否为空,返回布尔
contains();//判断是否包含某个元素,返回布尔
iterator();//遍历,返回iterator
list接口:线性表
主要实现类是ArrayList和LinkedList,以及早期的Vector,相对于前面collection父类而言,包含的方法包括:
List<Integer> list = new ArrayList<>();//定义新列表,尖括号表示列表类型,后一个尖括号可以省略
get(index);
set(index,element);
add(index,element)
remove(index);
indexOf(object o);
Iterator迭代器,所有的collection都可以产生,Java1.5以后很多实用增强for循环来实现。举个例子:
for(Photo photo :album){//元素类型 元素名:遍历的列表名
System.out.println(photo.toString());//对每个元素名的操作
}
栈Stack:先进后出
栈中包含的三个方法分别是:
public Object push(Object item);//将指定元素圧入栈中
public Object pop();//将栈最上面的元素取出,并且返回对象
public boolean empty();//判断是否为空
举个例子:
Stack<Integer> q = new Stack<>();
for (int i = 0;i<5;i++)
q.push(i);
while(! q.isEmpty())
System.out.println(q.pop());
输出结果:
4
3
2
1
0
队列Queue:先进先出
queue的重要实现是LinkedList类,方法:
方法 | 可抛出异常的 | 返回元素的 |
---|---|---|
insert():插入 | add() | offer() |
Remove():移除 | remove() | poll():取出 |
Examine():检查 | element() | peek() |
举个例子:
Queue<Integer> q = new LinkedList<>();
for (int i = 0;i<5;i++)
q.offer(i);
while(! q.isEmpty())
System.out.println(q.poll());
输出结果:
0
1
2
3
4
其他类和接口
Vector 现在多用ArrayList:相当于动态数组
Stack 现在多用LinkedList:Stack是Vector的子类
Hashtable 现在多用HashMap:用Hashtable实现Map接口
Enumeration 现在多用Iterator
Set和Map
Set集:两个重要的实现HashSet和TreeSet,其中TreeSet底层是TreeMap实现,Set中对象不重复。常用的方法有add(),和contain()。
Map:map是键-值对的集合,主要实现类是HashMap和TreeMap类(红黑树算法实现),常用的方法put()放入键值对,get(key)得到value,entrySet(),KeySet(),values()。Map.Entry是一个嵌套接口。
排序和查找
对于排序,Java中已经集成了相关的排序方法,可以直接使用,当然你也可以自己写。
Array类
array类提供了sort()排序和binarySearch()二分法查找方法。在查找前应该先调用sort进行排序。
String[] s = new String[]{"aslc","nwei", "65dk","dskj"};
Arrays.<String>sort(s);
for (String i:s
) {
System.out.println(i);
}
执行结果是:
65dk
aslc
dskj
nwei
比较
java.lang.Comparable实现方法是:public int compareTo(Object obj)
java.lang.Comparator实现方法是:public int compare(T o1,T o2);
Collection类
同样也有sort和binarySearch()方法,还有reverse()反转方法。
泛型
使用泛型可以针对不同的类有相同的处理方式。在有泛型的情况下类型更安全,能确保内部类型都一致。而且使用更广泛,针对不同的类可以有相同的处理方式。用<…>来表示,中间可以是各种数据类型。例如 List<.String> s= new List<>()。
泛型可以针对类,也可以是针对方法的,针对类时放在后面,而针对方法时放在方法前面。
对于类型的限定:
使用 ?:在collection中的reverse方法,reverse(List<?>list),问号这里指代任意类型。
使用 extends:在set里面的addAll方法,addAll(collection<? extends E>col)
使用 super:在collection中的fill方法,fill(List<? super T>T obj)。可以理解为在水果类列表中可以添加苹果香蕉。