JAVA基本容器总结(学习笔记)

JAVA基本容器总结

1. 容器继承

在java的容器里面存在两大分支分别是Collection和Map,但无论是哪一种它们共同的基本作用是储存数据

Collection图

Collection

Map图

Map

此图只涉及基本的容器类型,有部分的容器并没有列出


Collection家族

  • 迭代器Iterable

    虽然迭代器本身作为Collection的顶级接口,但是Iterable并没有任何有关容器的规范约定。但是这个接口提供了一个非常强大的迭代功能,可以解决Collection体系下所有的集合内部数据的遍历。

常见方法图表

方法名 方法返回值类型 方法描述
hasNext() boolean hasNext()是判断目标容器是否有下一位数据,如果存在返回true反之false
next() E next()可以理解为获取容器的下一位数据,其返回值类型是在Colletion的实现类实例化时确定
    ArrayList<String> arr = new ArrayList<Stirng>();
    Iterator<String> it = arr.iterator();
    while(it .hasNext){
        String str = it .next();   
    }

一般这样的方式就可以实现以Collect家族容器的遍历获取。但是这种获取无法对集合中的基本数据类型进行修改操作,想要修改数据需要对应的包装类

  • 顶层接口Collection

    Collection是集合中的顶层接口,它确定了所有集合的规范。
    所有它的实现类都可以使用它所定义的方法。在Collection的众多的实现类里面,存在着有序和无序的集合,可重复和不可重复的。
    但是这些都是尤其子接口实现,Collection只提供普遍性的操作。

    Collection本身的对象是有序可重复的

常见方法图表

方法名 方法返回值类型 方法描述
add(E e) boolean 向集合中添加e元素
clear() void 把集合内部的所有的元素全部元素
contains(Object o) boolean 判断o的对象是否在集合当中
remove(Object o) boolean 移除集合中的o对象
size() int 返回集合的大小
toArray() Object 将此集合转化一个数组
  • remove() 在移除指定的而对象的时候,如果容器存在多个此对象,只会移除第一个遇到的元素

通过Collection我们可以知道,Collection接口主要提供了一个容器的基本功能,添加、移除、清空、转换数组、返回大小、判断存在… 配合Iterabl提供的迭代遍历实现了容器的数据获取和修改。

接口List(序列)

List是Collection的有序分支,并且提供可重复元素的添加。除此之外其重写了Collection接口提供的方法,并为部分方法进行了重载,以此来展现其特性。

主要特点

  • 有序
  • 索引
  • 可重复

常见方法图

方法名 方法返回值类型 方法描述
add(E e) boolean 向列表尾部添加e元素
add(int index,E e) void 在index位置添加e元素,原index位置元素向后移
get(int index) E 获取到index位置的元素
remove(int index) E 移除index位置的元素
remove(Object o) boolean 移除o元素
set(int index,E e) E 在index位置的元素替换为e

在list的常见的方法中,存在几个重载的方法,而这几个新的方法都存在一个特性就是参数列表存在一个索引值。而这个索引值便是List家族的重要的标志(有序,有索引),也是因为这个索引List系列的容器可以支持指定位置的数据改变和for循环索引遍历。

List不支持在使用迭代器遍历时对容器的长度进行修改,进行修改该回报出并发修改异常

  • 实现类ArrayList(数组结构的List)

ArrayList集合其内部的存储结构是数组结构。由于数组结构对于数据的遍历和查询快,但是对容器内部数据的增删就慢。

因为ArrayList的实际本质是一个Object[]的数组,所以当向ArrayList添加的数据超过了Object[]的大小,就会进行数组的复制进行伸长,但是程序复制数据组的过程是非常消耗资源的,所以Arraylist的增删慢

  • 实现类LinkedList(链表结构的List)

LinkedList集合数据存储的结构是链表结构,类似于自行车的链条。这种结构有利于数据的增加和删除,但是查找很不友好。无论是哪一个查询方式,LinkedList往往是从头遍历。这就使linkedList查询速度慢。

但是正是因为Linkedlist可以对没有节点元素进行操作,在Linkedlist里面添加了大量首尾操作,可以作为堆栈和队列等数据使用

