Fork me on GitHub

极客时间课程《数据结构与算法之美》笔记02 - 数组与容器

数组与容器

线性表

每个线性表上的数据最多只有前和后两个方向。数组、链表、队列、栈都是线性表。
与此对应,非线性表指数据之间不是简单的前后关系。比如:二叉树、堆、图等。

数组有连续的内存空间和相同类型的数据,这两个特性可以使其“随机访问”。

纠正知识点:数组和链表的区别
链表适合插入、删除,时间复杂度 O (1);数组适合查找,即便是排好序的数组,用二分查找,时间复杂度也是 O (logn)。所以,正确的表述应该是:数组支持随机访问,根据下标随机访问的时间复杂度为 O (1)。

容器与数组

Java 中的 ArrayList、C++ STL 中的 vector均是优秀的容器。

ArrayList优势:

  • 将很多数组操作细节封装
  • 支持动态扩容

扩容操作耗时,最好创建ArrayList的时候事先指定数据大小。

选用ArrayList和数组的区别:
1.Java ArrayList 无法存储基本类型,比如 int、long,需要封装为 Integer、Long 类,而 Autoboxing、Unboxing 则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。

  1. 如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。

  2. 当要表示多维数组时,用数组往往会更加直观。比如 Object [][] array;而用容器的话则需要这样定义:ArrayList array。

一般业务开发选择容器就足够了,省时省力。一般影响不到整体性能。

数组从0开始编号:
1.偏移地址,0代表偏移量为0。
2.历史遗留问题。

posted on 2019-03-07 16:16  JackKing_defier  阅读(192)  评论(0编辑  收藏  举报