当前位置 : IT培训网 > Java开发 > Java教程 > Java数组的定义和内存分配

Java数组的定义和内存分配

时间:2016-08-03 15:46:27  来源:Java培训网  作者:IT培训网  已有:名学员访问该课程
标签(Tag):   java(716)java数组(8)
type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量。

数组在我们学习数学时经常用到,那么这里的数组讲的是什么呢,今天就让IT培训网小编来给大家详细介绍下吧。

如果希望保存一组有相同类型的数据,可以使用数组。

数组的定义和内存分配

Java 中定义数组的语法有两种:

    type arrayName[];

    type[] arrayName;

type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量。例如:

int demoArray[];

int[] demoArray;

这两种形式没有区别,使用效果完全一样,读者可根据自己的编程习惯选择。

 

与C、C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下:

    arrayName=new type[arraySize];

其中,arraySize 为数组的长度,type 为数组的类型。如:

demoArray=new int[3];

为一个整型数组分配3个int 型整数所占据的内存空间。

 

通常,你可以在定义的同时分配空间,语法为:

    type arrayName[] = new type[arraySize];

例如:

int demoArray[] = new int[3];

数组的初始化

 

你可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。例如:

// 静态初始化

// 静态初始化的同时就为数组元素分配空间并赋值

int intArray[] = {1,2,3,4};

String stringArray[] = {"微学苑", "http://www.weixueyuan.net", "一切编程语言都是纸老虎"};

 

// 动态初始化

float floatArray[] = new float[3];

floatArray[0] = 1.0f;

floatArray[1] = 132.63f;

floatArray[2] = 100F;

数组引用

 

可以通过下标来引用数组:

    arrayName[index];

与C、C++不同,Java对数组元素要进行越界检查以保证安全性。

 

每个数组都有一个length属性来指明它的长度,例如 intArray.length 指明数组 intArray 的长度。

 

【示例】写一段代码,要求输入任意5个整数,输出它们的和。

import java.util.*;

public class Demo {

    public static void main(String[] args){

        int intArray[] = new int[5];

        long total = 0;

        int len = intArray.length;

      

        // 给数组元素赋值

        System.out.print("请输入" + len + "个整数,以空格为分隔:");

        Scanner sc = new Scanner(System.in);

        for(int i=0; i<len; i++){

            intArray[i] = sc.nextInt();

        }

      

        // 计算数组元素的和

        for(int i=0; i<len; i++){

            total += intArray[i];

        }

      

        System.out.println("所有数组元素的和为:" + total);

    }

}

运行结果:

请输入5个整数,以空格为分隔:10 20 15 25 50

所有数组元素的和为:120

数组的遍历

 

实际开发中,经常需要遍历数组以获取数组中的每一个元素。最容易想到的方法是for循环,例如:

int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};

for(int i=0,len=arrayDemo.length; i<len; i++){

    System.out.println(arrayDemo[i] + ", ");

}

输出结果:

1, 2, 4, 7, 9, 192, 100,

 

不过,Java提供了”增强版“的for循环,专门用来遍历数组,语法为:

for( arrayType varName: arrayName ){

    // Some Code

}

arrayType 为数组类型(也是数组元素的类型);varName 是用来保存当前元素的变量,每次循环它的值都会改变;arrayName 为数组名称。

 

每循环一次,就会获取数组中下一个元素的值,保存到 varName 变量,直到数组结束。即,第一次循环 varName 的值为第0个元素,第二次循环为第1个元素......例如:

int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};

for(int x: arrayDemo){

    System.out.println(x + ", ");

}

输出结果与上面相同。

 

这种增强版的for循环也被称为”foreach循环“,它是普通for循环语句的特殊简化版。所有的foreach循环都可以被改写成for循环。

 

但是,如果你希望使用数组的索引,那么增强版的 for 循环无法做到。

二维数组

 

二维数组的声明、初始化和引用与一维数组相似:

int intArray[ ][ ] = { {1,2}, {2,3}, {4,5} };

int a[ ][ ] = new int[2][3];

a[0][0] = 12;

a[0][1] = 34;

// ......

a[1][2] = 93;

Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。例如:

int intArray[ ][ ] = { {1,2}, {2,3}, {3,4,5} };

int a[ ][ ] = new int[2][ ];

a[0] = new int[3];

a[1] = new int[5];

 

【示例】通过二维数组计算两个矩阵的乘积。

public class Demo {

