Java学习之旅基础知识篇:数组及引用类型内存分配
2012-10-22 21:50
621 查看
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点。数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用。数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组长度,由系统分配初始值)。
建议不要混用静态初始化和动态初始化,即不要既指定数组的长度的同时又指定每个元素的值。当初始化完毕后,就可以按索引位置(0~array.length-1)来访问数组元素了。当使用动态初始化时,如在对应的索引位未指定值的话,系统将指定相应数据类型对应的默认值(整数为0,浮点数为0.0,字符为'\u0000',布尔类型为false,引用类型为null)。
请注意:java中是没有foreach这个关键字的,其语法是for(type item : items)来表示,但foreach只能用于遍历元素的值而不能改变,必须使用for才能实现。
以上简单的介绍了数组的初始化和应用,接下来讲详细介绍数组(数组引用和数组元素)在内存中的存放形式。首先给出结论:数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。
五子棋游戏实现(简易版)
数字转化为人民币大写程序中,利用了一维数组表示大写及单位;五子棋游戏中,利用了二维数组表示棋盘。从程序中可看到throws Exception表示不处理任何异常,将在后续的篇章中继续讲解。
//静态初始化 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表示不处理任何异常,将在后续的篇章中继续讲解。
相关文章推荐
- Java学习之旅基础知识篇:数组及引用类型内存分配
- Java学习之旅基础知识篇:数组及引用类型内存分配
- Java基础学习9(一维数组及在内存中的分配)
- Java 基础【04】数组内存分配 引用传递 值传递
- 浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
- Java学习笔记一:基本语法:类和对象的介绍、数组、引用类型
- 【java基础知识(学习笔记)】--引用数据类型
- JAVA——(1)基础补充之运算符、字符串、数组、内存分配(String,StringBuffer,StringBuilder的区别
- C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组
- 学习Java基础的一些知识(6)Java的引用数据类型
- Java学习之旅基础知识篇:数据类型及流程控制
- 黑马程序员——零基础学习iOS开发——05 C语言:进制、内存储存细节、类型说明符、位运算、数组
- 数组及引用类型内存分配
- Java自学之路-Java基础教程-20:Java的数组以及其他引用类型和JDK
- Java基础学习19(String类型对象在内存中的分布以及与包装类之间的转换)
- Java基础1--Java里的数组,内存与引用
- 【java基础】引用类型数组初始化中,setter和getter函数空指针问题
- Java学习之旅基础知识篇:数据类型及流程控制
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- 【C/C++语言基础学习】在主函数的定义的指针数组、二维数组通过三级指针在被调用函数分配内存