数组的定义

  • 数组是相同类型数据的有序集合。
  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
  • 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。

数组的四个基本特点

其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

其元素必须是相同类型,不允许出现混合类型。

数组中的元素可以是任何数据类型,包括基本类型和引用类型。

数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组的声明与创建

dataType[ ] arrayRefVar = new dataType[ arraySize];

dataType[ ][ ] arrayRefVar = new dataType[ arraySize][ arraySize];

数组的引用

public class Main {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        a[0] = 0;
        for(int i : a) {
            System.out.println(i); //这里会输出什么?
        }
    }
}
public class Main {
    public static void main(String[] args) {
        String[] names = {"ABC", "XYZ", "zoo"};
        String s = names[1];
        names[1] = "cat";
        System.out.println(s); // s是"XYZ"还是"cat"?
        for(String i : names) {
                System.out.println(i);  //这里会输出什么?
            }
    }
}

结论:输出"ABC" "cat"  "zoo"。分析见下。

注意数组是引用类型,并且数组大小不可变。我们观察下面的代码:

public class Main {
    public static void main(String[] args) {
        // 5位同学的成绩:
        int[] ns;
        ns = new int[] { 68, 79, 91, 85, 62 };
        System.out.println(ns.length); // 5
        ns = new int[] { 1, 2, 3 };
        System.out.println(ns.length); // 3
    }
}

本例中,ns指向了新的内存地址,其本身(原地址)被垃圾回收机制回收。(可能是吧,我是垃圾,并不清楚)

字符串数组

如果数组元素不是基本类型,而是一个引用类型,那么,修改数组元素会有哪些不同?

字符串是引用类型,因此我们先定义一个字符串数组:

字符串数组存放的是 各字符串常量的 地址!

String[] names = { "ABC", "XYZ", "zoo" };

java字符串数组解析 java字符串解析成数组_数据结构

思考下面这个例子(从引用的指向分析):

思考下面这个例子:

public class Example{
    String str=new String("tarena");
    char[]ch={'a','b','c'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
   //引用类型变量,传递的是地址,属于引用传递。
        str="test ok";
        ch[0]='g';
    }
}

 

多态数组

数组的定义类型为父类类型,里面保存的多态元素为子类类型。

public class Person {
    public static void main(String[] args) {
        Person[] person = new Person[4];
        person[0] = new Person("jack",20);
        person[1] = new Person("lucy",10);
        person[2] = new Student("mary",8,2000);
        person[3] = new Teacher("hsp",20,88888);
        for(Person p : person) {
            System.out.println(p);
        }

    }
    protected String name;
    protected int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Student extends Person{
    private double salary;
    public Student(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}
class Teacher extends Person{
    private double salary;
    public Teacher(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}