Java学习笔记

coreJava_5——数组

2018-08-02  本文已影响16人  panda_Hi

数组类型

理解数组

java中要求数组元素具有相同的数据类型,及一个数组这里只能存储一种数据类型的数据。
一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,数组的长度不可改变。

定义数组

java支持两种语法格式来定义数组:

type[] arrayName;  //推荐
type arrayName; 

数组是一种引用类型的变量,因此用它定义一个变量仅仅表示定义了一个引用变量,这个引用变量还未指向任何有效的内存,因此定义数组时不能指定数组的长度,而且没有内存空间来存储数组元素,所以只有对数组进行初始化后才可以使用。
注意:定义数组时不能指定数组长度

数组的初始化

数组的初始化有两种方式:

1 静态初始化

arrayName = new type[]{element1, element2, element3, ...}

简化写法:

//声明和初始化一起完成
int[] a = {1,2,3,4};

实例:

int[] intArr;
intArr = new int[]{1,2,3,4}
Object[] objArr;
objArr = new Object[]{"你好", "世界"};
objArr = new String[]{"你好", "世界"};

2 动态初始化

arrayName = new type[length];

简化写法:

//数组的定义和初始化同时完成
int[] a = new int[4];

内存中的数组

实际的数组对象被存储在堆(heap)内存中,如果引用该数组对象的数组引用变量是一个局部变量那么它被存储在栈(stack)内存中。

int[] a = new int[]{1, 2, 3, 4}
int[] b = new int[4];
b = a;
//b = a,即把数组a的值赋给b后,就是让数组变量b指向数组变量a所指向的地址,而原来堆中数组b失去引用,变成垃圾,但长度依然不变

注:对待数组问题要分成两部分看待,一部分是数组引用,即定义的数组引用变量;一部分是实际的数组对象,在堆内存中运行的,通常无法直接访问它,只能通过数组引用变量来访问。

引用类型数组的初始化

引用类型的数组,存储的每一个数组元素也是引用,指向另一块内存。
代码示例:

//person.java
package tmp;

public class Person {

    public int age;
    public double height;

    // 定义一个info方法
    public void info() {
        System.out.println("我的年龄是:" + age + ",我的身高是:" + height);
    }
}

//ReferenceArraryTest.java
package tmp;

public class ReferenceArrayTest {
    public static void main(String[] args) {
        //定义一个students数组变量,类型是Person[],并初始化
        Person[] students = new Person[2];
        //创建一个person实例,并将这个person实例赋给zhang变量
        Person zhang = new Person();
        //为zhang所引用的person对象的age、height赋值
        zhang.age=22;
        zhang.height=184;
        //创建一个person实例,并将这个person实例赋给wang变量
        Person wang = new Person();
        wang.age = 21;
        wang.height=165;
        //将zhang、wang变量的值分别赋给数组的元素
        students[0]=zhang;
        students[1]=wang;
        //下面这两行代码是等效的,zhang和students[0]指向的是
        //同一个Person实例
        //zhang.info();
        students[0].info();
    }
}

输出结果:

我的年龄是:22,我的身高是:184.0

java8 中的增强工具类:Arrarys

java提供的Arrarys类里包含的一些static修饰的方法可以直接操作数组。
具体可查看api


jdk1.6.png

常用的方法主要是:

package tmp;

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrarysTest {
    public static void main(String[] args) {
        // 定义一个a数组
        int[] a = new int[] { 3, 4, 5, 6 };
        // 定义一个a2数组
        int[] a2 = new int[] { 3, 4, 5, 6 };
        // a和a2数组的长度、每个元素顺序值均相等,将输出true
        System.out.println("a、a2数组是否相等:" + Arrays.equals(a, a2));
        // 通过赋值a数组生成新数组b
        int[] b = Arrays.copyOf(a, 6);
        System.out.println("a、b数组是否相等:" + Arrays.equals(a, b));
        System.out.println("b的数组元素为:" + Arrays.toString(b));
        // 将数组b的第3个元素到第5个元素赋值为1(区间前闭后开)
        Arrays.fill(b, 3, 5, 1);
        System.out.println(Arrays.toString(b));
        // 将b数组进行排序
        Arrays.sort(b);
        System.out.println(Arrays.toString(b));
    }
}

运行结果:
a、a2数组是否相等:true
a、b数组是否相等:false
b的数组元素为:[3, 4, 5, 6, 0, 0]
[3, 4, 5, 1, 1, 0]
[0, 1, 1, 3, 4, 5]

上一篇下一篇

猜你喜欢

热点阅读