




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA数组初始化及应用Java数组声明、创建、初始化本文讲述了Java数组的几个相关的方面,讲述了对Java数组的声明、创建和初始化,并给出其对应的代码。一维数组的声明方式:type var; 或type var;声明数组时不能指定其长度(数组中元素的个数),Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 数组元素的个数实例:TestNew.java:程序代码:1. publicclassTestNew 2. 3. publicstaticvoidmain(Stringargs) 4. ints; 5. inti; 6. s=newint5; 7. for(i=0;i=0;i-) 11. System.out.println(+si); 12. 13. 14. 初始化:1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。实例:TestD.java(动态):程序代码:1. publicclassTestD 2. 3. publicstaticvoidmain(Stringargs) 4. inta; 5. a=newint3; 6. a0=0; 7. a1=1; 8. a2=2; 9. Datedays; 10. days=newDate3; 11. days0=newDate(2008,4,5); 12. days1=newDate(2008,2,31); 13. days2=newDate(2008,4,4); 14. 15. 16. 17. classDate 18. 19. intyear,month,day; 20. Date(intyear,intmonth,intday) 21. this.year=year; 22. this.month=month; 23. this.day=day; 24. 25. 26. TestS.java(静态):程序代码:1. publicclassTestS 2. 3. publicstaticvoidmain(Stringargs) 4. inta=0,1,2; 5. Timetimes=newTime(19,42,42),newTime(1,23,54),newTime(5,3,2); 6. 7. 8. 9. classTime 10. 11. inthour,min,sec; 12. Time(inthour,intmin,intsec) 13. this.hour=hour; 14. this.min=min; 15. this.sec=sec; 16. 17. TestDefault.java(默认):程序代码:1. publicclassTestDefault 2. 3. publicstaticvoidmain(Stringargs) 4. inta=newint5; 5. System.out.println(+a3); 6. 7. JAVA基础之一维数组和多维数组本文介绍的是java中的一维数组和多维数组,希望对你有帮助,一起来看。数组,是每一种程序设计语言中都存在的。今天给大家介绍JAVA中的数组。建议大家可以看看这几篇关于数组的文章,浅析C+中的动态多维数组和关于java数组的深度思考java语言中,数组是一种最简单的复合数据类型。数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素。数组有一维数组和多维数组。1一维数组的定义1. typearrayName;类型(type)可以为Java中任意的数据类型,包括简单类型和复合类型。例如:1. intintArray; 2. DatedateArray;2一维数组的初始化(1) 静态初始化1. intintArray=1,2,3,4; 2. StringstringArray=abc,How,you;(2) 动态初始化1)简单类型的数组1. intintArray; 2. intArray=new3. int5;2)复合类型的数组1. StringstringArray; 2. StringstringArray=newString3;/*为数组中每个元素开辟引用空间(32位)*/3. stringArray0=newString(How);/为第一个数组元素开辟空间 4. stringArray1=newString(are);/为第二个数组元素开辟空间 5. stringArray2=newString(you);/为第三个数组元素开辟空间3一维数组元素的引用数组元素的引用方式为:1. arrayNameindexindex为数组下标,它可以为整型常数或表达式,下标从0开始。每个数组都有一个属性length指明它的长度,例如:intArray.length指明数组intArray的长度。多维数组Java语言中,多维数组被看作数组的数组。1二维数组的定义1. typearrayName; 2. typearrayName;2二维数组的初始化(1) 静态初始化1. intintArray=1,2,2,3,3,4,5;Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。(2) 动态初始化1) 直接为每一维分配空间,格式如下:1. arrayName=newtypearrayLength1arrayLength2; 2. inta=newint23;2) 从最高维开始,分别为每一维分配空间:1. arrayName=newtypearrayLength1; 2. arrayName0=newtypearrayLength20; 3. arrayName1=newtypearrayLength21; 4. 5. arrayNamearrayLength1-1=newtypearrayLength2n;3) 例: 二维简单数据类型数组的动态初始化如下,1. inta=newint2; 2. a0=newint3; 3. a1=newint5;对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。而且,必须为每个数组元素单独分配空间。例如:1. Strings=newString2; 2. s0=newString2;/为最高维分配引用空间 3. s1=newString2;/为最高维分配引用空间 4. s00=newString(Good);/为每个数组元素单独分配空间 5. s01=newString(Luck);/为每个数组元素单独分配空间 6. s10=newString(to);/为每个数组元素单独分配空间 7. s11=newString(You);/为每个数组元素单独分配空间3二维数组元素的引用对二维数组中的每个元素,引用方式为:arrayNameindex1index2例如:1. num10;4二维数组举例:【例】两个矩阵相乘1. public2. classMatrixMultiply 3. public4. static5. voidmain(Stringargs) 6. inti,j,k; 7. inta=new8. int23;/动态初始化一个二维数组 9. intb=1,5,2,8,5,9,10,-3,2,7,-5,-18;/静态初始化 10. 11. 一个二维数组 12. intc=new13. int24;/动态初始化一个二维数组 14. for(i=0;i2;i+) 15. for(j=0;j3;j+) 16. aj=(i+1)*(j+2); 17. for(i=0;i2;i+) 18. for(j=0;j4;j+) 19. cj=0; 20. for(k=0;k3;k+) 21. cj+=ak*bkj; 22. 23. 24. System.out.println(*MatrixC*);/打印MatrixC标记 25. for(i=0;i2;i+) 26. for(j=0;j4;j+) 27. System.out.println(cj+); 28. System.out.println(); 29. 30. 31. 有关Java数组间赋值的问题本文由作者在实际调试中出现问题解决问题,从而发现的Java数组间赋值的一些做法、技巧和需要注意的方面。今天写个JAVA程序,老是出现错误,于是单步调试了很久,真的很久,NND ,几百行的程序调试了老半天了都,结果终于被我发现问题的说在了,不过费了这么多事,原来是一个JAVA的一个细节的东西在搞鬼,我是初学JAVA,对JAVA的了解也没有那么深入,所以它的特性也么有掌握好,不过今天被这些细节的东西整惨了。大家都知道,在C 和C+中,数组是不能直接被赋值的,假设有两个数组 a10,b10,在C和C+中是不能以 a=b的方式把b中的内容赋值给相应的数组a的,因为a和b的值其实就是该数组的头指针指向的地址,当然如果很了解数组的实现原理的话,这就很好理解了,在数据结果的可能中有涉及到,总之知道数据的数组名就是数组的头指针指向的首个元素的地址,如果能这样理解的话,那么用大腿想一下就知道a=b是不能实现数组的赋值的,一般在C和C+中我们采用了一个循环来单个赋值,类似这样的:1. for(inti=0;i10;i+)2. ai=bi;方式来实现,学了这么久的C和C+,用的多了,也不觉得费事。但是在JAVA中却不想C和C+一样,JAVA 很聪明,它可以使用 a=b 的方式来将b 赋值给a,这里的赋值要注意了,在JAVA中使用 a=b 的时候,在 a 中以数组的方式来输出内容的时候,跟b 的内容一模一样,说明这样的方式可行,我的程序里面就是这样用的,结果整出了BUG来了。一开始发现不管是用 a=b 还是用 a=a.clone(); 结果都是一样,有些不解,不过现在我完全清楚了。为了说明这个问题,以一段程序演示一下:1. privateintsubResources(intaa,intbb) 2. 3. /做减法 4. inta=aa; 5. intb=bb; 6. for(inti=0;ia.length;i+) 7. ai=ai-bi; 8. returna; 9. 这是用来实现两个数组想减的函数,在调用的程序中这样使用1. intallo=pcb0.getAllocation().clone();/方式1 2. 3. /intallo=pcb0.getAllocation()/方式2 4. intallocation=this.addResources(allo,request);上面两种方式的参数传入带来的不同结果是,当你在函数addResources 修改了传入参数的值的时候,方式1不能改原来的数据,方式2能改变原来的数据。方式1它赋值的时候是先创建一个数组的副本,再把副本来给目标数组赋值,这样副本数组的地址和原来数组的地址当然不是同一个了,这样不管你怎么改,方式1它都不会改变原来的数据,方式2则不一样,方式2它直接将数据的地址赋值给目标数据,这样两个数组不同的数组名,其实指的都是同一个地址,这样当然可以改变原来的值了。这样分析,它有点像C+中的函数传参中的 指针和引用传值一样,由于java中都摒弃了指针,所以所有的指向关系都使用了引用类型,用C+用久了就容易犯这样的错误。不像C+中这样传值 addResources (int *a,int *b) 或者 addResources (int a,int b) 。这会吃亏了,看来这辈子在这个地方就这次了,学东西还得专注一点啊,现在明白了为什么招聘会上的基础题看起来简单,却不是每个人都能答好的。有关JVM处理Java数组方法的思考在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。本文来自jarfield的博客,原文标题为为什么如此获取Java数组的长度。记得vamcily 曾问我:“为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(成员方法的形式)?”我当时一听,觉得问得很有道理。做同样一件事情,为什么采用两种风格迥异的风格呢?况且,Java中的数组其实是完备(full-fledged)的对象,直接暴露成员变量,可能不是一种很OO的风格。那么,设计Java的那帮天才为什么这么做呢?带着这个疑问,我查阅了一些资料,主要是关于“JVM是如何处理数组”的。数组对象的类是什么?既然数组都是对象,那么数组的类究竟是什么呢?当然不是java.util.Arrays啦!我们以int一维数组为例,看看究竟。1. publicclassMain 2. publicstaticvoidmain(Stringargs) 3. inta=newint10;Classclazz=a.getClass(); 4. System.out.println(clazz.getName(); 5. 6. 7. 在SUN JDK 1.6上运行上述代码,输出为:I看起来数组的类很奇怪,非但不属于任何包,而且名称还不是合法的标识符(identifier)。具体的命名规则1可以参见java.lang.Class.getName()的javadoc。简单的说,数组的类名由若干个和数组元素类型的内部名称组成,的数目代表了数组的维度。具有相同类型元素和相同维度的数组,属于同一个类。如果两个数组的元素类型相同,但维度不同,那么它们也属于不同的类。如果两个数组的元素类型和维度均相同,但长度不同,那么它们还是属于同一个类。数组的类有哪些成员呢?既然我们知道了数组的类名是什么,那么就去看看数组的类究竟是什么样的吧?有哪些成员变量?有哪些成员方法?length这个成员变量在哪?是不是没有length()这个成员方法?找来找去,在JDK的代码中没有找打I这个类。想想也对,I都不是一个合法的标识符,肯定不会出现public class I .这样的Java代码。我们暂且不管I类是谁声明的,怎么声明的,先用反射机制一探究竟吧。1. publicclassMain 2. publicstaticvoidmain(Stringargs) 3. inta=newint10;4. Classclazz=a.getClass(); 5. System.out.println(clazz.getDeclaredFields().length); 6. System.out.println(clazz.getDeclaredMethods().length); 7. System.out.println(clazz.getDeclaredConstructors().length); 8. System.out.println(clazz.getDeclaredAnnotations().length); 9. System.out.println(clazz.getDeclaredClasses().length); 10. System.out.println(clazz.getSuperclass(); 11. 12. 13. 在SUN JDK 1.6上运行上述代码,输出为:1. 02. 03. 04. 05. 06. classjava.lang.Object 7. 可见,I这个类是java.lang.Object的直接子类,自身没有声明任何成员变量、成员方法、构造函数和Annotation,可以说,I就是个空类。我们立马可以想到一个问题:怎么连length这个成员变量都没有呢?如果真的没有,编译器怎么不报语法错呢?想必编译器对Array.length进行了特殊处理哇!数组的类在哪里声明的?先不管为什么没有length成员变量,我们先搞清楚I这个类是哪里声明的吧。既然I都不是合法的标识符,那么这个类肯定在Java代码中显式声明的。想来想去,只能是JVM自己在运行时生成的了。JVM生成类还是一件很容易的事情,甚至无需生成字节码,直接在方法区中创建类型数据,就差不多完工了。还没有实力去看JVM的源代码,于是翻了翻The JavaTM Virtual Machine Specification Second Edition,果然得到了验证,相关内容参考5.3.3 Creating Array Classes。规范的描述很严谨,还掺杂了定义类加载器和初始化类加载器的内容。先不管这些,简单概括一下:类加载器先看看数组类是否已经被创建了。如果没有,那就说明需要创建数组类;如果有,那就无需创建了。如果数组元素是引用类型,那么类加载器首先去加载数组元素的类。JVM根据元素类型和维度,创建相应的数组类。呵呵,果然是JVM这家伙自个偷偷创建了I类。JVM不把数组类放到任何包中,也不给他们起个合法的标识符名称,估计是为了避免和JDK、第三方及用户自定义的类发生冲突吧。再想想,JVM也必须动态生成数组类,因为Java数组类的数量与元素类型、维度(最多255)有关,相当相当多了,是没法预先声明好的。居然没有length这个成员变量!我们已经发现,偷懒的JVM没有为数组类生成length这个成员变量,那么Array.length这样的语法如何通过编译,如何执行的呢?让我们看看字节码吧!编写一段最简单的代码,使用jclasslib查看字节码。1. publicclassMain 2. publicstaticvoidmain(Stringargs) 3. inta=newint2;inti=a.length; 4. 5. 6. 使用SUN JDK 1.6编译上述代码,并使用jclasslib打开Main.class文件,得到main方法的字节码:1. 0iconst_2/将int型常量2压入操作数栈 2. 1newarray10(int)/将2弹出操作数栈,作为长度,创建一个元素类型为int,维度为1的数组,并将数组的引用压入操作数栈 3. 3ast
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诊室患者安全管理制度
- 诊所新风设备管理制度
- 试件标准养护管理制度
- 财务签字审批管理制度
- 财政扶贫项目管理制度
- 货品安全配送管理制度
- 货物运输变更管理制度
- 货车司机仓库管理制度
- 物资采购沟通协议书范本
- 护理心理学案例分析 课件
- DB37∕T 5323-2025 住宅设计标准
- 2024年6月英语四级真题(全3套)
- MySQL数据库技术单选题100道及答案
- 《肝衰竭诊治指南(2024版)》解读
- 防暑应急救援演练脚本
- 2023-2024学年江西省吉安市高二下学期期末教学质量检测数学试题(含答案)
- 24秋国家开放大学《计算机系统与维护》实验1-13参考答案
- 原产地规则培训讲座课件
- 中考英语专项复习及练习
- GB_T 22627-2022水处理剂 聚氯化铝_(高清-最新版)
- 药品不良反应报告表范例
评论
0/150
提交评论