Java笔记整理(四)并没有多维数组
2019-08-16 11:45:29来源:博客园 阅读 ()
Java笔记整理(四)并没有多维数组
近日在读《疯狂Java讲义》精粹第二版,部分语述摘自其中,自己边敲边理解
前言
我们知道,Java语言支持的类型有两种: 1.基本类型(即八大基本数据类型),不是本文讨论的重点 2.引用类型 数组类型本身也是一种引用类型,因此数组变量其实只是一个引用,说白了就是一个地址指针,它指向存放数组元素的真实内存(堆内存) 我们也知道:
- 在平常的学习过程中,我们也经常使用数组,我们知道,数组名就是一个指针常量。
- 数组有一维数组和多维数组之说,但从内存的角度来看,其实并没有多维数组。
- 因为数组被分配到的是一块连续的内存,并且数组的存储方式是很多个一维数组连接成一个大的一维数组。
例子:
//创建一个Object[]类型的一维数组,动态初始化长度为5 (其他类型也可以)——这是第一维数组 Object[] obj = new Object[5]; // 循环输出一下 System.out.println("这是一维数组的元素的值,系统自动初始化为null"); for(Object out_obj:obj){ System.out.print(out_obj + "\t"); } //输出: null null null null null
Q:为什么叫动态初始化呢? A:概念:只指定了数组长度,由系统自动为数组元素赋初始值,即为数组的动态初始化; 反之,如果我们指定了每个数组元素的初始值,由系统决定数组长度,则称为数组的静态初始化。 这是书里面的原文,我的理解:以是否手动赋初始值来区别动态和静态。 因为数组长度一旦确定后是不可变的,但数组元素的值是可变的,可变的量才具有讨论动态和静态的必要。
//接着,我们输出一下数组obj的第一个元素的值 System.out.println("这是一维数组的第一个元素的值(引用前):" + obj[0]);//结果为:null
//将obj数组的第一个元素作为引用,指向一个新的Object数组,同样是动态初始化——这是第二维数组 obj[0] = new Object[5]; //我们暂时不为数组元素赋初值,方便后面继续拓展第三维的数组 System.out.println("这是一维数组的第一个元素(引用后的值为指向第二维数组的首地址):"+ obj[0]); //结果为:[Ljava.lang.Object;@74a14482
那如果我们想输出第二维的数组obj[0]中的元素该怎么办? obj[0][0]? 对于手动扩展来说,这是不可取的。 还记得我们开头定义的只是一个长度为5的一维数组吗? 第一维数组的类型是Object[],它的元素,也就是obj[i](i=01234),是Object类型的。 因此我们应该先把obj[0]强制转换为Object[]类型,再通过 ((Object[])obj[0])[0] 来访问第二维数组中的第一个元素 拆成两步就是这样: Object[] new_obj0 = (Object[])obj[0]; //强制转换 System.out.println(new_obj0[0]); //第一维数组的第一个值—>指向的->第二维数组的第一个值,暂时是null 看起来很复杂,如果一开始直接定义二维数组再进行引用的话: Object[][] obj = new Object[5][]; //第一维数组的值都为null System.out.println(obj); // [[Ljava.lang.Object;@74a14482 obj[0] = new Object[]{1,2,1,1,4}; //将一维数组的值作用引用指向一个Object类型的数组 System.out.println(obj[0]); //[Ljava.lang.Object;@1540e19d System.out.println(obj[0][0]); //1 这样就不用强制转换了。 但其实观察上面那两个地址值可以看出还是有区别的,地址值不同我肯定知道啦 有没有观察到obj前面是有两个 '['的,而obj[0]是只有一个的 我的想法是可能是系统对地址值还是做了分类的,这只是我的猜测,虽然好像没什么用。 而手动拓展要注意几点: (1)obj[0]需要强制转换为Object[]数组类型: 即((Object[])obj[0])[0]才表示二维数组的第一个元素(因为内存并没有开辟二维数组的空间呀) (2)需要对所要访问的二维数组进行初始化值(动态初始化或静态初始化均可),否则访问会返回空指针异常 (3)对于上面创建的一维数组来说,系统已经为其分配初始值null了 只有这样:obj[0] = new Object[]{1,2,1,1,4};或者 obj[0] = new Object[length]; 将一维数组的第一个元素作为引用,指向一个新的Object[]数组,他才是一个地址指针
本文只是通过定义一维数组,然后手动拓展成二维数组,多维就是照葫芦画瓢而已。可以看看下面这个图 数组元素引用后就指向下一维数组的首地址
我的想法是多维数组在内存里其实就是树状结构,只有一个父顶点,子顶点可以无限逐层向下扩展,形成一颗无限分支的树 我只是想弄清楚实际上并没有多维数组,与其说多维,多重数组是不是更正确一点呢?大家怎么认为呢? 这是我的学习笔记,请大家多多指正。希望自己继续坚持!
原文链接:https://www.cnblogs.com/James-XGB/p/11289416.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Spring再次学习(1)
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash