营收|藏在Java数组的背后,你可能忽略的知识点


营收|藏在Java数组的背后,你可能忽略的知识点
文章图片
营收|藏在Java数组的背后,你可能忽略的知识点
文章图片
营收|藏在Java数组的背后,你可能忽略的知识点
文章图片
引言概念数组是数据呈线性排列的一种数据结构 , 它用一组连续的内存空间 , 来存储一组相同数据类型的数据 , 表示一组相同类型的数据的集合 , 具有固定的长度 , 并且在内存中占据连续的空间 。
数组是基本上所有语言都会有的一种数据类型 , 是我们在开发过程中经常会接触到的 , 所以我们很有必要了解数组的相关特性
数组的定义和使用需要通过方括号[

Java 中 , 数组是一种引用类型 。
Java 中 , 数组是用来存储固定大小的同类型元素 。
区别于C/C++数组存储结构区别:
C数组:数组空间是一次性给定的 , 优先访问低地址 , 自底向上而放元素 。
在内存中是连续存储的 , 并且所有数组都是连续的 , 都可作为一维数组看待 。
同时 , C数组是可以动态申请内存空间的 , 也就是可以动态扩容的 , 而Java数组是不行的 , 当然Java也提供了ArrayList动态数组类
如下图 , 一个二维数组就可以看成一个一维数组 , 只是里面存放的元素为一维数组 。 所以C中的数组是呈线性结构
Java中的数组就不一样 , 在Java中 , 数组都是引用实体变量 , 呈树形结构 , 每一个叶子节点之间毫无关系 , 只有引用关系 , 每一个引用变量只引用一个实体 。
Java数组是会做边界检查的 , 所以当你越界访问时 , 会抛出 RuntimeException , 而在C或C++是不做边界检查的
如图 , 上面的例子是这样表示的 。 在堆内存中 , 各个一维数组的元素是连续的 , 但各个一维数组之间不是连续存放的 。
数组是对象吗?
C语言是面向过程的语言 , 在这里不讨论
C++中的数组不是对象 , 只是一个数据的集合 , 而Java中的数组是对象 , 这一点在后面会讲到和验证
区别于容器Java 中 , 容器是用来保存多个对象的东西.严格来说是保存对象的引用.因为对象实际的数据是放在另外的地方的.放在容器中的只是指向那块内存区域的一个标识
Java 中 , 既然有了强大的容器 , 是不是就不需要数组了?答案是不
诚然 , 大多数情况下 , 应该选择容器存储数据 。
数组和容器的区别有:效率类型识别以及存放基本类型的能力
1、Java 中 , 数组是一种效率最高的存储和随机访问对象引用序列的方式 。 数组的效率要高于容器(如ArrayList
2、类型识别方面 , Java容器ListSetMap在处理对象的时候就好像这些对象都没有自己的类型一样 , 容器将它所含的元素都看根类Object类型 , 这样我们只需创建一种容器 , 就能把所有的类型的对象全部放进去 。 但是当取出数据时 , 需要我们自己进行类型转换 , 这个问题在Java引入泛型进行类型检查后 , 与容器类一起使用就可以解决类型转换的问题
3、数组可以持有值类型 , 而容器则不能(必须用到包装类)
数组特性随机访问非随机访问:就是存取第N个数据时 , 必须先访问前(N-1)个数据 (链表)
随机访问:就是存取第N个数据时 , 不需要访问前(N-1)个数据直接就可以对第N个数据操作(数组)


推荐阅读