集合框架
12.集合框架
12.1 集合的概念
- 概念:对象的容器,存储对象的对象,可代替数值;
- 特点:容器的工具类,定义了对多个对象进行操作的常用方法;
- 位置:java.util.*;
12.2 Collection 体系集合
12.2.1 Collection体系概念图
- Collection接口:该体系结构的根接口,代表一组对象,称为“集合”;
- List接口的特点:有序、有下标、元素可重复;
- Set接口的特点:无序、无下标、元素不能重复;
12.2.2 Collection父接口
- 特点:代表一组任意类型的对象,无序、无下标;
- 方法:
boolean add(Object obj) //添加一个对象
boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中;
void clear() //清空此集合中的所有对象;
boolean contains(Object o) //检查此集合中是否包含o对象;
boolean equals(Object o) //比较此集合是否与指定对象相等;
boolean isEmpty() //判断此几个是否为空
boolean remove(Object o) //在此集合中移除o对象;
int size() //返回此集合中的元素个数;
Object[] toArray() //将此集合转换成数组;
12.3 List集合
12.3.1 List子接口
- 特点:有序、有下标、元素可以重复;
- 继承父接口提供的共性方法,同时定义了一些独有的与下标有关的操作方法;
- 方法:
void add(int index , Object o) //在index位置插入对象o;
boolean addAll(int index , Collection c) //将一个集合中的元素添加到此集合中的index位置;
Object get(int index) //返回集合中指定位置的元素;
List subList(int fromIndex , int toIndex) //返回formIndex和toIndex之间的集合元素;
12.3.2 List实现类
- ArrayList【重点】:
数组结构实现,查询快、增删慢;
JDK1.2版本,运行效率快、线程不安全;
JDK8的ArrayList,实际初始长度是0;
首次添加元素时,需要实际分配数组空间,执行数组扩容操作;
真正向数组中插入数据,(lazy懒)用的时候再创建,或再加载,有效的降低无用内存的占用;
import java.util.ArrayList;
public class TestArrayList {
public static void main(String[] args) {
ArrayList al = new ArrayList();//对象的容器,存储对象的对象
boolean result = al.add("HelloWorld");//存储到了Object[]中的下标0的元素上
System.out.println(result);
Object obj = al.get(0);//将底层Object[]中下标0的元素返回
System.out.println(obj);
}
}
输出结果:
true
HelloWorld
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class TestArrayListMethods {
public static void main(String[] args) {
//JDK7及之前, 无参构造方法直接创建长度为10的Object数组,用或不用都是是10(占内存)
//JDK8之后,无参构造方法直接创建长度为0的数组,如果不用,不占空间,当插入元素时,再分配数组空间
ArrayList al = new ArrayList();//实际的创建后的数组初始长度为0
al.add("A");//
al.add("B");
al.add("C");//顺序插入
al.add(1,"E");//按位置插入
for(int i = 0 ; i < al.size(); i++) {//访问size()有效元素个数
System.out.println(al.get(i));//get方法基于下标获取元素
}
System.out.println(al.toString());
System.out.println();
boolean removeResult = al.remove("E");
Object removeObj = al.remove(1);
System.out.println("被移除的对象:"+ removeObj);
System.out.println(al.toString());
al.set(0, "F");//根据下标替换成新元素
System.out.println(al.toString());
Object[] objs = al.toArray();
for(int i = 0 ; i < objs.length ; i++) {
System.out.println(objs[i] +"\t");
}
System.out.println();
al.clear();//清空,空间还在,内容清空
System.out.println(al.toString());
System.out.println(al.size());
System.out.println(al.isEmpty());//判断是否为空
//工具方法中(服务集合的工具、服务数组的工具Arrays)
List list = Arrays.asList("A" , "B" , "C" , "D" , "E");
System.out.println(list);
}
}
运行结果:
A
E
B
C
[A, E, B, C]
被移除的对象:B
[A, C]
[F, C]
F
C
[]
0
true
[A, B, C, D, E]
- Vector:
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全;
import java.util.Vector;
public class TestVector {
public static void main(String[] args) {
//JDK提供了集合的使用方法
//线程安全性高,但效率差
Vector vector = new Vector();
//Vector和ArrayList同类型,但在不在意线程安全时,ArrayList更效率
//10万行逻辑代码,都是基于接口完成的操作
//将上面的创建对象改为
//List vector = new ArrayList();
//就可以把所有的Vector相关代码改为ArrayList的
//接口的好处:更容易更换具体实现
vector.add(111);
vector.add(222);
vector.add(333);
vector.add(0 , 666);
for(int i = 0 ; i < vector.size() ; i++) {
System.out.println(vector.get(i));
}
System.out.println(vector);
}
}
运行结果:
666
111
222
333
[666, 111, 222, 333]
- LinkedList:
链表结构实现,增删快,查询慢;
import java.util.LinkedList;
import java.util.List;
public class TestLinkedList {
public static void main(String[] args) {
List ll = new LinkedList();//链表(first、last、size)
ll.add("A");
ll.add("B");
ll.add("C");
ll.add("D");
for(int i = 0 ; i < ll.size() ; i++) {
System.out.println(ll.get(i) +"\t");
}
System.out.println();
System.out.println(ll.toString());
}
}
运行结果:
A
B
C
D
[A, B, C, D]
万物皆对象,一切皆工具;
12.3.3 不同结构实现方式
- ArrayList:必须开辟连续空间,查询快,增删慢;
- LinkedList:无需开辟连续空间,查询慢,增删快;