集合概述
什么是集合?有什么用
集合实际上就是一个容器,可以用来容纳其他类型的数据,集合不能直接存储基本
数据类型,集合当中存储的都是java对象的内存地址,实际上集合也是一个java对象,
java中每个不同的集合,底层会对应不同的数据结构,往不同的集合中存储元素,等于就
将数据放到不同的数据结构中
所有的集合类和集合接口都在java.util包下
java的集合中分为两大类:
一类是单个方式存储元素,这类集合的超级父接口是java.util.Collection
一类是以键值对的方式存储元素,这类集合的超级父接口是java.util.Map
List和Set接口集合
Map接口集合
Collection接口
Collection接口中的常用方法
boolean add(Object e):向集合添加元素
int size():获取集合中元素的个数
void clear():清空集合的个数
boolean contains(Object o):判断集合中是否包含某元素
boolean remove(Object o):删除集合中的某个元素
boolean isEmpty():判断集合是否为空
Object[] toArray():将集合转换成数组
iterator():返回集合的迭代器,用于遍历集合中的对象
public class Test{ public static void main(String[] args) { Collection c = new ArrayList(); for (int i = 0; i < 10; i++) { c.add(i);//添加元素 } System.out.println(c.size());//获得元素个数 System.out.println(c.contains(0));//判断是否包含某个元素 System.out.println(c.remove(0));//删除某个元素 System.out.println(c.isEmpty());//判断集合是否为空 Iterator it = c.iterator();//获得集合器 while (it.hasNext()){//遍历元素 System.out.println(it.next()); } Object[] o = c.toArray(); for (Object a:o) { System.out.println(o); } } }
Iterator迭代器
hasNext():判断是否还有下一个元素
next():返回下一个元素
迭代器一开始并没有指向任何一个元素
集合只要发生改变迭代器就需要重新获取,使用迭代器就像是快照一样,记录某个时段
集合的元素然后迭代,在迭代集合元素过程中,不能调用集合对象的remove()方法进行删除
元素,要使用迭代器的remove()方法进行删除
为什么?
因为迭代器就相当于拍快照,迭代器在进行迭代的时候会将拍到的快照与正在进行
迭代的集合进行比较,如果用集合对象的remove()方法删除元素,会导致快照内容和正
在进行迭代的集合不相等,会产生异常,而使用迭代器里边的remove()方法进行删除
会把快照的内容也删除
List接口
List类型集合存储元素特点:
有序可重复,存储的元素有下标。有序实际上说的是存进去是这个顺序,取出来还是这个顺序
这里的顺序不是按照大小排序,每个List集合的元素都有下标,下标从0开始,以1递增
List接口有三个实现类,分别是ArrayList、LinkedList和Vector
List接口常用方法
void add(int index,E element):在列表指定位置插入元素(第一个参数是下标)效率低
E get(int index):根据下标获取元素
int indexOf(Object o):获取指定元素第一次出现处的索引
E remove(int index):删除指定下标位置的元素
E set(int index,E element):修改指定位置的元素
public class Test{ public static void main(String[] args) { List l = new ArrayList();//创建List类型集合 for (int i = 0; i < 10; i++) { l.add(i,i);//向集合添加元素 } System.out.println(l.get(0));//获得下标为0的元素 System.out.println(l.indexOf(5));//获得元素5第一次出现的索引 l.remove(5);//删除指定下标的元素 l.set(3,99);//修改指定位置的元素 Iterator it = l.iterator(); while (it.hasNext()){ System.out.println(it.next()); } } }
ArrayList集合
ArrayList集合特点:
1、ArrayList集合底层采用了线性表这种数据结构,ArrayList集合是非线程安全的
2、ArrayList集合初始化容量是10,当超过初始化容量后会自动扩容,扩容为原容量的1.5倍
3、ArrayList集合底层是Object类型的数组Object[]
优化策略
建议给定一个预估计的初始化容量,减少数组的扩容次数
数组这种数据结构的优缺点:
优点:检索效率比较高
缺点:随机增删元素效率比较低
但是需要注意的是:向数组末尾添加元素,效率还是很高的
LinkedList集合
LinkedList集合特点:
1、LinkedList集合底层采用了双向链表数据结构
2、对于链表数据结构来说,随机增删效率较高,检索效率较低
3、链表中的元素在空间存储上内存地址不连续
Vector集合
Vector集合特点:
Vector集合底层采用了数组这种数据结构,Vector所有的方法都有synchronized关键字
修饰,是线程安全的,但是效率较低,现在保证线程安全有别的方案,所有Vector使用较少
Set接口
set类型集合存储元素特点:
无序不可重复,无序表示存进去是这个顺序,取出来就不一定是这个顺序了,元素没有下标
set常用方法
add(E e):若指定元素不存在,则将其添加到集合中
clear():将集合清空
contains(Object o):判断集合是否包含指定元素
isEmpty():判断集合是否为空
size():返回集合个数
toArray():返回包含此集合所有元素的数组
HashSet集合
HashSet集合特点:
HashSet集合在new的时候,底层实际上new了一个HashMap集合,向HashSet集合中
存储元素实际上是存储到HashMap集合中,HashMap集合是一个哈希表数据结构,HashSet集合
初始化容量是16,初始化容量建议为2的倍数,扩容是原容量的2倍
TreeSet集合
TreeSet集合实际上实现了SortedSet接口,而SortedSet接口继承了Set集合
SortedSet类型集合存储元素特点:
SortedSet接口由于继承了Set集合,所以它的特点也是无序不可重复,但是放在SortedSet类型集合中的
元素可以自动排序,称为可排序集合,放到该集合中的元素自动按照大小顺序或者字典顺序排序
TreeSet集合存储元素特点:
new TreeSet集合的时候,底层实际上new了一个TreeMap集合,往TreeSet集合添加数据时,
实际上是将数据放到了TreeMap集合中了,TreeMap集合底层采用了二叉树数据结构
TreeSet集合新增常用方法:
first():返回此集合中第一个(最低)元素
last():返回此集合最后一个(最高)元素
comparator():返回对此集合中的元素进行排序的比较器,如果此Set使用自然排序则返回null
subSet(E fromElement,E fromElement):返回一个新的set集合,从fromElement到fromElement区间,左闭右开
headSet(E toElement):返回一个新集合,新集合是toElement之前的所有对象,但不包括toElement对象
tailSet(E fromElement):返回一个新的Set集合,新集合包含fromElement之后的所有对象,包括fromElement对象
Map接口
Map接口特点:
Map接口和Collection接口没有任何关系,Map集合是以key和value键值对的方式存储元素,key
和value都是存储java对象的内存地址,所有Map集合的key特点:无序不可重复。Map集合的key
和Set集合存储元素特点相同
Map常用方法:
clear():清空集合
containsKey(Object key):判断指定是否含有该键
containsValue(Object vlaue):判断指定值是否含有该值
entrySet():将集合转换为Set集合
get(Object key):通过键获取值
isEmpty():判断集合是否为空
keySet():将Map集合的key转换为set集合
put(K key,V value):添加键值对
remove(Object key):通过键删除键值对
size():返回集合元素个数
HashMap集合
HashMap集合特点:
HashMap集合底层是哈希表数据结构,是非线程安全的,在jdk8之后,如果哈希表
单向链表中元素超过八个,单向链表就会变成红黑树数据结构,当红黑树上的节点数量
小于6时,会重新把红黑树变成单向链表数据结构,这种方式是为了提高检索效率
二叉树的检索会再次缩小扫描范围提高效率,初始化容量16,默认加载因子0.75
扩容之后的容量是原容量的2倍,HashMap集合的key和value可以为null,key重复
的话value会覆盖
Hashtable集合
Hashtable集合特点:
Hashtable集合底层也是哈希表数据结构,是线程安全的,其中所有的方法都带有synchronized关键字,
效率较低,现在使用较少,因为控制线程安全有其他更好的方案,Hashtable的key和value不能为null
Hashtable集合初始化容量是11,默认加载因子为0.75,Hashtable集合扩容:原容量*2+1
Properties集合
Properties集合继承Hashtable集合
Properties集合特点:
Properties是线程安全的,因为继承了Hashtable,另外Properties存储元素时采用key和value形式
并且key和value只支持String类型,不支持其他类型,Properties称为属性类
Properties集合的常用方法
setProperty():取
getProperty():存
SortedMap接口
SortedMap集合的key存储元素特点:
首先是无序不可重复,另外放在SortedMap集合key部分的元素会自动按照大小顺序排序,称为可排序集合
TreeMap集合
实现了SortedMap接口,底层数据结构是二叉树
比较器
放在TreeSet和TreeMap集合的元素要想做到排序有两种方法
第一种:元素要实现java.lang.Comparable接口
第二种:在构造TreeSet或者TreeMap集合的时候传入以比较器对象
集合工具类Collections
静态方法:
synchronizedList(list):将线程不安全的变成线程安全的
sort(list):排序,前提要有比较器
List<String> myList = new ArrayList<>(set集合对象):Set集合变成List集合