前言
通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象。如果在程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组对于数据类型极其长度是有限制的,要求存放相同类型的数据,且长度固定。此时,如果需要存放不同类型且长度不一的数据,怎么办?集合便应运而生了。
Java中集合类是放在java.util中,是一个用来存储多个对象的容器。
- 只能存放对象,不能存放int等类型,存的是对应的是Integer等包装类对象;
- 存的是对象的引用,对象本身是放在堆内存中.(存储的元素必须是引用类型);
- 可以存放不同类型,且不限数量的数据。
1、集合的框架图
先放一张集合框架图:
Java中集合,从分支派系来看,注意分为两类:
-
Collection
- Collection是集合类的根接口/祖宗接口。
- 在Java源码包中,Collection接口没有直接的实现类,但它具有两个子接口类来传宗接代:即List集合、set集合。
- List集合:一个有序的集合,可存储重复的元素。
- set集合:无序的,且不能存储重复的元素。
- 实际上Collection还有另一个子接口类:
-
Map
- Map集合Java.util包中的另一个接口,它和Collection接口是相互独立的,都属于集合类的一部分。
- Map集合是双列的,一般是成对出现的,即(键,值)总是以键值对出现,同样不允许存储重复元素。
2、Collection的子接口类
2.1 List集合
List接口有三个接口实现类:LinkedList集合、ArrayList集合、Vector集合。
LinkedList集合:
1) 底层数据结构是链表,查询慢,增删快
2)线程不安全,效率高
ArrayList集合:
1).底层数据结构是数组,查找快,增删慢。
2). 线程不安全,效率高
Vector集合:
1) 底层数据结构是数组,查询快,增删慢
2)线程安全,效率低
2.2 Set集合
Set接口有两个实现类:Hashset集合、Treeset集合。
Hashset集合:
1) 底层数据结构是哈希表,HashSet依赖于HashMap,它实际上是通过HashMap实现的。哈希表依赖两个方法hascode ()和equals()方法;
2)两个方法的执行顺序:
首先判断hascode()值是否相同
是:继续执行equals()方法,看其返回值
true:说明元素重复,不添加
false:就直接添加元素
否:就直接添加到集合
Treeset集合:
1)底层数据结构是二叉树。它依赖于TreeMap,它实际上是通过TreeMap实现的。
3.Map集合
Map集合是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。
- AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。
- Hashtable虽然继承于Dictionary,但它实现了Map接口。
【1】Map集合是Map集合的根接口,子类有:HashMap和TreeMap集合两个子类。
【2】Map集合中只键不能重复,而值是可以重复的
【3】子类的数据结构
- Hashmap:底层数据结构是哈希表
- Treemap底层数据结构是二叉树,其性质和Set的底层数据结构一样。
4.Iterator迭代器
- Iterator:它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。
- ListIterator:专门为遍历List而存在的。
5.工具类
- Arrays:操作数组的工具类;
- Collections:操作集合的工具类。