当前位置: 首页 > 图灵资讯 > 技术篇> Java常用集合解析

Java常用集合解析

来源:图灵教育
时间:2023-04-28 09:19:00

  Java中最常用的两个顶层集合是Collection和Map,其中Colection接口由List和Set组成,都是Collection的子接口。List接口集合的主要特点是存储可重复,插入顺序有序。主要包含:ArrayList,LinkedList。Set接口集合的主要特点是存储不可重复,插入和取出顺序无序。主要包含:HashSet,TreeSet。在Map接口下,实现键值对关系的数据集合,专门处理键值映射数据的存储,可根据键实现对值操作。主要包含:HashMap,TreeMap。下面将逐一介绍这些常用的集合。

  ArrayList是实际开发中使用频率最高的集合。它实现了长度可变的数组,并在内存中分配连续空间。遍历元素和随机访问元素的效率相对较高,这是List接口的实现,线程不安全。ArrayList的实现原理和特点: 数组实现, 查找快, 为什么要快速查询增删慢数组?因为数组的内存空间地址是连续的.ArrayList底层维护Object[] 默认数组的长度为10,用于存储对象。可以通过 new ArrayList(20)用于存储对象数组长度的显式指定。底层实现自动扩容,当默认或指定容量不足以存储对象时,容量自动增加到原容量的1.5倍。因为ArrayList是数组实现的, 在增加和删除时,将涉及数组增容, 还有复制元素,所以慢。可直接按索引找到数组, 因此,在搜索过程中可以快速考虑。假设未知添加元素到数组0下标,则原始下标位置的元素需要整体向后移动,数组可能需要增加容量。一旦增加容量,就需要将旧数组的内容复制到新数组中,因此数组的增加和删除效率非常低。

  LinkedList采用链表存储方式。插入和删除元素时效率高,搜索数据慢。LinkedList的实现原理和特点:由于LinkedListt::内存中的地址是不连续的,需要让前一个元素记住下一个元素。因此,每个元素都保存在下一个元素的位置。虽然也有投标,但在搜索时,你需要从零开始向下搜索,这显然不如数组快。然而,当链表插入新元素时,只需要让前一个元素记住新元素,让新元素记住下一个元素。所以插入得很快。由于链表的实现, 只要让前一个元素记住自己就可以增加, 删除时,让前一个元素记住后一个元素, 记住前一个元素的后一个元素. 这种增删效率更高。由于链表的实现, 只要让前一个元素记住自己就可以增加, 删除时,让前一个元素记住后一个元素, 记住前一个元素的后一个元素. 这种增删效率更高。但查询时需要一个一个的遍历, 因此效率较低。

  Hashset采用哈希表实现(底层实际上是Hashmap实例),不能保证 set 迭代顺序;特别是,它不能保证顺序不变,不能对集合元素进行排序,这是允许使用的 null 元素。Hashset的实现原理和特点:Hashset由哈希表实现,哈希值存储在哈希表面。Hashset存储元素的顺序不是按照存储时的顺序(明显不同于List) 它是根据哈希值存储的,所以数据也是根据哈希值获取的(这里没有必要深入研究哈希算法,以了解数据的编码处理行为)。Hashset之所以不存储重复元素,是因为使用hashcode和equals方法对存储的数据进行编码比较,不同的编码会存储在集合中。如何去除Hashset的重复原理如下图所示:

Java常用集合解析_实现原理

  图1:hashCode值不同

  图2:hashCode值相同,但equals情况不同。

  HashSet:元素在内存中的位置是通过hashCode值确定的。多个元素可以存储在hashCode位置。hashcode() equals()值相同 回到true 时,hashset 集合认为这两个元素是相同的元素。只存储一个元素(不能放置重复元素)。调用原理:首先判断hashcodee 如果方法的值相同,则判断equalss 不同的话,equals法是不会调用的。Hashset是如何判断两个元素重复的?以hashcode方法和equals方法保证元素的独特性,add()返回的是boolean类型来判断两个元素是否相同,首先要判断元素的hashcode值是否一致,只有在这个值一致的情况下,才能判断equals方法,如果存储在Hashset中的两个对象hashcode方法的值相同,equals方法返回的结果是true,那么hashset认为这两个元素是相同的元素,只存储一个(重复元素不能存储)。

  Treeset采用红黑树的数据结构,默认自然排序元素(String)。红黑树算法规则: 左小右大。与Hashset相比,Treset集合最大的特点是能够进行排序,需要指定排序规则:1.元素本身具有比较性,需要元素实现Comparable接口,重写Compareto方法,即使元素本身具有比较性,这种方法称为元素自然排序,也称为默认排序。2.容器具有比较性,当元素本身没有比较性,或者自身的比较性不是所需要的。所以这个时候可以让容器本身拥有。需要定义一种类实现接口Comparator,重写Compare方法,并将接口的子类实例对象作为参数传递给Tremap集合的结构方法。

  Map接口中最常用的实现类是HashMap,底部也是哈希表的数据结构。线程不同步,可以存储null键和null值,不安全。其次,Treemap的实现原理与Treeset基本相同,但Map是一对应的。注意:如果在Map集合中添加的键值重复,将覆盖原始键值对,替换为新键值对。

  学习集合的选择和使用将帮助您在实际开发过程中事半功倍。应根据实际项目需要选择使用什么样的集合,以补充项目。