1. 集合简介
1.1 什么是集合
1、 集合是Java API所提供的一系列类,可以用于动态存放多个对象。--集合只能存对象
2、 集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以放基本数据类型的包装类)
3、 集合类使用初始容量和加载因子调整自己的大小。
4、 集合类全部支持泛型,是一种数据安全的用法。
1.2 集合框架图
Java的集合框架从整体上可以分为两大家族。
1、 Collection(接口)家族。该接口下的所有子孙均存储的是单一对象。
2、 Map(接口)家族。该接口下的所有子孙均存储的是key-value(键值对)形式的数据。
另外还有三个分支,均是为上述两大家族服务的。
1、 Iterator(迭代器)家族。主要用于遍历Colleciton接口的及其子类而设计。
2、 Compaator(比较器), 在集合中存储对象时候,用于对象之间的比较
3、 Collecitons是工具类。注意该类名带个s,一般就表示工具类。里面提供了N多静态方法,来对Colleciton集合进行操作。
2. Collection接口
2.1 Collection概述
Collection接口-定义了存取对象的方法。两个非常常用的子接口:
List接口:存放的元素有序且允许有重复的集合接口。
Set接口:存放的元素无序不包含重复的集合接口,所有的重复内容是靠hashCode()和euqals()两个方法区分的。
说明:
“元素”-对象,实例
“重复”-两个对象通过equals相等。
“有序”-元素存入的顺序与取出的顺序相同。
2.2 Collection的常用方法
1、 int size(); 返回此collection中的元素数。
2、 boolean isEmpty(); 判断此collection中是否包含元素。
3、 boolean contains(Object obj); 判断此collection是否包含指定的元素。
4、 boolean contains(Collection c); 判断此collection是否包含指定collection中的所有元素。
5、 boolean add(Object element); 向此collection中添加元素。
6、 boolean addAll(Collection c);将指定collection中的所有元素添加到此collection中
7、 boolean remove(Object element); 从此collection中移除指定的元素。
8、 boolean removeAll(Collection c); 移除此collection中那些也包含在指定collection中的所有元素。
9、 void clear(); 移除些collection中所有的元素。
10、boolean retainAll(Collectionc); 仅保留此collection中那些也包含在指定collection的元素。
11、Iterator iterator(); 返回在此collection的元素上进行迭代的迭代器。
12、Object[]toArray();把此collection转成数组。
3. List接口
3.1 接口概述
1、 实现List接口的集合类中的元素是有序的,且允许重复。
2、 List集合中的元素都对应一个整数型的序号记载其在集合中的位置,可以根据序号存取集合中的元素。
JDK API所提供的List集合类常用的有:
ArrayList(重点,必须掌握)
LinkedList
Vector(并不常用,了解)
3.2 List常用方法
见如下代码:
package cn.sz.gl.test01;
import java.util.ArrayList;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
System.out.println("集合长度:"+list.size());
//list.clear();//清空集合中的所有数据
System.out.println("调用clear方法后,集合长度:"+list.size());
boolean flag = list.contains("lisis");//判断集合中是否包含指定的数据
System.out.println("判断集合中是否包含指定的数据:"+flag);
int index = list.indexOf("wangwu");//用来获取元素保存在list集合中的索引号
System.out.println("获取指定数据的索引号:"+index);
boolean isempty = list.isEmpty();
System.out.println("判断集合是否有元素:"+isempty);
int index2 = list.lastIndexOf("wangwu");
System.out.println("从后往前查找指定的元素,并返回元素的索引号:"+index2);
Object obj = list.remove(2);//用来删除指定位置的元素, 并返回该已经删除的元素
System.out.println("删除第2位的数据后,集合的长度:"+list.size());
System.out.println("删除的元素是:"+obj);
boolean isRemove = list.remove("lisi");//删除指定的元素,并返回是否删除成功
System.out.println("删除lisi后,集合的长度:"+list.size());
System.out.println("删除lisi后,返回值是:"+isRemove);
list.set(0, "zhangsans");//修改指定位置的元素
System.out.println("集合长度:"+list.size());
System.out.println("set之后,元素内容:"+list.get(0));
list.add("111");
list.add("222");
list.add("333");
list.add("xxxx");
list.add("yyyy");
list.add("zzz");
List list2 = list.subList(2, 5);//获取原list集合中的某一部分元素(获取子集),这里包含第2个,但不包含第5个
for (int i = 0; i < list2.size(); i++) {
System.out.print(list2.get(i)+"\t");
}
System.out.println();
System.out.println("***************************************");
Object os [] = list.toArray();//把集合转变为一个数组
for (int i = 0; i < os.length; i++) {
System.out.print(os[i]+",");
}
}
}
3.3 ArrayList和LinkedList的区别
ArrayList LinkedList 底层封装数组实现,分配的是一块连续的内存空间 底层封装链表实现,分配的是不连续的内存空间 读取数据效率更高 读取数据效率相对较低 增,删等操作效率相对偏低 增,删等操作效率高 相对于ArrayList,多了对于首元素和尾元素的操作
3.4 Vector与ArrayList的区别
Vector是jdk1.0出现的,老版本java使用的集合,注重安全,是线程安全的;
ArrayList是jdk1.2之后使用,注重性能,是非线程安全的.
当长度扩充时,Vector直接扩充一倍,而ArrayList是扩充50%
ArrayList默认长度为10个,当存满10个时,长度会自动扩充50%
4. Iterator(迭代器)接口
4.1 Iterator概述
由于集合中存有很多元素,很多时候需要遍历集合中的所有元素,java专门为集合提供了遍历集合的API:迭代器接口
Iterator是专门的迭代输出接口。所谓的迭代输出就是将元素进行判断,判断是否有内容,如果有内容则把内容取出。
Iterator对象称作迭代器,用以方便的实现对集合内元素的遍历操作。
4.2 获得Iterator对象
调用集合对象的iterator()方法,可以获得一个与该集合对象关联的迭代器对象。
例如:
List list = new ArrayList<>();
Iteratoriterator = list.iterator(); //获得Iterator对象
4.3 Iterator的常用方法
Iterator定义如下三个方法:
boolean hasNext(); //判断游标右边是否有元素。如果有返回true,否则false
Object next() ; //返回游标右边的元素并将游标移动到下一个位置
void remove(); //删除游标左面的元素(即next的时候跳过的对象)
注意:迭代方向是单向的,只能从前朝后(Iterator有个专为list集合设计的子接口ListIterator可以实现双向迭代)。
示例代码如下:
package cn.sz.gl.no1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestIterator {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("abc");
list.add("bcd");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {// 判断后面是否还有元素
String string = iterator.next(); // 获得下一个元素
System.out.println(string);
}
}
}
注意:在用迭代器遍历集合的时候,如果要删除集合中的元素,只能调用迭代器的remove(),禁止调用集合对象的rmove()方法,否则有可能会出现异常:
java.util.ConcurrentModificationException。//并发访问异常