常见方法图

方法名 方法返回值类型 方法描述
addFirst(E e) void 向列表首部部添加e元素
addLast(iE e) void 向列表尾部添加e元素
getFirst() E 返回此列表的第一个元素
getLast() E 返回此列表的最后一个元素
removeLast() E 移除并返回此列表的最后一个元素
removeFirst() E 移除并返回此列表的第一个元素
pop() E 从此列表所表示的堆栈处弹出一个元素
push(E e) void 将元素推入此列表所表示的堆栈
isEmpty boolean 如果列表不包含元素,则返回true

这些都是LinkedList的特有的方法

  • 实现类Vector(数组结构的List)

JDK中最早的可增长的数组结构,已经被更为先进ArrayList淘汰。不用深究。不同之处在于其为线程安全,运算速度慢

  • Set接口(Collection另一重要分支)

set使Collection的另一大派系,其主要的于List的区别是set内部不允许存储相同的对象。
set接口没有规定太多set派系的公有方法,大部分是将collection提供的方法进行了重写,用来实现不重复元素的功能。

主要特点

  • 无索引

  • 不重复

    其set所有实现都有该特性

  • 实现类HashSet(哈希表)

HashSet其本质上是由一个HashMap集合提供(可以查看构造器源码)。
HashSet无法保证迭代的顺序和存储的顺序相同。
HashSet保证元素唯一性的方式依赖于: Object提供的 hashCode()和equals()两个方法

主要特点

  • 无序

HashSet的存储和取出都比较快。
HashSet是一个数组链表的结合体,可以参照下图

HashCode_1 HashCode_2 HashCode_3 HashCode_4
H1_element1 H2_element1 H3_element1 H4_element1
H1_element2 H2_element2 H3_element2 H4_element2
H1_element3 H2_element3 H3_element3 H4_element3
H1_element4 H2_element4 H3_element4 H4_element4

对于这张表,最上面的一排存储的是一个特定的HashCode这一排的存储方式一个数组,而每一列的元素时HashCode相同的元素,这些元素的存储方式是链表
所以对一个元素的添加,会先判断元素的HashCode是否存在,如果存在再判断该HashCode列里面的元素是否存在equals()也相同,如果都相同则无法添加,不同就加载到这一列的最后位置上。
如图:
HashSet添加流程

  • 继承类LinkedHashSet(继承自HashSet)

LinkedHashSet虽然继承子HashSet但是其是有序的HashSet。
因为LinkedHashSet运行着一个双重链接列表,其定义了迭代顺序

主要特点

  • 有序

其他的使用方式于HashSet完全一致。


Map家族

  • Map接口

Map的存储方式跟Collection有着很大不同,Map中的集合里面的数据是成对存在的,这就表明往Map集合里面添加数据的时候是一次添加两个数据的。因此Collection中的集合是被称为单列集合,而Map中的集合则被称双列集合。

主要特点

  • 数据成对出现。一为“键key”,另一个为“值value”
  • 在同一集合中key不允许重复,而值没有限制
  • 一个键只能对应一个值,而一个值可以对应多个键(类似于数学函数)

常见方法图

方法名 方法返回值类型 方法描述
get(Object key) V 返回key对应的value,如果不存在key则返回null
put(K key,V value) V 可以理解为添加也可以认为是修改key对应的value,并返回之前的值,新健返null
remove(Object key) V 移除对应的key和value
  • 实现类HashMap<K,V>

元素无序,并且为了要保证键的唯一,要重写作为键的对象的HashCode和equals这两个方法。而它的基本使用和Set接口定义的无区别

  • 实现类LinkedHashMap<K,V>

HashMap的子类,实现了有序

  • 实现类HashTable<K,V>

HashTable的使用特点和HashMap一样,但是它是一个线程按群的集合,运算算速度慢。已被淘汰。但是它的一个子类Properties仍然再IO里面使用

HashMap允许放置null,null但是HashTable不允许null值null键


发布了31 篇原创文章 · 获赞 25 · 访问量 6503

猜你喜欢

转载自blog.csdn.net/qq_43719932/article/details/98654080