集合
集合就是放数据的载体,放的对象的引用,而不是对象本身
集合分类
1. Collection
Collection 是一个集合类的上级接口。它提供了对集合对象进行基本操作的通用接口方法。继承与他的接口主要有Set 、List与Queue。
Collections 是一个针对集合类的一个帮助类。它包含有sort(),copy(),shuffle(),binarySearch()等关于集合的静态方法。此类不能实例化,服务于Java的Collection框架。
- ArrayList
ArrayList的底层实现为数组,是顺序结构。
它可以存放null值,线程不同步,因此效率高。
可通过数组下标的形式进行查找,所以在查询方面的效率较为出色,它的插入,在头部插入速度慢,在尾部插入速度快。 - LinkedList
LinkedList的底层实现为双向链表形式,是链式结构。
它可以存放null值,也为线程不同步,因此效率高。
因为是链表,所以插入速度快,但插入之前还是要查找的,所以它两端插入快,中间插入慢,在数据量大的情况下,性能优于ArrayList。 - Vector
Vector与ArrayList的差别是,Vector是线程同步的。
vector有一个子类Stack(C)
底层数据结构是基于链表的,是后进先出的堆栈。
特有的方法有pop(),posh(),peek()。
- HashSet
底层数据结构:哈希表
内存存储位置:hashCode()决定,由equals()判断是否重复,HashSet底层实现是HashMap,并且把数据作为HashMap中的key值。因此不能有重复值。 - TreeSet (有序,唯一) ——> 实现了SortedSet接口
底层数据结构:红黑树
TreeSet主要用于排序。
TreeSet如何排序
通过Comparable和Comparator接口
Comparable自然排序,重写compareTo()方法
Comparator比较器排序,重写compare()方法
当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主
Queue集合是队列(线性结构),进出顺序是先进先出
实现类有Deque(I)
Deque是栈(双端队列),LinkedList除了是List的实现类之外还是Deque的实现类
2. Map
Map的底层数据结构是哈希表。
它以key-value的形式存入数据,其中key不允许有重复值,value允许有重复值。
它有两种遍历方式:
- 遍历键:keySet()
- 遍历键值对:entrySet()
-
HashMap
底层数据结构:哈希表
底层实现:hash值配合使用的数组和链表
HashMap线程不安全,效率高
无序,key和value都允许有null值,但是key只允许有一个
.如何保证键的唯一性:通过hashCode和equals方法判断 -
TreeMap(主要作用:排序)
底层数据结构:红黑树
它是有序的,根据key排序
初始容量:16,加载因子:0.75 ->扩展为原容量的2倍->使用resize()方法扩容子类 LinkedHashMap
底层数据结构:链表+哈希表
有序,按插入顺序排序
key和value 都允许有null值 -
HashTable
底层数据结构:哈希表
无序,key和value都不允许有null值
线程安全,效率低 -
ConcurrentHashMap
底层数据结构:Segment数组 + HashEntry数组
无序,key和value都不允许有null值
线程安全,效率低
比较
HashMap和HashTable的区别
1.Hashtable继承自Dictionary类,HashMap是Map接口的实现
2.Hashtable是线程安全,HashMap线程不安全
3.hashTable的key和value都不能为null,HashMap允许存在一个null的key,多个null的value。
4.HashMap适合单线程环境,HashTable适合多线程环境
ConcurrentHashMap和hashtable的区别
1.ConcurrentHashMap是结合了HashMap和HashTable两者的优势。HashMap没有考虑到同步问题,而Hashtable考虑了同步问题
2.HashTable在每次执行时都要锁住整个结构。而ConcurrentHashMap只需要锁部分即可
HashMap和TreeMap的区别
1.对于Map中插入,删除,定位的操作 - >选择HashMap
2.如果是要对一个有序集合进行遍历 ->选择TreeMap
集合遍历
1. for循环遍历
2.Iterator迭代器遍历
父接口:Iterable
方法:
- hashNext()
- next()
- remove()
3.foreach遍历
父接口:Iterable
遍历比较
foreach和Iterator的区别
迭代器:可迭代,可删除
而foreach不可以删除
for循环和Iterator对比
- ArrayList - 随机访问比较快,而for循环中的get()方法可直接获取。
- LinkedList - 添加/删除比较快,而iterator中的next(),方法可直接获取。
- 从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.