什么是集合?
我的个人理解是:集合其实是一种面向对象思想语言的数组,但它们之间又有着许多不同,集合不像数组那样长度固定,集合的长度是不需要在声明时定义的,它的长度会根据我们放入的对象多少而改变。集合是一种引用类型,在java中针对不同的应用场景有着不同的更为适合的集合类型。
集合的类图
这是java集合类的官方文档类图,而我们学习的类型其实并没有这么可怕。
![](https://i-blog.csdnimg.cn/blog_migrate/cdfb93bf5f3289424e1ea36a72f3000d.bmp)
这张类图是我们需要深入学习的Java集合类
![](https://i-blog.csdnimg.cn/blog_migrate/91e9eb6f7673ede6a1982dbe597d3ea6.png)
接下来我们自顶而下从左到右的一个个介绍集合类型。
Iterator
iterator是集合的顶层接口,它并不是不是一个具体的类,实现了它的类具备iterator()方法会返回一个迭代类,实现了该接口的类可以使用foreach进行遍历。
Collection
collection接口同样是一个接口,它是一个基本集合类接口,collection接口中定义了基本的集合应该具备的方法。
boolean add(E e)方法
add方法是集合的添加方法,返回值是一个boolean类型,将参数添加进集合中默认至集合末尾。
boolean addAll(Collection collection)方法
addAll方法见名知意那就是添加所有的意思,它的返回值类型也是一个boolean类型,而参数是集合类型。该方法会将参数集合中的所有元素添加到新的集合中。
boolean remove(Object object)方法
remove方法返回值是boolean类型,参数是一个对象类型,remove方法会将集合中的该对象删除,若集合中有多个该对象时会将所有匹配的对象全部删除。
boolean removeAll(Collection collection)方法
removeAll方法同addAll方法一样,返回值是boolean类型,参数是一个Collection类型,该方法会将参数集合中的所有元素在调用方法的集合中进行匹配,之后删除所有匹配的元素。
void clear()方法
clear方法是一个清空方法,没有返回值没有参数,会直接将调用集合直接清空可理解为初始化。
boolean contains(Object object)方法
contains方法返回值是boolean类型,参数是对象类型,调用该方法时会在调用集合中寻找参数对象,若存在返回true若不存在返回false
boolean isEmpty()方法
isEmpty方法返回值是boolean类型,方法判断调用集合中是否为空,是返回true,否返回false
int size()方法
size方法返回值类型为int型,该方法会返回调用集合中的元素总数。
Object[] toArray()方法
toArray方法返回值类型为Object类的数组,该方法可以将集合转换成数组返回。
Set
set接口继承自collection接口,set接口的特点是一种无序不可重复的集合类型,而这里的set并不是一种实现类,同样的它也只是一个接口。
set集合取出的顺序和存入的顺序无关,并且set集合中不存在下标。
HashSet
HashSet底层结构是哈希表,哈希表是哈希算法支持的。哈希算法就是JDK根据对象地址或字符串或数值计算出的一个整数类型的数据。
拥有Set集合的特点,内容不重复,读取顺序和存入顺序无关。
线程不安全。
LinkedHashSet
底层是哈希表和链表实现的。
元素是有序的。
元素不可重复。
线程不安全。
TreeSet
底层通过TreeMap实现,是一个二叉树。
元素无序不可重复。
可按照元素的大小顺序自动排序。
线程不安全。
List
list接口继承自collection接口,它是一种有序可重复的集合类型,list并不是实现类而是一个接口。
list集合有下标。
ArrayList
底层是一个数组,默认初始化长度是10.
插入删除的效率低,读取遍历效率高。
线程不安全
使用add方法时候可以传入下标将值插入到指定位置。
元素存放位置可通过首元素位置和元素内存大小计算
元素内存空间大小相同,内存地址连续的。
add(int index, Object object)
LinkedList
底层通过双向链表实现。
插入删除效率高,遍历效率低。
线程不安全。
Vector
底层通过数组实现.
初始容量是10。
所有的方法都是线程同步的,都带有synchronized关键字。
线程安全。
Map
map接口是也是一种集合类型,map类型和set、list有很大的区别,map类型是以一种键值对key和value的形式存放的,一般我们把要存的元素放入value中,给它起一个对应的key值,每次需要使用时通过key值来取。
put方法
void put(k key, V value)//设置键值对
void remove(Object key)//删除元素
void clear()//清空集合
boolean containsKey(Object key)//判断键是否存在,存在返回true
boolean containsValue(Object value)//判断值是否存在,存在返回true
boolean isEmpty()//判断集合是否为空
int size()//获取集合元素个数
HashMap
键值对形式,键唯一值不唯一。
底层基于哈希表,哈希表就是数组加链表。
线程不安全。
初始化容量是16当集合容量达到初始化的百分之七十五时,数组变为二叉树开始扩容。
HashTable
底层通过数组加链表。
链表解决哈希冲突。
线程安全。
TreeMap
底层是红黑树。
平衡排序的二叉树。
如果要使用线程安全的集合怎办?
使用Vector集合。
使用HashTable集合。
使用Collections包中的工具类使线程不安全的集合变为线程安全的。