Java集合大致可分为Set、List和Map三个体系
Collection接口
Set和List是Collection的子接口,所以先看看Collection接口下定义的基本方法。
Collection接口(API文档: Collection)的基本方法有:
add(object o):添加元素。
addAll(Collection collection):添加collection中的所有元素。
clear():清空元素。
contains(Object object):是否包含指定的对象。
containsAll(Collection collection):是否包含collection的所有元素。
iterator():返回迭代器。
remove(Object object): 删除指定元素。
removeAll(Collection collection): 移除指定collection中包含的所有元素。
retainAll(Collection collection): 移除未包含在指定collection中的所有元素。
Size():返回元素个数。
toArray():转换为数组
hashCode():返回哈希码。
Set和List主要的集合类以及关系图(黑色框框的集合类将不介绍)
Set集合(API文档:Set):
Set集合表示无序、不可重复的集合,为了保证其元素没有重复,Set在接收一个元素时,会根据该对象的内存地址算出hashCode(hash码、哈希码),判断其是否属于同一个区间,如果在同一个区间则调用equals方法,进行匹配判断。(附:哈希码介绍(百度百科))
HashSet(API文档:HashSet):
实现了Set接口,也一样是无序不可重复。底层是使用了哈希表来支持的。例如查找某个对象是,内部原理先会用hashCode方法计算出对应这个对象的hash码,再根据hash码到相应的存储区域用equals()方法查找,大大提高了效率,也体现了HashSet存取速度快的特点。
构造方法如下:
HashSet():构造默认的空实例
HashSet(int capacity):构造指定容量大小的实例
HashSet(int capacity, floatloadFactor):构造一个指定大小和加载因子的实例,loadFactor(加载因子)是决定了何时对散列表进行再散列(散列:重建内部数据结构)。例如:loadFactor为0.75时,散列表存满75%时就会再散列,loadFactor设定越高,当内存使用越高时,元素的寻找时间越长,loadFactor设定越低,造成多次散列,元素寻找时间虽然较前面的情况低,但是内存浪费较前面的情况高。
HashSet(Collection<? extendsE> collection):构造一个包含指定集合所有元素的实例。
List集合(API文档:List):
有序、可重复的集合,对于List的每个元素,List都有一个索引,通过索引来访问元素。
List除了实现了Collection接口的抽象方法,还有:
add(int looation,E object):将指定的对象添加在指定的位置
addAll(int location,Collection<? extends E> collection):将指定的集合元素添加到指定的位置
get(int looation):返回指定位置的List元素
indexOf(Object object):搜索对象并返回第一个匹配项的索引
lastIndexOf(Object object): 搜索对象并返回最后一个匹配项的索引
set(int looation,E object):将指定位置的元素替换成指定对象
subList(int start, int end):截取从第start个元素到第end个元素(不包含最后一个元素),注意的是,对截取出来的内容进行修改,原List的内容也会被修改,subList是截取List某段元素的引用,而不是对元素在存储上的截取复制。
ListIterator(int location)和ListIterator():都是返回列表迭代器,第一种是指定了游标所在位置。
ArrayList(API文档:ArrayList):
实现了List接口,底层是维护了一个Object数组。ArrayList实现了可变大小的数组,在随机访问和遍历元素上,提供了更好的性能,该类是非同步的,在多线程情况下不建议使用,插入删除效率低。ArrayList相当于Array的复杂版本,也被称作动态数组。
构造函数:
ArrayList()
ArrayList(int capacity):构造指定初始容量大小的实例
ArrayList(Collection<? extendsE> collection): :构造一个包含指定集合所有元素的实例。
ArrayList和Array的区别:
1.Array固定大小,而ArrayList可变化大小。
2.Array可包含基本类型和对象类型,ArrayList只包含对象类型。
3.ArrayList提供更多的方法特性
LinkedList(API文档:LinkedList):
底层是通过使用了链表数据结构实现的,且为双向链表,即每个元素中除了包含数据还包含了分别指向前一个和后一个的链域。
构造函数:
LinkedList ()
LinkedList (Collection<?extends E> collection):构造一个包含指定集合所有元素的实例。
相对于List接口,新加入的(此处指的是List没有的)比较重要的方法有:
addFirst(E object)/addLast(Eobject): 在开头/结尾处插入元素,如果队列容量满了,就会抛出异常
descendingIterator():以相反顺序返回次双端队列中的迭代器
element():检索双端队列的第一个元素(不存在则抛出异常)
getFirst()/getLast():获取第一个/最后一个的元素
offer(E o):在容量限制以内,则将指定元素插入到队列中,插入成功返回true,否则返回false(与add方法做对比,返回值不同)
offerFirst(E e)/ offerLast(E e): 在容量限制以内,则将指定元素插入到队列的开头/结尾,插入成功返回true,否则返回false
peek():检索双端队列的第一个元素,为空则返回null(与element方法做对比)
peekFirst()/peekLast():检索双端队列的第一个/最后一个元素,为空则返回null
poll():检索 并移除 双端队列的第一个元素,为空则返回null(与peek方法做对比)
pollFirst()/pollLast():检索并移除双端队列的第一个/最后一个元素,为空则返回null
pop():返回并删除栈顶的元素,当栈中没有元素时,调用该方法会发生异常
remove():检索并移除双端队列的第一个元素,不存在时抛出异常。(对比poll方法)
removeFirst()/removeLast():检索并移除双端队列的第一个/最后一个元素,不存在时抛出异常
removeFirstOccurrence(Object o)/removeLastOccurrence(Objecto):移除指定对象在此队列的的第一个/最后一个匹配性
LinkedList和ArrayList的区别:
1.LinkedList和ArrayList上访问元素的时间复杂度不同(涉及算法),ArrayList数据结构基于动态数组,LinkedList数据结构基于链表。
2.对于查询和更新数据等操作,ArrayList比较快,新增、删除等操作,LinkedList比较快。当然这里说的是宏观下的绝大部分情况,不是绝对的,但是要理解的是造成这种情况的原理,简单的来说还是因为两者的数据结构造成的
3.LinkedList数据存储相比ArrayList数据存储占用更大(在元素数量较小是基本可以忽略的)
Map(API文档:Map):
Map主要的集合类以及关系图(黑色框框的集合类将不介绍)
Map集合是由一组成对的“键值对”对象组成,可以使用键表来查找值。正如List集合中的get(序号)方法,序号和元素是对应关系的,Map集合中,键和值也是一种对应(映射)关系,所以这也叫做映射表。
映射表允许我们使用另一个对象来查找某个对象,所以也被称为“关联数组”,将某些对象(键对象)与另外一些对象(值对象)关联在一起,就可以通过键对象来查找值对象了。
键对象不允许重复,从而保证查找结果的一致性,而值对象没有键对象那样具有唯一性的要求,可以多个键都映射到一个值对象上,而且值对象又可以是一个Map集合,形成多级映射。
Map接口定义的常用方法:
clear():删除所有元素
containsKey(Object key):返回Map结合中是否包含指定的这个键
containsValue(Object value): 返回Map结合中是否包含指定的这个值
entrySet():返回一个存放键值对关系的Set集合
equals(Object object):与指定对象进行比较是否相等
get(Object key):返回指定键的映射值
isEmpty():该集合是否为空
keySet():返回一个只存放键对象的Set集合
put(K key, V value):将指定的键映射到指定的值
putAll(Map<? extends K, ?extends V> map):将指定的Map对象的每对映射关系复制到此Map中。
remove(Object key): 通过指定的键去删除该映射。
size():返回映射数量
values():获取所有值对象组成的集合。
HashMap(API文档:HashMap)
它是一个Hash表,存储的内容是键值对映射,该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,不支持线程同步,而且HashMap中的映射不是有序的。
构造方法:
HashMap():构造默认的空实例
HashMap (int capacity):构造指定容量大小的实例
HashMap (int capacity, floatloadFactor):构造一个指定大小和加载因子的实例。
HashMap (Map<? extends K,? extends V> Map):构造一个包含指定集合所有元素的实例。
HashMap的常用方法基本都是从Map接口实现来的,不做过多解释。
Iterator迭代器(API文档:Iterator):
基本作用是用来遍历并选择序列中的对象,Iterator是一个接口。使用方法是,通过集合(容器)调用Iterator()方法时返回一个Iterator对象。
接口方法有:
next():获的序列的下一个元素,第一次调用时,返回第一个元素。
hasNext():检查序列中是否还有元素。
remove():删除最新返回的元素。
------------------------------------------------分割线----------------------------------------------------------
上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。
在下十分感谢。
如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。
祝大家生活美好,干杯!~( ゜▽゜)つロ
转载请注明原作者以及附上原文章地址,谢谢。