java基础复习(8)--数组

java中有包名的类无法引用默认包中的类。但是1.2或1.3的jdk却可以编译。新版的jdk已经禁止了这一行为,这样就强制了必须将引用类置于某个包中,形成清晰地组织结构。所以在以后的编程中最好给类指定包。


Date类的大部分方法已过时。已由Calendar实现。

汉诺塔 递归问题
递归的条件:
1,面对的问题形式类似
2,化简到最后一定有解

文件夹得递归访问
求最大公约数:辗转相除法

 

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

 

注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。

 

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 = new String[5];

 

8、原始类型数组元素的默认值。对于原始类型数组,在用new构造完成而没有初始化时,JVM自动对其进行初始化。默认值:byte、short、 int、long--0 float--0.0f double--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()方法区分开来,这两者没有统一起来是很遗憾的。)

 

13、Java有数组下标检查,当访问超出索引范围时,将产生ArrayIndexOutOfBoundsException运行时异常。注意,这 种下标检查不是在编译时刻进行的,而是在运行时!也就是说int[] arr = new int[10]; arr[100] = 100; 这么明显的错误可以通过编译,但在运行时抛出!

 

Java的数组下标检查是需要额外开销的,但是出于安全的权衡还是值得的,因为很多语言在使用数组时是不安全的,可以任意访问自身内存块外的数组,编译运行都不会报错,产生难以预料的后果!

 

 

数组是用来存储一组相同类型数据的数据结构
数组的定义方式:
type[] arry_name;
type array_name[];
new出来的数组应该在堆里生成

int[] arry = new int[10];每个元素都为0
在定义数组时,直接指定数组内的元素值。

充:定义一个变量,必须初始化吗?
否,以前一直以为必须要初始化,但是如果你虽定义,但却未使用,则编译,运行没有问题。

但是如果使用到了这个变量,则必须在使用前进行初始化。
所谓数组的动态初始化,就是将数组的定义与初始化分离开来。

c语言和java语言数组的差异:
在c语言中将数组作为参数,传递进来的只是数组的首地址,一般要操纵数组,还要将数组的
长度传递进来。

而java是面向对象的,将数组的引用作为参数传递进来,即可以直接对数组进行操作,可以获

得数组的长度

System.out.println(null);编译不通过。
分析:System类的静态属性out属于printStream类型,该类的println方法,可以接受基本数据类型,接受String和Object类型,而null表示空引用,没有显式指明它的类型。


System.out.println((String)null);
System.out.println((Object)null);

多维数组:
静态:int[ ][ ] a = {{1,2},{3,4}};
错误写法:int[2][2] a = {{1,2},{3,4}};
动态:java中的多维数组的声明和初始化应按从高维到低维的顺序进行。
int[ ][ ] b = new int[3][ ];
a[0]=new int[2];
a[1]=new int[3];
a[2]=new int[4];
int t[ ][ ] = new int[ ][4];//非法


用数组完成堆栈的模拟实现。

 

 

看到了讲解null的文章,我觉的以下这点很重要。

容器类型与nullList:允许重复元素,可以加入任意多个null。Set:不允许重复元素,最多可以加入一个null。Map:Map的 key最多可以加入一个null,value字段没有限制。数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数 组,不给定初始值,则所有的元素值为null。

 

List list = new ArrayList();
list.add(null);
list.add(null);
System.out.println(list.size());

//输出结果为2

你可能感兴趣的:(java,jvm,jdk,数据结构,编程)