-
常用的集合类
-
单列集合
-
Collection
-
List
- 有序可重复
- ArraryList
- 删除和插入元素效率低下
- 底层为数组
- 插入一个元素时,会引起数组的扩容,并创建一个新的数组,旧数组与插入元素一同插入新数组中,
- 删除一个数组时,将删除元素位置置为null,使用for循环,将数组元素重新排序
- 易于查找
- 将元素下标当做索引。可快速找到所需元素
- LinkedList
- 删除和插入元素速度焦较快
- 为双向链表结构,链表中的每一个元素都使用引用的方式引用前一个元素与后一个元素,将所有的元素连接起来,当需要修改或者插入元素时只需要改变这种元素即可
- 不便于查找
- 没有像数组一样的索引快速的查找数组,只能按照顺序慢慢查找,效率低下
- Vector
- 与ArraryList用法相同,但是Vector是线程安全的
- 迭代方法
- 调用期elements()方法返回一个Enumeraltion对象
- 调用hashMoreElements()方法判断是否存在下一个元素
- 若存在,调用nextElement()方法取出元素
-
Set
- 无序不可重复
- HsahSet
- 根据对象的哈希值来确定元素在集合中的存储位置,底层为数组和链表结构,有良好的存储和查找功能
- 根据元素的哈希值判定元素的存储位置,存储元素时,使用链表的结构存储元素
- TreeSet
- 不可重复且可排序
- 使用排序二叉树来存储元素
- 二叉树分为左子树与右子树,向集合中一次插入数据,将第一个元素放在二叉树最顶端,接下来的元素依次与顶端元素相比较,若小于顶端元素,便将顶端元素放到左子树上,反之,放到右子树上,若是与存在元素相同,则不与插入
- 元素进行比较时,都会调用compareTo()方法进行比较,该方法是在Comparable接口中定义的,若要使TreeSet中的元素进行排序,则需实现Comparable接口
- 他们判断新元素和已有元素的hashcode是否相等:
1. 不相等则认定不重复,可以插入;
2 相等则再调用元素的equals()方法,跟已有元素比较
(1)若不相等,则认定不重复,可以插入;
(2)若相等,则认定重复,不插入。
-
双列集合
-
Map
-
HashMap
- 底层是哈希数据表结构,可以使用Null作为键或者值,该集合线程是不同步的
-
Hashtable
- 底层是哈希数据表结构,不可以使用Null作为键或者值;该集合线程是同步的
-
TreeMap
- 底层是二叉树结构,线程不同步,可以对Map中的键值可以排序
-
取值方式1
- 调用entrySet()方法返回一个Set<Map.Entrey<Object,object>>
- 该返回Set对象调用iterator()方法,返回一个Iterator对象
- 调用Iterator的hashNext()方法判定是否存在下一个对象,
- 若存在,调用next()方法取出元素,
- 使用元素对象调用getKey()方法取得key值,
- 使用元素对象调用getValue()方法取得value值,
-
取值方式2
- 调用map对象的keySet()方法返回储存key值的set集合
- 遍历该集合,取出key值,再调用map的get(key)方法取出value值
- 每个元素都包含一个键对象key和值对象value,键和值存在一种对应关系,称为映射,value值可重复,key值不可重复
-
Iterator类(迭代器)
- 使用Iterator遍历集合
- 调用iterator方法返回一个Iterator对象,
- 调用hashNext()方法,判断是否有下一个元素存在
- 如果存在,使用next()方法取出元素
- 使用next()方法时,一定要保证是否有元素存在,否写会抛出NoSuchElementException异常
- 在进行迭代时,不可使用集合的remove()方法删除元素,否则,会产生ConcurrentMotifycationException
- 解决方法1,找到要删除的元素,使用remove()方法将其删除,再使用break跳出循环
- 解决方法2,找到要删除的元素,室友迭代器自己的remove()方法删除
-
foreach循环
- 不需要获得容器长度,不需使用索引访问元素位置,会自动遍历容器每个元素
- 不可修改数组中的元素
-
线程安全Map集合
- java.util.concurrent包下
Class ConcurrentHashMap<K,V>
-
如何得到一个线程安全的List
- colection包下静态方法<T> List<T> synchronizedList(List<T> list)
- 将list中全部方法synchronized关键字修饰,锁定同一个方法