JavaSE第三十二讲:Java数组内存地址解析

来源:互联网 发布:网红淘宝店前十名2016 编辑:程序博客网 时间:2024/05/16 11:07

1. 数组,Java中的数组与C语言的数组不一样,所以这方面要认真对待。

2. 数组(Array):相同类型数据的集合就叫做数组。

【注意】:数组里面存放的一定的相同数据类型的,它是相同类型数据的集合。

3. 如何定义数组。

public class ArrayTest{public static void main(String[] args){int[] a;}}

【说明】:表示定义一个数组a,数组类型为int型,所以数组a里面定义的元素都必须是整

定义数组及数组长度

public class ArrayTest{public static void main(String[] args){int[] a = new int[4];}}
【说明】:从int[] a = new int[4];这边可以看出,new一个数组,所以数组也是一个对象,这和C语言是不一样的,C里面没有对象的概念。


如下所示:

type[] 变量名 = new type[数组中元素的个数];

可以按照下列方式定义长度为10的数组: 

    int[] a = new int[10];

或者 int a[] = new int[10]; 

public class ArrayTest{public static void main(String[] args){//第一种定义数组的方式/*int[] a = new int[4];a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 4;System.out.println(a[3]);*/int a[] = new int[2];a[0] = 1;a[1] = 2;System.out.println(a[1]);}}
编译执行结果:

D:\src>java ArrayTest
2

【说明】:这是定义数组的两种方式,这里要说明以下,Java中定义数组的方式推荐用第一种 “int[] a” 表示a是一个int类型的数组。int[] a = new int[4]; //注意千万此处不能这样写:int[4] a = new int[4];int[] a 只是为了定义数组类型,具体数组长度应该在new的时候写,new一个数组的时候要开辟内存空间,此处给数组定义长度。

4. 数组中的元素索引是从0开始的。对于数组来说,最大的索引==数组的长度  1

另外一种定义数组的方式

int[] a = {1, 2, 3, 4};System.out.println(a[2]);int[] b = new int[]{1, 2, 3, 4}; //注意此处不能这样写:int[] b = new int[4]{1, 2, 3, 4};System.out.println(b[3]);

编译执行结果:

D:\src>java ArrayTest
3
4

   【说明】:int[] b = new int[]{1, 2, 3, 4}; //注意此处不能这样写:int[] b = new int[4]{1, 2, 3, 4};定义数组长度此时由后面来决定。

5. 定义数组的第3种方式:

type[] 变量名 = {new type[]}{逗号分隔的初始化值列表};

*.黑色大括号里面表示可以省略


6. Java 中的每个数组都有一个名为length的属性,表示数组的长度。length属性是public, final,int的。数组长度一旦确定,就不能改变大小。

打印出长度为100的数组里面的值

int[] a = new int[100];for(int i = 0; i < a.length; i++){a[i] = i + 1;}for(int j = 0; j < a.length; j++){System.out.println(a[j]);}
编译执行结果输出1到100的值

注意若此处for循环里面    for(int i = 0; i <= a.length; i++){
                             a[i] = i + 1;
                      }

【说明】:则程序发生越界异常,因为当i = a.length时候,即100时候,数组长度变为101越界,所以出现错误

D:\src>java ArrayTest
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
        at ArrayTest.main(ArrayTest.java:31)


int[] a = new int[100];for(int i = 0; i < a.length; i++){a[i] = i + 1;}for(int j = 0; j < a.length; j++){System.out.println(a[j]);}a.length = 200;

编译执行结果:

D:\src>javac ArrayTest.java
ArrayTest.java:37: 错误: 无法为最终变量length分配值
                a.length = 200;
                 ^
1 个错误

【说明】:length属性是public, final,int的。数组长度一旦确定,就不能改变大小。 而且length赋值肯定不是在声明的时候给赋的,一定是在构造方法中给其赋值的,因为在new数组对象的时候才能确定数组长度是多少。

int[] a = new int[4];System.out.println(a[3]);boolean[] b = new boolean[3];System.out.println(b[2]);
编译执行结果:

D:\src>java ArrayTest
0
false

【说明】:定义数组时没给数组赋值,则默认int类型是0,boolean类型是false。


数组元素在内存中的存放是连续的

int[] a = {1, 2, 3};int[] b = {1, 2, 3};System.out.println(a.equals(b));
编译执行结果:

D:\src>java ArrayTest
false

【说明】:调用equals()方法,此时方法是继承了Object类的方法,而且没有被重写,a和b分别是指向不同的数组对象地址,所以输出结果为false。从这边可以明确,对于数组内容的比较千万不能使用equals方法。【这地方很多人放错】

7. int[] a = new int[10],其中a是一个引用,它指向了生成的数组对象的首地址,数组中每个元素都是int类型,其中仅存放数据值本身。如图32-1所示。

图32-1


定义一个引用类型的数组:

Person[] p = new Person[3];
写法与定义一个int类型的数组类似。

Person[] p = new Person[3];System.out.println(p[0]);
编译执行结果输出为null。

【说明】:此时定义的是一个引用类型的数组,注意在这边没有生成Person类型的对象,一个都没有生成,只是生成了一个Person类型数组的对象,这个数组里面存放的不是对象本身,而是存放对象引用,这里存放三个Person类型的引用。这个是容易搞混掉的,都没有调用构造函数呢哈哈~,如果生成一个Person类型对象,这个对象是存放在堆当中的,是不能移动的,所以不可能被取出来放到数组里面,这边可以这样理解注意:除了原生类型之外,引用类型如果没有赋其初值,则其内容为null,null表示不指向任何对象。

public class ArrayTest2{public static void main(String[] args) {Person[] p = new Person[3];p[0] = new Person(10);p[1] = new Person(20);p[2] = new Person(30);for(int i = 0; i < p.length; i++){System.out.println(p[i].age);}}}class Person{int age;public Person(int age){this.age = age;}}
编译执行结果:

D:\src>java ArrayTest2
10
20
30


继续修改添加一段代码:

public class ArrayTest2{public static void main(String[] args) {Person[] p = new Person[3];p[0] = new Person(10);p[1] = new Person(20);p[2] = new Person(30);for(int i = 0; i < p.length; i++){System.out.println(p[i].age);}Person[] p2 = new Person[5];for(int j = 0; j < p2.length; j++)System.out.println(p2[j]);}}class Person{int age;public Person(int age){this.age = age;}}

编译执行结果:

D:\src>java ArrayTest2
10
20
30
null
null
null
null
null


未知】:如果将以上程序17行代码改为:System.out.println(p2[j].age);程序执行抛空指针异常了??

D:\src>java ArrayTest2
10
20
30
Exception in thread "main" java.lang.NullPointerException
        at ArrayTest2.main(ArrayTest2.java:17)



原创粉丝点击