概念:
集合是长度可变的容器,可以存储不同类型的元素,只能存储引用数据类型 但是存整数是通过integer基本类型封装类进行存储的
java语言是面向对象的语言,为了方便对每一个对象操作,将这个对象存储到集合中
jdk把一套容器类,称为集合框架 java.util包下
集合分类
单列集合
Collection(value)
List接口(继承了collection接口):元素按进入先后有序保存,可以重复 (这个常用 比较重要)
linkedList 接口实现类,链表结构,插入删除,没有同步,线程不安全
ArrayList 接口实现类,数组结构,随机访问,没有同步,线程不安全
Vector 接口实现类 数组结构 同步 线程安全
Stack 是Vector类的实现类
Set接口(继承了collection接口):仅接收一次,不可重复,并做内部排序
HashSet 使用hash表(数组)储存元素 允许null元素 线程不安全
LinkedHashSet链表维护元素的插入次序(底层是链表和哈希表结构)
TreeSet 底层实现为二叉树,元素排好序
LinkedHashSet:底层是哈希表和链表结构,元素有序,元素唯一原理和hashset一致 线程不安全
双列集合
Map(Key-Value)双列集合
Map(元素:键值对,对键有唯一性约束,可以通过键获取对应的值 )
HashMap:接口实现类,没有同步,线程不安全。底层是哈希表结构
底层时哈希表结构 允许使用 null 值和 null 键 线程不安全,快.(常用 重要)
hashmap 对键唯一性原理:和hashset一样
Hashtable:底层时哈希表结构 不支持null值和null键 线程安全的,弃用了.
LinkedHashMap双向链表和哈希表实现 可预知迭代顺序线程不安全
主键和value允许为空;
WeakHashMap
TreeMap 红黑树对所有的key进行排序(底层 是树结构) 根据键的自然顺序进行排序 主键不允许为空
Map集合的遍历
方式一“
- 通过Keyset获取所有的键的集合
- 遍历set集合,遍历所有的键—通过键获取对应的值
Set KeySet()返回此映射中包含的键的Set试图
方式二
Set<Map.entry<K,V>> entrySet() 返回包含此映射关系的Set视图 - 获取Set集合(集合中的元素就是entry实体对象(就是一个键值))
K getKey() 返回与此相对应的键
V getValue() 返回与此项对应的值
list和Set集合详解
有序性:list保证按照插入顺序排序
set存入取出顺序不一致
唯一性:list可以重复
set 元素唯一
获取元素:list可以直接通过索引操作元素
set不能通过索引获取元素(需要借助迭代器)
2.list
List:元素有序,有索引,列表迭代器
1.Arraylist:底层数据结构是数组 查询快 增删慢 线程不安全 效率高 可以储存重复元素
2.LinkedList:底层数据结构是链表 查询慢 增删快 线程不安全 效率高 可以储存重复元素
3.Vector:底层数据结构是数组 查询块 增删慢 线程安全 效率低 可以储存重复元素
3.Set接口:元素不可重复 set集合的遍历只能使迭代用器
(1) HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
(2) LinkedHashSet底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
(3) TreeSet底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排序要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;
(4) (4)小结:Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只 是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素。
(5) Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
功能接口:
Iterator;迭代器
ListIterator: 列表迭代器
Comparable:比较性
Comparator: 比较器
工具类
Collections:集合工具类
Arrays:数组工具类
ListIterator和Iterator详解与辨析
在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。
这里有一点需要明确的是,迭代器指向的位置是元素之前的位置,如下图所示:
这里假设集合List由四个元素List1、List2、List3和List4组成,当使用语句Iterator it = List.Iterator()时,迭代器it指向的位置是上图中Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后移到上图Iterator2所指向的位置。
首先看一下Iterator和ListIterator迭代器的方法有哪些。
Iterator迭代器包含的方法有:
hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false
next():返回集合中Iterator指向位置后面的元素(这里面的.next只能使用一次第二次会++会出现意想不到的错误)
remove():删除集合中Iterator指向位置后面的元素
ListIterator迭代器包含的方法有:
add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前(特有)
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false(特有)
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素(特有)
previousIndex():返回列表中ListIterator所需位置前面元素的索引(特有)
remove():从列表中删除next()或previous()返回的最后一个元素(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)
set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e
一.相同点
都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
二.不同点
1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
来源:CSDN
作者:吃瓜袋鼠
链接:https://blog.csdn.net/weixin_43246116/article/details/103481673