4-JavaSE之数组的定义与使用

本节目标:

  1. 数组基本概念
  2. 二维数组
  3. 数组与方法互操作
  4. Java对数组的支持
  5. 数组案例
  6. 对象数组

1.数组基本概念

1>数组动态初始化( 声明并开辟数组):数据类型[ ] 数组名称 = new 数据类型 [长度]
eg: 声明并开辟一个长度为5的整型数组
int[ ] data = new int[5];
注意:

  • a. 数组通过下标索引来取得元素,下标默认从0开始。数组下标超出数组长度,数组越界异常(运行时异常)
  • b.数组中每个元素都有默认值,默认值是该数据类型默认值。
  • c.取得数组长度的方法:数组名称.length
  • d.数组遍历推荐使用for-each循环(仅限于数组内容读取),要修改数组内容,还是使用常规for循环
第一种遍历:
for (int i = 0; i<x.length ; i++)
{
	System.out.println(x[i]) ; // 通过循环控制索引下标更改
}
第二种遍历:
for(int x : data)     临时变量:要取得值的数组名称
{
   ...
}

除了声明开辟数组空间,还有分步进行数组实例化:

int[] x = null ;
x = new int[3] ;

数组属于引用数据类型,因此在使用之前一定要开辟空间(实例化),否则就会产生NullPoninterException(空指针异常,运行时异常)
2> 数组引用传递:多个栈内存指向同一块堆内存(即c中的指针)
new表示在堆内存上开辟空间
范例:多个栈内存指向相同的堆内存

public class ArrayDemo{
	public static void main(String[] args) {
			int[] x = null ;
			int[] temp = null ; // 声明对象
			x = new int[3] ;
			System.out.println(x.length) ;
			x[0] = 1 ; // 数组第一个元素
			x[1] = 2 ; // 数组第二个元素
			x[2] = 3 ; // 数组第三个元素
			for (int i = 0; i<x.length ; i++) {
				System.out.println(x[i]) ; // 通过循环控制索引下标更改
			}
			temp = x ; //如果要发生引用传递,不要出现[]
			temp[0] = 55 ; // 修改数据
			System.out.println(x[0]) ;
	}
}

3>数组静态初始化:数组在定义的同时可以设置内容

  • 简化格式:
    数据类型[ ] 数组名称 = {值,值,…}

  • 完整格式(推荐):
    数据类型[ ] 数组名称 = new 数据类型[ ]{值,值,…}

    eg:int[] data = new int[]{1,3,5,7,9,11}

在开发之中,对于静态数组初始化强烈推荐完整格式,这样可以轻松使用匿名数组这一概念。在数组定义时直接设置内容,根据值的个数确定数组长度,并且长度不可修改

2.二维数组(了解)

而二维数组本质上指的就是一个行列的集合。换言之,如果要获得一个数据,既需要行索引,也需要列索引。如果要确定一个数据,则使用结构为“数组名称[行索引][列索引]”这样的结构就是一个表的结构。
1>动态初始化:]

数据类型[][] 对象数组 = new 数据类型[行个数][列个数] 
eg:int[][] data = new int[3][4];

2>静态初始化

数据类型[][] 对象数组 = new 数据类型[][]{{第一行值},{第二行值},...} ;
eg:int[][] data = new int[][] {{1,2,3},{4,5},{6,7,8,9}};

3.数组与方法互操作(重点)

1>方法接收数组(方法调用这个数组,栈中多个指向指向堆中的数组)
函数的调用
2>方法返回数组(在一个方法里写出或叫做返回数组的内容 — 即利用方法对数组进行初始化)

在这里插入图片描述
现在的数组上发生了引用传递,那么就意味着方法在接收数组后也可以修改数组。
3>方法修改数组

public class test
{
    public static void main(String[] args)
    {
        int[] data = init(); //调用方法对数组进行初始化
        modify(data);
        printArray(data);  //即C中的调用函数printArray
    }

    public static void printArray(int[] data)  
    {
        for(int temp : data)
        {
            System.out.print(temp+"、");
        }
    }

    public static int[] init()
    {
        return new int[] {2,4,6,8,9};
    }

    public static void modify(int[] data) //每个数×2
    {
        for(int i=0; i < data.length; i++)
        {
            data[i] *= 2;
        }
    }
}

4.Java对数组的支持(应对笔试题,可以直接调用)

1.排序 - 调用java.util.Arrays.sort(数组名称)这个类
sort进行的是升序排列

public class test
{
    public static void main(String[] args)
    {
        int[] data = new int[]{55,2,1,33,77,45};
        java.util.Arrays.sort(data);  //此时已经进行对数组的排序
        printArray(data);
    }

    public static void printArray(int[] data)  
    {
        for(int temp : data)
        {
            System.out.print(temp+"、");
        }
    }

}

带有char类型的数组

import java.util.Arrays;  //打包
public class test
{
    public static void main(String[] args)
    {
        int[] data = new int[]{55,2,1,33,77,45};
        char[] c = new char[]{'z','a','c','b'};
        Arrays.sort(data);
        Arrays.sort(c);
        printArray(data);
        printArray(c);
    }
//方法的重载(实现的功能相同,参数的类型,个数或者顺序不相同)
    public static void printArray(int[] data)  
    {
        for(int temp : data)
        {
            System.out.print(temp+"、");
        }
    }

    public static void printArray(char[] data)  
    {
        for(char temp : data)
        {
            System.out.print(temp+"、");
        }
    }

}

支持所有基本数据类型
内部使用双轴快速排序
2.数组部分拷贝:System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数开始点,拷贝长度)
范例:目标数组A:1、2、3、4、5、6、7、8、9 源数组B:11、22、33、44、55、66、77、88、99 替换后:1、55、66、77、5、6、7、8、9

public class test
{
    public static void main(String[] args)
    {
        int[] dataA = new int[]{1,2,3,4,5,6,7,8,9} ;
        int[] dataB = new int[]{11,22,33,44,55,66,77,88,99} ;
        System.arraycopy(dataB,4,dataA,1,3) ;
        printArray(dataA) ;
    }

    public static void printArray(int[] data)  
    {
        for(int temp : data)
        {
            System.out.print(temp+"、");
        }
    }    

}

3.数组全拷贝:java.util.Arrays.copyOf(源数组名称,新数组长度):int[ ]
Java动态数组动态扩容方法

public class test
{
    public static void main(String[] args)
    {
        int[] data = new int[]{1,2,3,4,5,6,7,8,9} ;
        int[] temp = Arrays.copyOf(data,data.length+1); //使temp指向一块新空间而不是指向原来的堆空间
        printArray(temp) ;
    }

    public static void printArray(int[] data)  
    {
        for(int temp : data)
        {
            System.out.print(temp+"、");
        }
    }    

}

其中int[] temp = Arrays.copyOf(data,4); //类似于取前面4个元素的部分拷贝

猜你喜欢

转载自blog.csdn.net/qq_39378530/article/details/83064974