    public static void main(String[] args){

        // 第一个矩阵(动态初始化一个二维数组)

        int a[][] = new int[2][3];

        // 第二个矩阵(静态初始化一个二维数组)

        int b[][] = { {1,5,2,8}, {5,9,10,-3}, {2,7,-5,-18} };

        // 结果矩阵

        int c[][] = new int[2][4];

      

        // 初始化第一个矩阵

        for(int i=0; i<2; i++)

            for(int j=0; j<3 ;j++)

                a[i][j] = (i+1) * (j+2);

      

        // 计算矩阵乘积

        for (int i=0; i<2; i++){

            for (int j=0; j<4; j++){

                c[i][j]=0;

                for(int k=0; k<3; k++)

                    c[i][j] += a[i][k] * b[k][j];

            }

        }

 

        // 输出结算结果

        for(int i=0; i<2; i++){

            for (int j=0; j<4; j++)

                System.out.printf("%-5d", c[i][j]);

            System.out.println();

        }

    }

}

运行结果:

25   65   14   -65

50   130  28   -130

 

几点说明:

上面讲的是静态数组。静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。

如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组)或向量(Vector)。

正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 或 Vector 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
------分隔线----------------------------
Java教程
1、Java 概述
1.1 Java语言概述
1.2 Java虚拟机以及跨平台原理
1.3 Java的主要就业方向
1.4 Java的不同版本
1.5 Java开发环境搭建
1.6 第一个Java程序示例
1.7 Java类和对象的概念
1.8 Java类库及其组织结构
1.9 Java import
2、Java 语法基础
2.1 Java数据类型以及变量的定义
2.2 Java数据类型转换
2.3 Java运算符
2.4 Java流程控制
2.5 Java数组的定义和使用
2.6 Java字符串(String)
2.7 Java StringBuffer与StringBuider
2.8 强调一下编程风格
3、Java 类与对象
3.1 Java类的定义及其实例化
3.2 Java访问修饰符
3.3 Java变量的作用域
3.4 Java this关键字详解
3.5 Java方法重载
3.6 Java类的基本运行顺序
3.7 Java包装类、拆箱和装箱详解
3.8 再谈Java包
3.9 源文件的声明规则
4、Java 继承和多态
4.1 继承的概念与实现
4.2 Java super关键字
4.3 继承中的方法的覆盖和重载
4.4 多态和动态绑定
4.5 instanceof 运算符
4.6 多态对象的类型转换
4.7 Java static关键字
4.8 Java final关键字
4.9 Java Object类
5、面向对象高级特性
5.1 Java内部类及其实例化
5.2 内部类的分类
5.3 抽象类的概念和使用
5.4 接口的概念和使用
5.5 接口和抽象类的区别
5.6 Java 泛型
5.7 泛型通配符和类型参数的范围
6、异常处理
6.1 异常处理基础
6.2 异常类型Java语言中常见的异常类型有哪些
6.3 未被捕获的异常
6.4 try和catch的使用
6.5 多重catch语句的使用
6.6 try语句的嵌套
6.7 throw:异常的抛出
6.8 throws子句
6.9 finally块
6.10 Java的内置异常
6.11 创建自己的异常子类
6.12 断言
7、线程编程
7.1 线程的概念
7.2 Java线程模型
7.3 主线程
7.4 创建线程
7.5 创建多线程
7.6 isAlive()和join()的使用
7.7 线程优先级
7.8 线程同步
7.9 线程间通信
7.10 线程死锁
7.11 线程的挂起、恢复和终止
8、输入输出(IO)操作
8.1 输入输出基本概念
8.2 面向字符的输入流
8.3 面向字符的输出流
8.4 面向字节的输入输出流
8.5 面向字节流的应用
8.6 文件与目录管理
8.7 文件的随机读写
8.8 文件的压缩处理
9、常用类库、向量与哈希
9.1 Java基础类库
9.2 Object类
9.3 Java语言包(java.lang)简介
9.4 日期和时间类
9.5 向量及其应用
9.6 哈希表及其应用
10、图形界面(GUI)设计
10.1 图形界面设计基础
10.2 框架窗口
10.3 标签、按钮和按钮事件
10.4 面板
10.5 布局设计
10.6 文本框和文本区
10.7 文本框和文本区的输入输出
10.8 选择框和单选按钮
10.9 列表和组合框
10.10 菜单
10.11 对话框
10.12 滚动条
10.13 鼠标事件
10.14 键盘事件
11、图形、图像与多媒体
11.1 绘图基础
11.2 设置字型和颜色
11.3 绘图模式
11.4 Graphics类的绘图方法
11.5 Graphics2D类的绘图方法
11.6 图像处理基础
11.7 图像缓冲技术
11.8 多媒体基础
12、网络与数据库编程
12.1 IP地址和InetAddress类
12.2 统一资源定位符
12.3 套接字(Socket)
12.4 数据库连接
12.5 几个重要的类和接口
12.6 数据库查询
12.7 数据库更新
12.8 插入记录
12.9 修改记录
12.10 删除记录