容器
一.引入
为什么需要集合?
数组存在两个缺陷:
数组长度难以扩充
数组中元素类型必须相同
容器可以弥补数组的这两个缺陷
二.集合体系
Java的所有的集合体系都是实现了Collection接口,所有通用的 Collection 实现类(通常通过它的一个子接口间接实现 Collection)应该提供两个“标准”构造方法:一个是 void(无参数)构造方法,用于创建空 collection;另一个是带有 Collection 类型单参数的构造方法,用于创建一个具有与其参数相同元素新的 collection。add方法的参数类型是Object,以便于利用多态特性接收任意类型的对象,集合中存储的都是对象的引用(地址)。在Collection下又分三个子体系: List、Set、Map体系。
三.Collection接口
1.最共性的方法:即Collection接口中的方法
分类说明:
添加:
add()
addAll()
删除:
remove()
removeAll()
判断:
contains()
containsAll()
获取:
iterator()
size()
集合变数组:
toArray()
2.Iterator迭代器
四.List(有序、可重复)
1.ArrayList
使用的数据结构是数组,线程是不安全的,查找速度快,增删速度慢
因为List继承了Collection接口,ArrayList又实现了List接口,因此ArrayList具备Collection、List中的所有方法,只有它自己个性的方法,请查API文档。
2.LinkList
使用的数据结构是链表,线程不安全的,查找速度慢,增删速度快
因为List继承了Collection接口,LinkList又实现了List接口,因此LinkList具备Collection、List中的所有方法,只有它自己个性的方法,请查API文档。
3.Vector
使用的数据结构是数组,线程安全的,查找速度快,增删速度慢,被ArrayList替代了
因为List继承了Collection接口,Vector又实现了List接口,因此Vector具备Collection、List中的所有方法,只有它自己个性的方法,请查API文档。
五.Set(无序、不可重复)
重复不重复指的是相同的对象
重复叫做:可以添加相同的对象,就是equal方法返回值一样
1.HashSet
数据结构是哈希表,线程是非同步的。保证元素唯一性的原理:判断元素的hashcode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。
可以根据自己的目的去重写这两个方法。
因为Set继承了Collection接口,HashSet又实现了Set接口,因此HashSet具备Collection、Set中的所有方法,只有它自己个性的方法,请查API文档。
2.TreeSet
底层数据结构是二叉树,保证元素的唯一性依据是:compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
因为Set继承了Collection接口,TreeSet又实现了Set接口,因此TreeSet具备Collection、Set中的所有方法,只有它自己个性的方法,请查API文档。
六.Map
Map存储的是键值对,一对一的存,键不能重复。
1.HashMap
底层使用的数据结构是哈希表,线程不安全的,可以存储null键,null值
HashMap保证键唯一性的原理和HashSet一样
出现相同的键,会把以前的覆盖掉,而不是删除掉
如果你单独只是存键值对的话,没有其他功能,用hashmap就可以了。
但是你想排序的话,用treemap
2.TreeMap
底层使用的数据结构是二叉树,线程不安全的。
排序的原理和TreeSet一样(方法也是几乎完全一样的)
是通过键来排序的
七.两个工具类:Arrays、Collection
Arrays
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含了一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为null,则此类中的方法都会抛出NullPointException。
Collections(集合的工具类)
Collection接口的实现类,如ArrayList、LinkedList本身并没有提供排序,倒置,查找等方法,这些方法是由Collections类来实现的,该类有很多public static方法,可以直接对Collection接口的实现类进行操作。