天天看点

java数据结构了解与集合学习集合

数据结构

数据结构是指逻辑意义上的数据组织方式及其相应的处理方式。

逻辑意义:数据结构的抽象表达非常丰富,而实际物理存储方式相对单一。比如:二叉树结构,在物理上可能也是基于链式存储的。

数据组织方式:

比如树、图、队列、 晗希等。树可以是二叉树、三叉树、 树等,图可以是有向图或无向图,队歹lj 是先

进先出的线性结构;晗希是根据某种算法直接定位的数据组织方式。

处理方式:调用算法进行增删改查处理。

数据结构的分类:

线性结构

树结构

图结构

哈希结构:

一个元素为链表的数组,综合了数组与链表的优点。

集合

程序 = 数据结构 + 算法

集合做为数据结构的载体,可对元素进行加工和输出,以一定的算法实现最基本的增删改查功能,因此集合是所有编程语言的基础。

java数据结构了解与集合学习集合

从上图可以看出,集合分为实现Collection的Set、List、Queue和按照key-value存储的Map。

List集合

框架图:

java数据结构了解与集合学习集合

由框架图可知,List常用的两个类为ArrayList和LinkedList。

ArrayList与LinkedList的区别:

数据结构:

ArrayList是基于数组实现的,LinkedList是基于双链表实现的。

功能:

LinkedList类不仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,这个接口具有队列和栈的性质,因此LinkedList可以作为双向队列 ,栈和List集合使用,功能强大。

效率:

Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的,可以直接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。Array获取数据的时间复杂度是O(1),但是要插入、删除数据却是开销很大的,因为这需要移动数组中插入位置之后的的所有元素。

LinkedList的随机访问集合元素时性能较差,因为需要在双向列表中找到要index的位置,再返回;但在插入,删除操作是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

内存:

LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

Set集合

Set(接口) 添加到 Set 的每个元素都必须是独一无二的;否则Set 就不会添加重复的元素。添加到 Set 里

的对象必须定义equals(),从而建立对象的唯一性。Set 拥有与 Collection 完全相同的接口。一个 Set不能

保证自己可按任何特定的顺序维持自己的元素

HashSet* 用于除非常小的以外的所有Set。对象也必须定义 hashCode()

TreeSet 由一个“红黑树”后推得到的顺序 Set。这样一来,我们就可以从一个Set 里提到一个

顺序集合

Set框架

java数据结构了解与集合学习集合

由Set框架可知,Set主要分为TreeSet和HashSet以及HashSet的继承类LinkedHashSet

HashSet:

HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。底层数据结构是哈希表结构。

内部存储机制

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals方法比较true,但它们的hashCode方法返回的值不相等,HashSet将会把它们存储在不同位置,依然可以添加成功。

也就是说。HashSet集合判断两个元素的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。

HashSet的特点:

无序不可重复,值可以为null;

靠元素重写hashCode方法和equals方法来判断两个元素是否相等,如果相等则覆盖原来的元素,依此来确保元素的唯一性

LinkedHashSet

LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说当遍历集合LinkedHashSet集合里的元素时,集合将会按元素的添加顺序来访问集合里的元素。

因此:

LinkedHashSet是hash表结构,有序不可重复的。可以放入null

TreeSet

由Set框架图可知,TreeSet除了与HashSet一样继承了AbstractSet外,也实现了SortedSet接口。因此TreeSet可以确保集合元素出于有序状态。

内部存储机制

TreeSet内部实现的数据结构是树结构-红黑二叉树,默认排序为从小到大。

TreeSet的特点:

红黑二叉树结构,有序不可重复,可排序,不能存入null值。

与HashSet集合相比,TreeSet还提供了几个额外方法:

  • Comparator comparator():

    如果TreeSet采用了定制顺序,则该方法返回定制排序所使用的Comparator,如果TreeSet采用自然排序,则返回null;
  • Object first()

    :返回集合中的第一个元素;
  • Object last():

    返回集合中的最后一个元素;
  • Object lower(Object e)

    :返回指定元素之前的元素。
  • Object higher(Object e)

    :返回指定元素之后的元素。
  • SortedSet subSet(Object fromElement,Object toElement):

    返回此Set的子集合,含头不含尾;
  • SortedSet headSet(Object toElement)

    :返回此Set的子集,由小于toElement的元素组成;
  • SortedSet tailSet(Object fromElement)

    :返回此Set的子集,由大于fromElement的元素组成;

Queue集合

队列,这里不多介绍

Collections

Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

《java编程思想》内使用Collections概括:

boolean add(Object) *保证集合内包含了自变量。如果它没有添加自变量,就返回 false(假)

boolean addAll(Collection) *添加自变量内的所有元素。如果没有添加元素,则返回 true(真)

void clear() *删除集合内的所有元素

boolean contains(Object) 若集合包含自变量,就返回“真”

boolean containsAll(Collection) 若集合包含了自变量内的所有元素,就返回“真”

boolean isEmpty() 若集合内没有元素,就返回“真”

Iterator iterator() 返回一个反复器,以用它遍历集合的各元素

boolean remove(Object) *如自变量在集合里,就删除那个元素的一个实例。如果已进行了删除,就返回

“真”

boolean removeAll(Collection) *删除自变量里的所有元素。如果已进行了任何删除,就返回“真”

boolean retainAll(Collection) *只保留包含在一个自变量里的元素(一个理论的“交集”)。如果已进

行了任何改变,就返回“真”

int size() 返回集合内的元素数量

Object[] toArray() 返回包含了集合内所有元素的一个数组

*这是一个“可选的”方法,有的集合可能并未实现它。若确实如此,该方法就会遇到一个

Map集合

学习map集合,应该首先了解map的数据结构:hash表结构。

Map的框架图如下:

java数据结构了解与集合学习集合

由框架图可知,Map主要分为HashMap和TreeMap,以及集成HashMap的LinkedHashMap。

JDK 1.8 对 HashMap 进行了比较大的优化,底层实现由之前的 “数组+链表” 改为 “数组+链表+红黑树”,

即当链表的长度较少时依然是链表结构,而当链表长度大于8后,会转为红黑树。

如下:

java数据结构了解与集合学习集合

详细的HashMap教程:https://blog.csdn.net/v123411739/article/details/78996181

HashMap常见问题:https://blog.csdn.net/v123411739/article/details/106324537