在Java中,关于数据经常会谈到内存,之前已经说过,在Java中数据主要活跃在三个内存区中:方法数据共享区,栈区,堆区。
而今天谈到的主要是俩个,栈区和堆区。
栈区主要用来存放一些基本数据类型的变量数据和对象的引用变量。(引用变量可以理解为对象或者数组的名字)
堆区主要就是用来存放数组和对象本身。
数组:
在Java中,关于数组,可以分为基本数据类型的数组和类类型的数组。
主要分为三步:声明,创建,初始化。
声明:Java中数组的声明是抽象的。所以并不能说明大小。如:
int num[]; //c语言的格式 int[] num; //java中常见的格式,表明创建的int为数组行int Student[] s; //创建学生类的数组
在声明后系统会创建一个引用空间,这些声明便放在引用空间中。
创建:即new一个对象。如:
num = new int[10]; //基本数据类型int s = new Student[10]; //类类型Student型,类类型并不代表创建完毕
需要说明的是在创建部分。
在创建部分,基本数据类型此时已经完成了创建,但类类型却有些特殊。
在完成上述操作后并不能直接使用s.name进行相关操作,因为此时这个对象还是抽象的!!!就比如创建了五个学生,但只是说明了一下,并没有在进一步的具体说明是哪五个学生。
所以类类型还要进一步的new实体,最后才能使用实体的属性。
s[i]=new Student(); //创建对对象数组的实体类型,“i”表示第i个学生
类类型创建完毕。
初始化:即为给数组赋值。关于基本类型的数组元素默认初始化为0。如:
num[0]=0; //基本数据类型的初始化 s[0].name="张三"; //类类型的初始化
整体看如下Demo:
import java.util.Scanner; public class TestArray { public static void main(String[] args) { // 基本数据类型数组 int[] num; //声明 num = new int[10]; //创建 for(int i = 0;i<num.length;i++){ num[i]=i; //初始化 System.out.println("第"+(i+1)+"个数的值为"+num[i]); //输出 } //类类型数组 Scanner sc =new Scanner(System.in); //接收键盘录入数据 Student[] s; //声明 s = new Student[5]; //创建 for(int i = 0;i<s.length;i++){ s[i] = new Student(); //!!创建对象实体!! System.out.print("请输入第"+(i+1)+"个学生的名字:"); s[i].name = sc.next(); //键盘录入学生姓名,进行初始化 s[i].age = 20 + i ; } System.out.println("这五个学生分为为"); //输出 for(int i = 0;i<s.length;i++){ System.out.println("姓名: "+s[i].name+" 年龄: "+s[i].age); } } } //定义了一个学生类 class Student{ String name; int age; }
输出结果:
二维数组:
和一维数组的声明类似,如下:
Student[] s1[]; //这样写虽然很明确的表示出了想要创建的是数组,但比较怪异 Student [][] s2; //常见写法
创建有俩种创建,一种为规则创建,另一种为不规则创建。
//规则创建: s1 =new Student[5][50]; //创建5个班级,每个班级50名学生 //不规则创建 s2=new Student[10][ ]; //先创建10个班级 s2[i]=new Student[x]; //给第i个班级创建x个长度的学生
其余与一维数组相同。
数组的复制:
System.arrayCopy(Object Source, int srcIndex, Object Dest, int destIndex, int length); // 原数组 ,复制原始数组的目的索引,新数组, 到达新数组的目的索引,复制的长度
ps:安利一波:
Cease to struggle and you cease to live.