集合框架
【概述】
-
为什么会出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了对多个对象进行操作,就对对象进行存储,集合是存储对象最常用的一种方式。
-
数组和集合都是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;而集合的长度是可变的
数组可以存储基本数据类型,集合只能存储对象
数组存储的数据类型必须都一样,而集合存储的数据类型可以不同
-
集合类的特点?
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
【集合框架的构成及分类】
【集合框架中的常用接口】
Collection接口有两个子接口:List(列表) Set(集)
-List:可存放重复元素,元素存取是有序的
-Set:不可以存放重复元素,元素存取是无序的
【集合框架中的共性方法(以ArrayList加以说明)】
-
add(E e):将制定元素添加到此列表尾部 其中的参数类型是Object类型,用于接收任意类型的对象;集合中存放的都是对象的引用(地址)
-
addAll(Collection<? extends E>c):按照指定collection的迭代器所返回的元素顺序,将collection中的所有元素添加到次列表
-
clear():移除此列表中的所有元素
-
contains(Object o):判断此列表中是否包含制定元素
-
isEmpty():判断此列表是否为空,即长度是否为0
-
remove(Object o):移除此列表中首次出现的指定元素(如果存在)
-
removeAll(Collection<?extends E> c):移除此列表中那些也包含在指定Collection中的元素
-
retainsAll(Collection<? extendsE> c):只保留此列表中那些也包含在指定Collection中的元素
-
size():返回次列表的长度
-
Object[]toArray():返回包含此 collection中所有元素的数组
-
<T> T[] toArray(T[] a):返回包含此 collection中所有元素的指定数据类型数组
注意:传入指定类型的数组的长度应该定义多长呢?
当传入指定元素的数组长度小于集合的size,那么该方法内部会创建
一个新数组,长度为集合的size;当传入指定元素类型的数组长度大
于集合的size,不会创建新数组,而是使用传递进来的数组,大于集
合size的部分会被null填充;所以传递一个长度为集合size的数组
最优
例:
import java.util.*;
class CollectionToArray {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
String[] arr = new String[5];// 定义接收数组的数组变量
arr = al.toArray(arr);// 返回由集合转换的数组
sop(Arrays.toString(arr));
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
-
iterator():返回在此列表的元素上进行迭代的迭代器;利用该迭代器中的next(),hasNext()等方法可获取此列表中的元素
如:ArrayList al = new ArrayList();
Al.add(…);
…;
for(Iterator it =al.iterator();it.hasNext();)
System.out.println(it.next());
Iterator迭代器
在访问集合中的元素时,为了可以直接访问,就把这些方法定义在集合内 部,定义成内部类。每个容器的数据结构都不相同,所以具体的方法细节
也不一样,但我们可以把共性的内容抽取出来,定义成Iterator接口,即
迭代器。这些内部类都符合Iterator规则。
高级for循环
格式:for(数据类型变量名 :被遍历的集合(Collection)或数组)
高级for循环对集合进行遍历,只能集获取合中的元素,不能对集合进行
其他操作;而迭代器除了能对集合进行遍历外,还可以remove集合中的
元素,如果是ListIterator,还可以在遍历集合的过程中对集合进行增删改
查的操作
传统for和高级for有什么区别呢?
高级for有一个局限性:必须有被遍历的目标
建议在遍历数组的时候使用传统for,因为传统for可以定义角标
例:
HashMap<Integer, String> hm = new HashMap<Integer, String>();
hm.put(1, "java01");
hm.put(2, "java02");
hm.put(3, "java03");
Set<Integer> keySet = hm.keySet();
for (Integer key : keySet) {
sop("key:" + key + "\tvalue:" + hm.get(key));
}
Set<Map.Entry<Integer, String>> entrySet = hm.entrySet();
for (Map.Entry<Integer, String> me : entrySet) {
Integer key = me.getKey();
String value = me.getValue();
sop(key + "---" + value);
}