您的位置:首页 > 编程语言 > Java开发

Java学习之旅基础知识篇:数组及引用类型内存分配

2012-10-22 21:50 621 查看
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点。数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用。数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组长度,由系统分配初始值)。

//静态初始化
int[] numbers = new int[] { 3, 5, 12, 8, 7 };
String[] names = { "Miracle", "Miracle He" };//使用静态初始化的简化形式


//动态初始化
int[] numbers = new int[5];
String[] names = new String[2];


建议不要混用静态初始化和动态初始化,即不要既指定数组的长度的同时又指定每个元素的值。当初始化完毕后,就可以按索引位置(0~array.length-1)来访问数组元素了。当使用动态初始化时,如在对应的索引位未指定值的话,系统将指定相应数据类型对应的默认值(整数为0,浮点数为0.0,字符为'\u0000',布尔类型为false,引用类型为null)。

public class TestArray {
public static void main(String[] args) {
String[] names = new String[3];
names[0] = "Miracle";
names[1] = "Miracle He";
//以下代码将输出Miracle Miracle He null
/*
for(int i = 0; i < names.length;i++) {
System.out.print(names[i] + " ");
}
*/
//还可以使用foreach来遍历
for(String name : names) {
System.out.print(name + " ");
}
}
}


请注意:java中是没有foreach这个关键字的,其语法是for(type item : items)来表示,但foreach只能用于遍历元素的值而不能改变,必须使用for才能实现。

public class TestForEach {
public static void main(String[] args) {
int[] numbers = { 3, 5, 12, 8, 7 };
for(int number : numbers) {
int num = number * 10;
System.out.print(num + ",");
}
System.out.println("");
//numbers仍然未发生变化(如果换成for将改变)
for(int i = 0;i < numbers.length;i++) {
System.out.print(numbers[i] + ",");
}
}
}


以上简单的介绍了数组的初始化和应用,接下来讲详细介绍数组(数组引用和数组元素)在内存中的存放形式。首先给出结论:数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。

五子棋游戏实现(简易版)

import java.io.*;
public class WZQ {
//定义一个二维数组当作棋盘
private String[][] board;
//定义棋盘大小
private static int BOARD_SIZE = 15;
//初始化棋盘
private void initBoard() {
board = new String[BOARD_SIZE][BOARD_SIZE];
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = "+";
}
}
}
//打印棋盘
private void printBoard() {
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
System.out.print(board[i][j]);
}
System.out.println("");
}
}
//开始下棋
public void play() throws Exception {
initBoard();
printBoard();
//获取键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = null;
do {
if(input != null) {
String[] pos = input.split(",");
int x = Integer.parseInt(pos[0]);
int y = Integer.parseInt(pos[1]);
board[x - 1][y - 1] = "●";
printBoard();
}
System.out.print("请输入你下棋的坐标(以x,y的形式):");
} while((input = br.readLine()) != null);
}
public static void main(String[] args) throws Exception {
WZQ wzq = new WZQ();
wzq.play();
}
}


数字转化为人民币大写程序中,利用了一维数组表示大写及单位;五子棋游戏中,利用了二维数组表示棋盘。从程序中可看到throws Exception表示不处理任何异常,将在后续的篇章中继续讲解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