JAVA入门笔记5 —— 数组

  • 参考书:《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’
    booleanfalse

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;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值