JAVA入门笔记5 —— 数组

  • Post author:
  • Post category:java


  • 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇



一、一维数组



1. 数组的存储



2. 声明和创建一维数组

  1. 声明数组(创建数组变量)

    • 声明数组仅仅

      创建一个对数组的存储位置

      ,并不分配任何内存空间

    • 如果变量不包含对数组的引用,那么这个变量的值为null

      ,这时不能给数组分配任何元素(类似C指针)
  2. 创建数组(创建数组对象)


    • 通过

      new


      在堆区创建一个数组对象
    • 两种用法

      1. 通过定义同时赋值的方式,把创建的数组对象直接赋引用到一个数组变量
      2. 不赋引用到数组变量,这样就成为

        匿名数组

        ,常用于方法传入的实参。使用匿名数组的策略仅仅就是

        创建、初始化、应用

        ,因为它没有任何名字因此你

        没法重用

  3. 示例代码

    - 声明数组(创建数组变量) 
    	int a[];			// 数组变量类似C语言的指针
    	int[] a;
    
    - 创建数组
    	new int[2];			// 创建一个确定长度的数组,元素初始化为默认值
    
    - 创建一个数组并把其引用赋值给数组变量
    	a = new int[2];		// a是一个数组
    
    - 创建数组并把它的引用赋给一个数组变量
    	int a[]	= new int[2];		  
    	int[] a	= new int[2];
    
    - 创建数组并初始化
    	new int[2]{1,2};	// 创建一个确定长度数组并进行初始化赋值
    
    - 创建数组变量、数组并初始化
    	int[] a = {1,2,3,4,5};
    	int a[] = {1,2,3,4,5};
    
    - 匿名数组的使用示意
    	printArray(new int[]{1,2,3,4,5});	// 这里的数组没有显式地引用变量,称为 “匿名数组“”
    



3. 给数组元素赋值

  • 必须

    先给数组变量赋一个已创建数组的引用

    ,才能给数组元素赋值
  • 赋值方式:

    数组名[index] = value;

    • 下标index从0开始
    • 访问数组元素:

      数组名[index]



4. 数组大小和默认值

  • 给数组分配空间时,一定

    要指定此数组能存储的元素个数,从而确定数组大小

  • 创建数组后,

    不能修改数组大小

    ,不过

    可以把数组变量引用到其他尺寸的数组

  • 可以用

    数组名.length

    得到数组大小

  • 数组创建后,默认值为:

    数据类型 默认值

    int/short/long

    等数值型数组
    0

    char
    ‘\u0000’

    boolean
    false



5. foreach循环

  • 这是java支持的一种

    简便for循环

    ,用来遍历整个数组。

    类似C++11的auto变量方式

  • for(数据类型 元素变量: 数组名)
  • 示例

    for(double e:myList)
    {
    	System.out.println(e);
    }
    



6. 复制数组

  • 如果尝试用

    =

    ,会

    改变数组变量引用的对象

    ,并

    不能复制数组



    list2=list1;

    这样会使

    list2

    引用

    list1

    引用的数组,而

    list2

    引用的数组将

    无法被访问到,将被垃圾回收机制回收
  • 复制数组的方法

    • 用循环语句逐个复制元素
    • 用System类中的

      静态方法

      arraycopy

      System.arraycopy(源数组名,源位置,目标数组,目标位置,复制长度);
      
    • 使用

      clone

      方法复制数组



7. 数组和方法



(1)把数组传给方法

  • java传参方式:

    都是值传递

    • 对于基本数据类型,传参数时传的是实参的值
    • 对于数组类型,传

      实参时传的数组的引用(本质也是传值,不过传的是地址值,类似C语言传指针)

      ,所以在方法中通过形参修改数组对象,在方法外数组变化被保留;若仅仅修改形参本身(如指向其他数组对象),则方法外实参不受影响
  • 参考:

    JAVA入门笔记3 —— 方法

    ,中

    三.2传参说明

  • 示例

    public static void main(String[] args) 
    { 
    	int[] arr = { 1, 3, 5, 7, 9 }; 
    }
    
    public static void printArray(int[] arr) 
    { 
    	for (int i = 0; i < arr.length; i++) 
    		System.out.println(arr[i]); 
    }
    

    在这里插入图片描述



