0、Java集合框架概述
集合可以将多个对象的引用动态放入容器中,方便对对象进行一些操作。现有的用来存放多个对象的结构为Array数组,但数组存在一些弊端:
①数组初始化之后,长度不可以进行改变,不便于扩展
②数组中提供的方法和属性少,不便于进行添加、删除、插入等操作,且效率不高,同时无法直接获取存储元素的个数
③数组存储的数据是有序的可以重复的
而java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
Java集合体系
Collection接口:单列数据,定义了存取一组对象的方法的集合
-------------|List接口:元素有序、可重复的集合 类似一个“动态”数组
------------------------|ArryaList类:是List接口的主要实现类;线程不安全,效率高;底层使用Object[ ]数组
------------------------|LinkedList类:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表
------------------------|Vector类:作为List接口的古老实现类;线程安全,效率低;底层使用Object[ ]数组
-------------|Set接口:元素无序、不可重复的集合 更接近于高中所讲的“集合”概念
------------------------|HashSet类:作为Set接口的主要实现类;线程不安全的;可以存储null值
------------------------------------|LinkedHashSet类:作为HashSet的子类,遍历器内部数据时,可以按照添加时的顺序遍历
------------------------|TreeSet类:可以按照添加对象的指定属性进行排序
Map接口:双列数据,保存具有映射关系“key-value”对的集合 类似于数学上的y=f(x)
-------------|Hashtable类:作为古老的实现类,线程安全,效率低,不能存储null的key和value
------------------------|Properties类:常用来处理文件,key和value都是String类型的
-------------|HashMap类:是Map的主要实现类,线程不安全的,效率高;可以存储null的key和value
------------------------|LinkedHashMap类:保证在遍历map元素时,可以按照添加的顺序进行遍历(在原有结构的基础上,按照添加顺序使用了双链表)
-------------|TreeMap类:按照添加的key-value对进行排序,实现排序遍历(key的自然排序和定制排序)
Collection接口继承树
Map接口继承树
1.Collection接口
1.1 Collection接口中的常用方法
使用Iterator接口遍历集合元素
Collections接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前
@Test
public void test1(){
Collection col=new ArrayList();
col.add("aaaa");
col.add("bbbb");
col.add("vv");
col.add("wweeeee");
Iterator iterator = col.iterator();
while(iterator.hasNext()){ //判断是否还有下一个元素
//next():指针下移,将下移后集合位置上的元素返回
System.out.println(iterator.next());
}
}
使用foreach遍历数组元素
底层仍然是调用Iterator完成操作,但注意用来修改数组元素是无用的
@Test
public void test1(){
Collection col=new ArrayList();
col.add("aaaa");
col.add("bbbb");
col.add("vv");
col.add("wweeeee");
Iterator iterator = col.iterator();
while(iterator.hasNext()){ //判断是否还有下一个元素
//next():指针下移,将下移后集合位置上的元素返回
System.out.println(iterator.next());
}
//注意此处一定要重新获取
iterator=col.iterator();
while(iterator.hasNext()){ //判断是否还有下一个元素
//next():指针下移,将下移后集合位置上的元素返回
Object str=iterator.next();
if (str.equals("vv"))
iterator.remove(); //使用iterator删除集合中的元素
}
//使用foreach循环遍历集合元素
for(Object str:col){
System.out.println(str);
}
}
add(Object e) 添加元素
size() 集合中的元素个数
addAll(Collection col) 将集合中的元素全部添加到当前集合中
isEmpty()
boolean remove(Object obj) 通过元素的equals方法判断是否是要删除的那个元素,只会删除找到的第一个元素
boolean removeAll(Collection col) 取当前集合的差集
boolean retainAll(Collection col) 把交集的结果存在当前集合中,不影响c
boolean equals(Object o)判断集合是否相等
Object[] toArray()转换成对象数组
hashCode()获取当前集合对象 的哈希值
扩展:数组变成集合 Arrays.asList(array)
1.2 List接口中的方法
java中使用数组存储数据具有局限性(如上所述),所以通常使用List代替数组。List集合类中元素有序、可重复,集合中的每个元素都有其对应的顺序索引,可以根据元素的存储位置序号存取容器中的元素。List中的常用实现类有:ArrayList、LinkedList、Vector
List接口:元素有序、可重复的集合 类似一个“动态”数组
-------|ArryaList类:是List接口的主要实现类;