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)