(2)方法返回数组

  • 返回的也是值传递(返回数组的内存地址),类似传参
  • 示例

    public static void main(String[] args) 
    { 
    	int[] arr = getArray(); 
    	for (int i = 0; i < arr.length; i++) 
    		System.out.println(arr[i]);  
    }
    
    public static int[] getArray() 
    { 
    	int[] arr = { 1, 3, 5, 7, 9 }; 
    	return arr; 
    }
    

    在这里插入图片描述



8. 可变长参数列表

  • 具有

    同样类型的数目可变的参数

    可以传递给方法,并在方法内

    作为数组对待

  • 定义方法:

    修饰符 返回值类型 方法名(类型名...参数名)
    {
    	//code 
    }
    
  • 示例:

    public static void printMax(double...numbers)
    {
    	// 可以写numbers.length / number[i] 之类的,方法内当成数组处理就行了
    }
    
    printMax(2,3,4,5,6,11,2.3);		// 传递一个变长参数列表
    printMax(new double[]{1,2,3});	// 传递一个数组
    



9. Arrays类


  • java.util.Arrays

    类包含一些用于数组的常见操作

    java.util.Arrays.sort(数组名);					//对整个数组从小到大排序
    java.util.Arrays.parallelSort(数组名,n1,n2);		//对数组[n1,n2)从小到大排序
    java.util.Arrays.binarySearch(数组名,查找的元素);//要求数组必须提前按升序排好。如果能找到,返回元素下标;如果找不到,设被查找元素在下标index和index+1之间,返回(-index+1)
    java.util.Arrays.equals(数组名1,数组名2);		//判断两个数组是否严格相等,返回true/false
    java.util.Arrays.fill(数组名,元素);				//把整个数组用元素填充	
    java.util.Arrays.fill(数组名,n1,n2,元素);		//把数组[n1,n2)用元素填充
    java.util.Arrays.toString(数组名);				//返回数组的字符串,如[5, 5, 5, 4, 3, 2, 1]
    



二、二维数组



1. 数组的存储

  • 数组在JAVA中是

    对象

    ,数组变量是一个

    引用数据类型

    ,JVM将对象存储在一个称为堆(heap)的内存区域中,堆用于动态内存分配。
  • 二维数组

    本质上是一个每个元素都是一个一维数组的数组

    ,更高维数组依次类推,只有最后一维存储真正的数据,其他维都存着下一维的引用地址。

    // 例如有`matrix[5][3]`
    matrix.length = 5;
    matrix[0].length = 3;
    
  • 关于二维数组的存储,参考:

    JAVA入门笔记4 —— 对比java和C/C++中数组的存储



2. 声明和创建二维数组

  • 示例代码

    - 声明二维数组(创建二维数组变量)
    	int[][] matrix;
    	int matrix[][];		// 不推荐此写法
    
    - 创建二维数组 + 数组变量赋引用
    	matrix = new int[5][5];
    
    - 创建二维数组变量 + 创建二维数组 + 数组变量赋引用
    	int[][] matrix = new int[5][5];
    
    - 创建二维数组变量 + 创建二维数组 + 数组变量赋引用 + 数组初始化
    	int[][] matrix = { 	{1,2,3},
    					    {2,3,4},
    					    {3,4,5}};
    					    
    -new语法创建二维数组
    	用new语法创建二维数组必须指定数组行数,如 int[][] = new[5][];
    		
    
    - 不规则数组
    	不规则数组也是二维数组,本质也是一个每个元素都是一个一维数组的数组,只是每一个一维数组元素长度不同
    	int [][]matrix = {	{1,2,3,4,5},
    					    {1,2,3,4},
    					    {1,2,3,},
    					    {1,2},
    					    {1}	};
    



3. 二维数组与方法

  • 示例代码

    // 二维数组作为参数
    public static int sum(int[][] m)
    {
    	int total = 0;
    	//add some code here,calculate the sum of matrix m
    	return total;
    }
    
    // 二维数组作为返回值
    public static int[][] getArray()
    {
    	Sacnner input = new Sacnner(System.in);
    	int[][] m = new int[3][4];
    	//input something and fill the matrix m
    	
    	return m;
    }
    



版权声明:本文为wxc971231原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。