黑马程序员——java学习数组的总结

----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------

数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。

1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。
TestD.java(动态)

程序代码:

public class TestD 

     publicstatic void main(String args[]) { 

        int a[] ; 

        a = new int[3] ; 

        a[0] = 0 ; 

        a[1] = 1 ; 

        a[2] = 2 ; 

        Date days[] ; 

        days = new Date[3] ; 

        days[0] = new Date(2008,4,5) ; 

        days[1] = new Date(2008,2,31) ; 

        days[2] = new Date(2008,4,4) ; 

    } 

 

class Date 

     intyear,month,day ; 

    Date(int year ,int month ,int day) { 

        this.year = year ; 

        this.month = month ; 

        this.day = day ; 

    } 

 


TestS.java(静态)

程序代码:

public class TestS    

{    

     publicstatic void main(String args[]) {    

        int a[] = {0,1,2} ;    

        Time times [] = {new Time(19,42,42),new Time(1,23,54),new Time(5,3,2)};    

    }    

}    

 

class Time    

{    

     inthour,min,sec ;    

    Time(int hour ,int min ,int sec) {    

        this.hour = hour ;    

        this.min = min ;    

        this.sec = sec ;    

    }    

}   


TestDefault.java(默认)

程序代码:

public class TestDefault    

{    

     publicstatic void main(String args[]) {    

        int a [] = new int [5] ;    

        System.out.println("" + a[3]) ;    

    }    

}  

 

 

1、数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。

 

2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

 

3、数组声明的两种形式:一、int[]arr; 二、int arr[];   推荐使用前者,这符合Sun的命名规范,而且容易了解到关键点,这是一个int数组对象,而不是一个int原始类型。

 

4、在数组声明中包含数组长度永远是不合法的!如:int[5] arr; 。因为,声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。

 

5、在数组构造的时候必须指定长度,因为JVM要知道需要在堆上分配多少空间。反例:int[] arr = new int[];

 

6、多维数组的声明。int[][][]arr; 是三维int型数组。

 

7、一维数组的构造。形如:String[]sa = new String[5]; 或者分成两句:String[] sa;   sa = newString[5];

type var[]; type[] var;

声明数组时不能指定其长度(数组中元素的个数),

Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型 [数组元素的个数]

实例:
TestNew.java

程序代码:

public class TestNew 

     publicstatic void main(String args[]) { 

        int[] s ; 

        int i ; 

        s = new int[5] ; 

        for(i = 0 ; i < 5 ; i++) { 

            s[i] = i ; 

        } 

        for(i = 4 ; i >= 0 ; i--) { 

            System.out.println("" + s[i]) ; 

        } 

    }  

}

 

8、原始类型数组元素的默认值。对于原始类型数组,在用new构造完成而没有初始化时,JVM自动对其进行初始化。默认值:byteshort intlong--0   float--0.0fdouble--0.0   boolean--false   char--'"u0000'。(无论该数组是成员变量还是局部变量)

 

9、对象类型数组中的引用被默认初始化为null。如:Car[]myCar = new Car[10]; 相当于从myCar[0]myCar[9]都这样被自动初始化为myCar[i] = null;

 

10、对象类型的数组虽然被默认初始化了,但是并没有调用其构造函数。也就是说:Car[] myCar = new Car[10];只创建了一个myCar数组对象!并没有创建Car对象的任何实例!

 

11、多维数组的构造。float[][]ratings = new float[9][]; 第一维的长度必须给出,其余的可以不写,因为JVM只需要知道赋给变量ratings的对象的长度。

 

12、数组索引的范围。数组中各个元素的索引是从0开始的,到length-1。每个数组对象都有一个length属性,它保存了该数组对象的长度。(注意和String对象的length()方法区分开来,这两者没有统一起来是很遗憾的。)

 

13Java有数组下标检查,当访问超出索引范围时,将产生ArrayIndexOutOfBoundsException运行时异常。注意,这种下标检查不是在编译时刻进行的,而是在运行时!也就是说int[] arr = new int[10];  arr[100] = 100; 这么明显的错误可以通过编译,但在运行时抛出!Java的数组下标检查是需要额外开销的,但是出于安全的权衡还是值得的,因为很多语言在使用数组时是不安全的,可以任意访问自身内存块外的数组,编译运行都不会报错,产生难以预料的后果

 

 --java里面的数组不能这样写int a[5];

 *为什么呢?如果这样写的话一般情况下会将五个内存空间分配到栈上,但是java的数据是放在堆上的,栈上只能分配一个指针地址而已

 *数组的神明有两种方式int[]a;或者int a[];

--数据的问题

 方法中int[]a=new int[5];由于使用了new关键字,那么数组中的值(堆中已经分配内存)都被初始化成了0(初始化规则和类的成员变量一致);如果只值类型就能直接使用里面元素了,如果是引用类型,由于初始化成null所以不能使用

 如果不需要系统默认的给数组给初始值,而是我们手动给值,那么就不能显示的制定数据的长度,比如int[] a=new int[3]{1,2,3}这样的写法是错误的

--初始化的方式

 第一种:动态初始化.int[]i=new int[3];i[0]=1;i[1]=2;i[2]=3;

 第二种:静态初始化.int[]i={1,2,3}内存执行过程和动态初始化完全一致,只是编译器层面的一次封装而已

 第三种:int[]k=new int[]{1,2,3};也只是编译层面的封装,和动态初始化的内存执行过程一致

--注意字符串到基本数据类型的转换不能用(int)类似的方式强转,而必须使用Interger.parseInt()这种对应的封装类型做转换

--java里面的多维数组在内存中是树状形式分配的

 所以必须要有了根再有干再有叶子

 这也是为什么int[][]i=new int[3][4]正确

       int[][] i=new int[3][]正确

       int[][] i=new int[][4]错误

       int[][] i=new int[][]{{1,2},{1,2,3},{4,5,6}};正确(也是如果手动分配的时候不能写任何长度)

       int[][] i={{1,2},{3,4}}正确

 由于是树状的那么i[0]也是一个数组哦,是一个引用类型指针变量,掌握了这个就掌握了一切

 所以分析这样的问题(注意理解内存分配过程)

 int[][] i=new int[3][4];其中i[0]不为空

 int[][] i=new int[3][];其中i[0]为空  

 ----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值