当前课程知识点:Java程序设计 > 第一章 Java语言基础知识 > 1.3-数组 > 1.3.1-数组
大家好
欢迎回来继续学习
java语言程序设计
这一节我们来学习数组
数组在所有高级语言里面都有
这个概念大家也很熟悉了
但是java的数组
还是很有些特色的
首先我们来看一下数组的概念
从概念上来讲
不管你用哪种语言来写程序
那么数组都是由同一类型的对象
或者基本类型的数据构成的
那么这些对象
或者基本类型的数据
都被封装在同一个标志符
也就是数组名下面
比如说我们这里列出的
这一列数据都是整数
它就可以构成一个
一维的整数类型的数组
在java中数组是对象
那么数组它是需要动态初始化的
这一点需要大家注意
我们接下来下一章
会讲到类与对象
现在大家先简单的理解
java的数组它比较特殊
不是跟其它的
面向过程的高级语言一样
我们这样定义数组
马上数组就存在了
所以它是先定义数组的名字
或者叫引用
然后用动态的方式
去分配内存空间
然后初始化的
那么由于数组是对象
而在java中
所有类的最顶上的超类
就是Object
这个在后面我们讲
类的继承的时候
会给大家详细介绍
现在先让大家知道
数组对象可以赋值给
Object类型的对象
那么在数组中我
我们可以调用Object类
所提供的所有方法
现在我先简单的把概念
这样给大家介绍到这
后面我们还有专门的章节
会给大家演示
怎么样用Object类里面的
定义的这些方法的
那么有一个成员变量
我们现在就可以开始用
就是数组的长度
每个数组都有一个成员变量
叫做长度length
我们用它就可以知道
数组里面有多少个元素了
数组中的变量
也就是构成数组的
一个一个的数据
我们称它为数组元素
数组是没有名字的
我们访问数组元素
就要通过数组名
和下标来访问
接下来我们就来看看
在java中怎么创建
和使用一个数组
在java中创建跟使用个数组
还是挺麻烦的 有好多步
首先要声明指向数组的引用
也就是声明一个数组名吧
简单这么理解
接下来要用动态内存分配的方式
去构造一个数组
然后给数组初始化
接下来最后才是
我们可以使用
这个数组里面的元素了
好我们要定义数组
那么第一步就是声明数组的引用
引用是什么呢
可以说在java里面
除了基本数据类型
我们定义一个变量
它同时就分配内存空间以外
当我们要定义一个对象的时候
都是声明对象的引用
然后用动态内存分配的方式
得到这个对象的内存空间
并且给它初始化
然后把对象
和这个引用名关联起来
让它形成对象名
这是java的方式
开始的时候
大家可能还有些不习惯
或者说不理解 没关系
我们这一学期都是在这样用
大家后面逐渐就会习惯理解了
那么数组的引用
很类似于在C语言中的
数组的首地址那个指针
其实引用和指针
是有某种内在联系的
虽然在java中没有指针
但是处处有引用
好 第一步我们先声明
数组的引用
我们声明数组引用的时候
仅仅就是声明一个名字
这个时候是无需指明
数组元素个数的
也不为数组元素分配内存空间
声明完了引用名以后
如果没有构造数组
那么是不能直接使用着引用的
这引用是个空引用
现在我们看看这例子
如果我们想定义一个数组
可以先定义它的引用名
比如说arrayName
前面我们用Type
表示它是某种类型
比如说int类型
定义一个int类型的名字
intArray
那么我们可以将这一对方括号
写在类型名之后
引用变量名之前
也可以将这对方括号
写在引用名之后
效果是一样的
它们都表示
我们定义了一个数组名
它仅仅是个名字
数组在哪呢 还没有呢
那么接下来下一步的任务
就是要真正的创建一个数组
用动态内存分配的方法
我们创建数组
要用关键字new
它表示在运行时
动态分配内存空间
用于创建一个新的数组
那么在这个时候
我们是可以指定数组的类型
和数组元素的个数的
元素个数可以是常量
也可以是变量
这一点是很特殊的
为什么呢
因为它是运行时动态创建的
那只要这个时候
变量已经取得值了
当然用变量来指明
我们要多少个元素
是没有问题的
那么基本类型的数组的每个元素
都是一个基本类型的变量
而引用类型的数组
它每个元素都是一个对象的引用
比如说我们在这里
创建一个数组
首先我们定义一个名字
比如说ai
将来会用于存放一个
整数数组的引用
这样定义完了ai只是个名字
接下来我们再用new
去分配内存空间
构造一个数组
然后将数组的引用赋给ai
从这个时候起
ai就成了数组的名字了
同样下一个数组s
也是这样构造出来的
那么我们也可以
将数组的声明和数组的构造
一起来执行
比如说我们在定义ai的时候
就马上用new
去动态分配一个int数组
把引用用来初始化ai
这也是可以的
那么我们可以在一条语句中
创建多个数组也行
比如说最下面这一行的例子
那我们在一条语句
创建两个数组 s1 s2
这都是可以的
前面例子中我们创建了数组
但是都没有给数组的元素
进行初始化
我们知道定义变量的时候
给变量进行初始化
是一个很好的编程习惯
那么在java里面
包括基本类型的单个变量
包括数组
如果你定义的时候
不给它初始化会怎么样呢
java里面的数据
如果你构造的时候
定义的时候不给它初始化
它里面不会有垃圾数据的
基本类型的数据
那么数值型的数据
都会自动初始化为零
引用类型的变量
会初始化为空引用
那么数组构造的时候
怎么对它进行初始化
我们来看一下
数组初始化的方式
对数组进行初始化
就是对数组的元素的值
进行初始化
我们可以简单的
把几个步骤合在一起
我们在声明数组名的时候
就列出数组元素的全部初始值
那这个时候数组引用名的声明
数组的构造和元素的初始化
这几个步骤就合一了
一起完成了
那么刚才说了
如果创建数组的时候
你没有指定初始值
那么基本类型的数据
默认初始值为零
boolean类型的数据
默认初始值为false 是假
那引用类型的元素
默认初始值就是空
那数组在构造初始化之后
当然我们也可以用赋值
或者其它的运算
去改变数组的元素值
当我们完成了数组名的声明
数组的构造
元素的初始化之后
我们就可以使用这个数组了
使用数组一般来说
都是单独的使用
一个个的数组元素
那么这种数组元素的引用
和使用方式
其实跟我们在C语言中
学过的方式基本上就是一样的了
我们要引用数组的一个元素
就要用数组名
方括号下标的方式
注意数组的下标
它本质上必须整数的类型
可以是基本整型 短整型
单字节的整数 或者是字符型
那数组的下标计数
是从零开始的
数组一共有多少个元素呢
这个数组的元素个数
叫做数组的长度
既然在java里面
数组它是一个对象
而且它有一个数据成员
叫做length长度
这样我们就可以用
对象(名点)成员名的方式
来得到数组的长度了
那数组的最大下标值
就是它的长度减一
当我们访问数组的时候
如果数组的下标越界了
会怎么样呢
java语言的数组是很安全的
如果你在运行过程中
数组下标越界了
那么程序立刻会产生
数组越界异常
这时候你程序就会中止了
所以不会任由数组越界
去产生什么不可确定的结果
在java中数组名它就是一个引用
或者说它就是一个名字
怎么理解这一点呢
接下来我们来看看这个例题
在这个例题中
我们定义了一个数组a1
在定义的时候就给它初始化了
由于你给出了初始化列表
所以我们刚才说了
这种情况下几个步骤就合一了
不仅声明了名字a1
而且构造了一个
实实在在的数组
而且数组的每个元素
都初始化了
那么这个数组的长度是多少呢
由于我们给出的五个初始值
于是它的长度自然就是5
接下来下面一行
我们又定义了一个a2
这个a2没有给它初始化
那么实际上它就是
定义了一个引用
a2就是一个名字
可以这么理解
好 接下来我们将a1赋值给a2
这个赋值意味着什么
我们回忆一下
C语言中学过的
指针与指针之间的赋值
这个很像
这个是引用与引用之间的赋值
并没有复制出一个数组来
只是把数组名a1
或者叫做引用a1
赋值给了引用a2
像这样赋值以后
a1 a2这两个引用
指向了同一个数组
接下来我们做一下试验
用一个for循环
将a2这个数组的每个元素都加一
这样改变以后
我们再用下一个循环
将a1数组里面的每个元素
都输出一遍
结果看到a1数组的元素变了
说明你通过a2这个引用名
去修改数组
那么再通过a1这个引用名
去访问数组
实际上你操作的
都是同一个数组
同一个数组的两个名字
说穿了就这个意思
当然这里面我们用到了
循环语句 for语句
稍候我马上给大家讲
如果没有学过C语言的同学
可能看不懂这个for语句是什么
学过C语言的同学
你会看到它跟C语言的
for语句是一样的
接下来下面这个程序段
演示了一个字符串引用
构成的数组
也就是说它的每个元素
都是一个引用
这里我们定义这个
String类型的一个数组
anArray
然后在它的初始化列表里面
列出了三个字符串
双引号里面的String One
String Two String Three
三个字符串
然后我们用一个for循环
将数组里面的每个元素输出一下
并且调用toLower
这个方法
把字符串里面的字符
都转成小写输出
我们看到了输出结果
那么这个就是一个
由字符串引用构成的数组
我们在刚才例子中看到了
数组名就是一个数组的引用
我们把一个数组名
复制给另外一个数组名
只是一个引用之间的赋值
赋值完了以后
数组并没有产生一个副本
而是两个引用
指向了同一个数组
那么如果我们真正想
复制一个数组出来
该怎么办呢
我们来看这个图
比如说我们想做的是
从第一个数组里面
选取一部分元素
连续的一段元素
复制到一个新的数组中
那我们怎么办
这个时候我们可以用
arraycopy这个方法
关于类的方法
我们也会在第二章的时候
就会给大家介绍
讲类与对象的时候就会介绍
现在看起来
我们就简单的理解
它很像C语言中的函数
但是函数可以是全局的独立的
而java里面没有函数
它的这样的小的功能模块
都作为类的方法出现在类里面
那我们可以用
arraycopy这个方法
去进行数组的全部
或者部分的复制
这个例子我们就来演示一下
怎么样复制数组的全部元素
或者是部分元素
在这个例子里面
我们复制部分元素
在这里我们定义了两个数组
一个copyFrom
定义了
并且它的元素都被初始化了
第二个数组是copyTo
我们给它分配了内存空间
但是没有进行初始化
接下来我们希望
进行数组元素的复制
复制一段数组元素
我们就可以使用
System的这个arraycopy方法
好 那arraycopy方法
我们看它的参数
第一个参数copyFrom
你从哪个数组复制过来
从那个数组的
下标为几的元素开始复制
然后复制到哪去
复制到它的目标数组中的
什么位置
比如说下标为零的位置
一共复制多少个字符
这样就完成了复制了
复制以后我们可以再输出一下
copyTo这个数组验证一下
那么输出copyTo数组的时候
我们看如果是在C语言中
我们直接可以拿字符数组
当字符串来用
直接输出字符数组就行了
但java里面
字符数组不能当字符串用
这里是用字符数组作为初始值
作为参数
去构造了一个String对象
然后输出了这个String对象
来验证
大家也可以回去运行
验证一下这个程序
我们刚才讲的例子
都是一维数组 比较简单
我们还知道
经常我们在程序中
是需要多维数组的对吧
那么在java中
怎么定义多维数组呢
接下来我就以二维数组为例
来给大家介绍多维数组
怎么样构造 怎么样使用
比如说我们有一章
这样的有行有列的表格
是这些编号为0123456的
这些学生
每一周的这个测验成绩
这样有行有列
整整齐齐的一张表
这张表在程序中怎么表示呢
显然我们会想到
用二维数组来表示
所以我们可以定义一个
二维数组来表示
这样一个二维表格
这在其它的高级语言中
也是这样的思路
在java中
我们声明和构造二维数组
可以有多种方式
第一种方式
我们先声明一个二维数组名
像这样声明以后
myArray就是一个
指向二维数组的这个引用
那么它的初始值是什么呢
是个空引用
什么数组也没指向
那你要需要有数组
你接下来要用new
去构造一个数组
然后把引用赋值给它
也可以用第二种方式
我们在声明这个
二维数组引用名的时候
同时就用new去分配内存空间
构造一个新的数组
并且将数组的引用给到
或者说初始化到
myArray这个引用名里面去
但是这个数组的空间有了
它里面的值可是没有初始化
这时候它的值是什么呢
都是0
因为int类型的数组
每个元素都是int
不初始化的话
它默认初始化为0
那么第三种方式
就把几个步骤合一了
声明这个二维数组引用名的时候
同时就给出了全部数据的初始值
这样的话引用名的声明
数组的构造 元素的初始化
几个步骤一下都完成了
那么接下来
我们再看这么一个例子
这个例子想给大家演示一下
二维数组的长度这个问题
我们先想一想
如果我们说到二维数组的长度
它应该指的是什么呢
在java里面很特殊
java里面二维数组的长度
指的就是它的行数
而不是它的全部元素个数
而每一行又有自己的长度
java里面的二维数组
它的每一行长短可以不一样的
比如说我们再定义为一个数组
名字叫uneven
看我们初始化的情况
第0行 下标为0的这一行
是三个初始值
那么也有自动的
它生成了这一行的长度是3
就0行的长度是3
1行它的长度是多少呢
我们给了两个初始值
它的长度就是2
那么2行它的长度是多少呢
长度是5
所以我们在这程序里面
首先我们先输出下
eneven.length
就是整个数组的长度是几
从运行结果我们可以看到是3
接下来再输出每一行的长度
也就是每一行的列数
每一行的元素个数
012这些行
它们的长度并不相同
分别是325
从这一点我们深刻的体会到
java的二维数组
就是由一维数组构成的数组
应该说我们学C语言的时候
老师也是这样讲的
怎么理解二维数组呢
它就是由一维数组
构成的数组
而java里面的二维数组
我们看到
真真正正是由一维数组
构成的数组
在这一节我们学习了
java语言的数组
可以说从数据结构的概念上来看
java的数组
跟其它高级语言中的数组
应该是一样的
但是在语法上还是很特别的
java的数组
跟我们以前大多数同学学过的
C语言的数组差别非常大
这一点需要大家特别注意
接下来下一章
我要给大家介绍流程控制
这个跟我们在C语言中
学到的基本是一样的
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件