------- android培训 、 java培训 、期待与您交流! ----------
数组与内存控制
1,Java中,声明一个数组过程中,如何分配内存的?
2,java中,数组初始化一共有哪几种方式?
3,基本类型数组和引用类型数组之间,在初始化时的内存分配机制有什么区别?
Java中,数组是静态的,当数组被初始化之后,该数组长度是不可变的。Java中数组必须经过初始化之后才可以使用。所谓初始化,也就是为数组分配内存空间,并为每个数组元素指定初始值。
初始化有两种方式:
1, 静态初始化:由程序员指定初始值,由系统指定数组长度
例如:int[] a=new int[]{1,2,3};
首先,系统先在栈区将引用型变量分配到栈中(a先进栈),然后再在堆中开辟一片连续的内存空间(3个int型),然后这片堆内存会产生一个地址值(0x0045),并将地址值赋给a变量,这样也就让a默认指向了这个数组。
2, 动态初始化:由系统默认初始值,由程序员指定长度
例如:int[] b=new int[3];
首先,b先进栈,然后由系统检查所需开辟连续的空间大小,然后开辟一片连续的空间(3个int型),产生引用值将其赋给b,b也就默认指向了a。
动态初始化时,不同类型的数组初始化默认值不一样,
byte,short,long,int默认为0
float,double默认0.0
char默认‘\u0000’
boolean默认false
String,类,接口,数组默认为null
下面有一个演示的例子
public class PersonDemo {
public static void main(String[] args) {
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
Person[] students = new Person[] { p1, p2 };
System.out.println(students.length); // 2
}
}
class Person {
private int age;
private String name;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println("i'm show" + name + ".." + age);
}
}
可以看出students[1],students[0]实际上是存放了p1和p2两个对象的引用值,这也就默认了指向了两个对象!
所以说,基本类型数组里面存放了基本类型数据,引用类型数组里面存放的是对象的引用值。引用值是系统默认产生的。
实际上这样看来,并不存在二维或者多维数组!
public class ArrayTest {
public static void main(String[] args) {
int[][] a3=new int[2][3];
System.out.println(a3.length);//2
System.out.println(a3[0].length);//3
System.out.println(a3[1].length);//3
System.out.println(a3[1][1]);//0
}
}
a3.length 输出结果是 2 ,说明总共包含了 2 个一维数组,a3[1].length 输出结果是 3 ,说明了 a3[1] 这个一维数组里面有 3 个元素!
只要在已有的数据类型之后增加方括号,就会产生一个新的数组类型。如果已有类型是int,增加方括号就是int[],这是一个数组类型;如果再以int类型为已有类型,增加方括号就是int[][],这依然是数组类型。如果再以int[][]为已有类型,增加方括号就得到int[][][],这依然是数组类型!
反过来,将数组类型最后的方括号去掉就得到了数组元素的类型。对于int[][][]类型的数组,其数组元素相当于int[][]类型的变量;对于int[][]类型的数组,其数组元素相当于int[]型变量,对于int[]型数组,其元素类型相当于int型变量!
所谓的多维数组,其实数组元素依然是数组的一维数组,二维数组是数组元素是一维数组的数组,三维数组的数组元素是二维数组的数组......N维数组元素师N-1维数组的数组!
int[] a1= new int[3];
String[] str= new String[]{ "1,2,3", "4,5,6"};
int[][] a3= new int[4][3];
Object[] object= new Object[4];
object[0]=a1;
object[1]=a3;
object[2]=str;
object[3]="string";
Object数组里面存放了各式各样的数据,有一维数组,二维数组,字符串对象,字符串数组,由此可见,引用类型数组存放的是引用值!