番禺网站建设技术,做百度移动网站点,陕西省医院信息化建设规范与测评标准—网站建设评分标准与方法,宁波网站商城建设短文涨姿势#xff0c;看了不白看#xff0c;不关注等啥#xff1f;几乎所有的高级语言当中#xff0c;都提供了一种叫做”数组”的东西#xff0c;Java语言当然也不例外。我们通过数组可以很方便的存储和管理一组数据。因为在Java语言当中使用数组非常的方便#xff0c;…短文涨姿势看了不白看不关注等啥几乎所有的高级语言当中都提供了一种叫做”数组”的东西Java语言当然也不例外。我们通过数组可以很方便的存储和管理一组数据。因为在Java语言当中使用数组非常的方便所以导致很多初学者忽略了对数组的深入学习本文就通过七个问题来帮助初学者深入理解一下Java语言的数组到底是怎么回事。一、数组是变量的简单叠加吗我们在学习Java的时候知道一个int类型的变量可以存储一个整数而一个int类想的数组可以存储多个整数。于是很多人认为数组只不过是变量的简单叠加而已无非是变量存1个数数组存多个数。其实不然Java语言是把数组当作一个“对象”来看待的。我们来看下面的代码我们可以看到在代码中声明了int型变量a和int型数组bb的长度为1。a和b都只能存储1个int型数据似乎它们之间没什么区别。但是请注意a和b之间其实是有本质区别的a是一个基础数据类型的变量而b则是一个对象正因为它是一个对象所以我们才可以调用到它的getClass()方法。那么紧接着小伙伴们会问b既然是一个对象那么这个对象是什么类型的呢我们可以通过“b.getClass().getName()”获得它类型的名称是” [I”。读者也可以通过这种方式获得其他几种基础数据类型数组的类型名称。最重要的是我们必须搞清楚数组不是变量的简单叠加即便是基础数据类型的数组也是以对象的形式存在的。二、为什么数组的下标是从0开始的同很多编程语言一样Java语言数组的下标也是从0开始的。很多初学者都不理解为什么数组下标要从0而不是从1开始这太不符合我们的日常计数习惯了。为了说清楚这个问题我们还是先看一段代码在这段代码中创建了一个长度为5的数组并命名为a。在程序实际运行的时候会分配一组连续的空间这组空间中可以存储5个int型数据。为了能够准确的从这组空间的任意一个单元中找到数据虚拟机必须能够对这组空间中任意一个单元做出识别。那么如何识别每个单元呢虚拟机可以把每个单元都进行单独的命名这样做当然能够达到目的但是这么做跟使用变量就没什么区别了更体现不出这组数据是一个连续的整体。实际的情况是虚拟机给这组空间的第一个单元命名为a如果希望找到a本身那么就直接用a[0]来表示其中方括号中的0表示偏移量。偏移量为0就表示找的就是a这个空间中的数据而a[1]表示以a为基准点偏移1个单元这样就找到了数组中第2个元素以此类推想找到数组中第5个元素就以a这个单元为基准点再偏移4个单元即可。因此我们就可以知道数组的下标本质上并不是数组元素的编号而是以数组首元素为基准点所偏移的量。这就是数组下标从0开始的原因。三、数组的长度为什么可以用变量表示我们还是先来看一段代码这段代码中在创建数组的时候以变量表示了这个数组的长度这种做法放到Java语言中似乎很常见但是如果使用C语言编程在创建数组的时候数组的长度必须是一个固定的值不能用变量来表示。很多人似乎对这个问题不以为然只是简单的认为这只是Java和C语言之间一点简单的语法差别而已。其实问题远不是这么简单。这个简单的语法差别其实体现出了Java与C语言之间编译和运行机制本质的不同。变量是运行时才被赋值的Java语言允许把数组的长度以变量的形式来表示其背后的根本原因就是允许数组一直等到”运行时”才把长度确定下来。也就是说程序员可以在编码的时候不用规定数组的长度等到程序实际运行的时候根据实际需要去确定数组的长度这样大大增加了程序的灵活性。举个例子如果我们编写程序要求用户输入几个数字保存到数组中然后进行排序用户输入多少个数字不确定。如果我们用Java语言去完成这个程序只要先让用户输入他想对多少个数字进行排序然后把数字的个数保存到一个变量中接着以这个变量的值作为长度创建数组就可以。但是如果是用C语言来完成程序那么程序员必须在编写代码的时候就把数组的长度定下来而不能等到程序运行的时候再去确定。因为C语言不能动态的在运行时确定数组的长度必须在编译阶段就把长度确定下来。但是程序员在编码的时候并不确定用户要对多少数字完成排序于是就只能以经验推测创建一个他认为”足够大”的数组来存放排序的数字。如果创建的数组太大则浪费空间如果数组太小则无法保存全部数字。说了这么多重点其实就一句话Java语言的数组可以在”运行时”确定长度并且这个特点大大的增加了程序的灵活性。 四、Java数组的长度可以为0吗这个问题很简单只要写一段代码就可以得到答案可以关键问题来了长度为0的数组不能存数据这种数组有什么意义呢前面说过Java语言允许在程序运行过程中动态确定数组长度。那么我们就可以设想这样的一个场景要求编码查询出考试总分在700分以上的学员并且把他们的姓名存储到一个字符串数组中。假如经过查询之后发现没有成绩在700分以上的学员该如何表示这个查询结果呢如果查询方法返回null来表示没有查到符合条件的数据会对后续程序带来一定的风险因为毕竟空对象可能会导致后面的处理代码中抛出空指针异常。而用一个长度为0的数组来表示查询结果就安全多了仅能体现出没有查到符合条件的数据又降低了抛出异常的风险。五、Java语言中的数组可以扩大容量吗答案是不可以因为数组一旦分配了空间之后如果想在原来空间的基础上扩大容量就如同是扩张地盘势必会影响到内存中其他数据的存储所以Java语言不允许数组扩大容量。网上有很多资料讲解了如何扩大数组的容量并给出了实现代码。如果你仔细去看这些代码你会发现这些所谓扩大数组容量的算法其实现过程都是新创建一个更大的数组然后把原数组中的数据拷贝到新数组中最终返回那个新创建的数组。因此这种所谓的扩容算法其实并不是真正的扩容。六、可以创建抽象类数组吗还是看代码 代码中创建了一个抽象类A并且在main()方法中创建了一个A类型的数组。问题又来了抽象类A不能创建对象而现在不仅创建了对象并且还是一组这是怎么回事其实这也是很多初学者在理解引用类型数据数组的一个误区认为数组中存放的某种类型的对象。其实不然引用数据类型的数组中存放的并不是对象而只是能指向这种对象的引用而已。就拿上面这段代码来说数组a中并没有存放5个A类型的对象而只是存放了5个能够指向A类型对象的引用这些引用在数组初始化的过程中都指向空对象(null)所以千万不要错误的认为创建了某类型的数组同时就创建了N个该类型的对象。代码中数组a中所存放的那些引用将来所指向的必定也是A类子类的对象因为A类自身根本就不能创建对象。 七、多维数组的length属性值是多少 看代码以上代码运行输出结果会是多少呢一部分初学者会认为输出的结果是12因为这个数组能够存储12个数字。但程序实际运行输出的结果却是3这是为什么呢就是因为无论数组本身的维度是多少在Java虚拟机看来这个数组都是一维数组有小伙伴可能不解a明明是一个二维数组怎么会被当作是一维数组呢我们可以看下图来帮助理解我们可以看到图中是一个3行4列的二维数组。但是如果我们把数组中的每一行看作是一个元素那么这个二维数组就可以被理解为一个一维数组数组中包含3个元素只不过每个元素并不是一个简单的数字而是一个一维数组。也就是说这个二维数组可以被理解为”由3个一维数组组成的数组”。Java语言就是以这样的方式来管理数组的无论数组维度是多少都被当作一维数组如果数组中的元素又是数组(严格的表述应该是数组元素是指向一维数组的引用)那么就形成了多维数组。因此刚才在代码中看到的那个二维数组a它的length属性值为3而不是12。希望通过这七个问题能够帮助初学者深入理解Java语言的数组。 看短文涨姿势如想系统学习Java编程点击下方的“了解更多”即可不让你进去用QQ登录就可以啦有问题也可以加入我的QQ群一起讨论