数组与内存控制

------- 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数组里面存放了各式各样的数据,有一维数组,二维数组,字符串对象,字符串数组,由此可见,引用类型数组存放的是引用值!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值