Java数组2

本文详细介绍了Java中的数组操作,包括数组作为方法返回值和参数、main方法参数、可变长参数的使用,以及数组扩容的几种方法。讲解了数组的索引越界、空指针异常,并探讨了数组在Java中的引用概念和二维数组的特点。此外,还提到了Java中的Arrays工具类在处理数组时的作用,如数组比较、填充、排序和二分查找。
摘要由CSDN通过智能技术生成

Java数组引用数据类型

1、 数组作为方法的返回值类型
2、 数组作为方法的参数类型

import java.util.Arrays;

/**
 * 数组作为方法的返回值类型,参数类型
 * 
 *
 */
public class Test01 {

	public static void main(String[] args) {
		int [] mydata = getData();
		System.out.println( Arrays.toString(mydata));
		
		//在方法体中修改了形参数组的元素, 实际上也是修改实参数组的元素值
		swap(mydata, 0, 5);
		System.out.println( Arrays.toString(mydata));
		
		//在方法体中对形参数组重新赋值,形参数组指向新的数组,不再指向实参数组
		newData(mydata);
		System.out.println( Arrays.toString(mydata));
		
	}
	
	//定义方法,实现对数组的重新赋值
	private static void newData(int[] data) {
		data = new int[]{6,6,6};
	}

	//定义方法,实现数组指定两个元素的交换, 交换data[i]和data[j]这两个元素
	public static void swap(int [] data, int i , int j) {
		int t = data[i];
		data[i] = data[j];
		data[j] = t;
	}

	//定义方法,返回一个长度为10的int类型数组, 对数组进行随机的初始化
	public static int[] getData() {
		int [] data = new int[10];
		//给数组的每个 元素赋值
		for(int i = 0; i<data.length; i++){
			int xxx = (int) (Math.random()*100);
			data[i] = xxx;
		}
		return data;
	}
	
}

在这里插入图片描述
3、main方法的参数

/**
 * main方法的参数:		String[] args 
 * 	1)是一个存储字符串的数组
 * 	2)main方法的参数可以用来在开始运行程序时, 接收一些初始化的数据
 * 	3) 如何给main方法传递参数?
 * 		run菜单--> run configurations菜单项, 在arguments选项卡的Program Arguements文本框中输入main方法的参数
 * 
 *
 */
public class Test02 {
	public static void main(String[] args) {
		System.out.println( args.length );
		for (String string : args) {
			System.out.println( string );
		}
	}

}

Java可变长参数

/**
 * 可变长参数
 * 	1) 可变长参数用来接收任意个数据
 * 	2) 定义可变长参数
 * 		方法名( 参数类型   参数名,  参数类型  ... 可变长参数名)
 * 		说明:
 * 			1) 可变长参数最多只能有一个
 * 			2) 方法参数列表如果有多个参数, 可变长参数只能放在参数列表的最后
 * 			3) 在方法体中, 可以把可变长参数当作数组使用
 * 			4) 在调用方法时,可以传递任意个数, 也可以传递一个数组
 * 
 *
 *
 */
public class Test03{

	public static void main(String[] args) {
		//在调用方法时,可以传递任意个数, 也可以传递一个数组
		sum();
		sum(1);
		sum(1,2,3,4,5);
		int [] data = {6,6,6,6};
		sum(data);
	}
	
	//定义方法, 打印任意个整数的和
	public static void sum(int ... num  ) {
		int result =  0;
		// 可以把可变长参数当作数组使用
		for( int i = 0 ;  i<num.length; i++){
			result += num[i];
		}
		System.out.println("sum==" + result);
	}

}

Java数组的扩容

当数组定义完成后,数组存储元素的个数就确定了,因为在定义数组时,要指定数组的长度. 如果想要在数组中存储更多的数据, 就需要对数组扩容。
在这里插入图片描述

import java.util.Arrays;

/**
 * 数组扩容
 * 
 *
 */
public class Test {

	public static void main(String[] args) {
//		m1(); 		//完全手动扩容
//		m2(); 		//数组复制调用 了System.arraycopy(0方法
		m3();		//调用  Arrays.copyOf(0实现扩容
	}

	private static void m3() {
		// 定义长度为5的数组
		int[] data = { 1, 2, 3, 4, 5 };

		// 想要在数组中存储更多的数据,需要对数组扩容
		//Arrays工具类copyOf(源数组, 新数组的长度) 可以实现数组的扩容
		data = Arrays.copyOf(data, data.length*3/2);
		
		System.out.println( Arrays.toString(data));
	}

	private static void m2() {
		//定义长度为5的数组
		int [] data = {1,2,3,4,5};
		
		//想要在数组中存储更多的数据,需要对数组扩容		
		//(1) 定义一个更大的数组
		int [] newData = new int[data.length * 3 / 2] ;		//按1.5倍大小扩容
		//(2)把原来数组的内容复制到新数组中
		//把src数组从srcPos开始的length个元素复制到dest数组的destPos开始的位置
//		System.arraycopy(src, srcPos, dest, destPos, length);
		System.arraycopy(data, 0, newData, 0, data.length);
		//arraycopy()方法使用了native修饰,没有方法体, 该方法的方法体可能是由C/C++实现的
		//JNI,Java native Interface技术,可以在Java语言中调用其他语言编写的代码
		
		//(3) 让原来的数组名指向新的数组
		data = newData;
		
		//
		System.out.println( Arrays.toString(data));
	}
	private static void m1() {
		//1)定义长度为5的数组
		int [] data = {1,2,3,4,5};
		
		//2)想要在数组中存储更多的数据,需要对数组扩容
		
		//(1) 定义一个更大的数组
		int [] newData = new int[data.length * 3 / 2] ;		//按1.5倍大小扩容
		//(2)把原来数组的内容复制到新数组中
		for( int i = 0 ; i < data.length; i++){
			newData[i] = data[i];
		}
		//(3) 让原来的数组名指向新的数组
		data = newData;
		
		//
		System.out.println( Arrays.toString(data));
	}

}

1、数组的索引越界异常(索引为负或者超过数组长度)
2、空指针异常 int[ ] 数组名={1,5,8}; 数组名[]=null;
null是“空”的意思,表示将数组名中原本代表的地址清除
此时再输入:System.out.println(数组名[]);
将会出现异常

什么是引用?
引用相当于一个 “别名”, 也可以理解成一个指针.
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址.

二维数组用数组“名称”与“两个索引”来指定存取数组中的元素。
其定义方式与一维数组类似:
1、静态初始化:int[][] arr1= {{1,2,3}, {4,5,6}};
2、动态初始化:int[][] arr1=new int[3][3];
注意length所代表的长度,数组名后直接加上length(如arr.length),所指的是数组有几行; 指定索引后加上length(如arr[0].length),指的是该行拥有的元素,也就是列的数目。
值得注意的是,数组的游标是从0 开始的,比如一位数组的第一个元素:arr1[0]=1; arr[4]=5;
二位数组中:arr2[0][0]=1; arr2[2][2]=6;

Java中的数组作为对象带来的好处
1.1 越界检查
1.2 length field:与传统的C++中的数组相比,length字段可以方便的得到数组的大小;但要注意,仅仅可以得到数组的大小,不能得到数组中实际包含多少个元素,因为length 只会告诉我们最多可将多少元素置入那个数组。
1.3 初始化:对象数组在创建之初会自动初始化成null,由原始数据类型构成的数组会自动初始化成零(针对数值类型),(Char)0 (针对字符类型)或者false (针对布尔类型)。
1.4 数组作为返回值:首先,既然数组是对象,那么就可以把这个对象作为返回值;而且,不必担心那个数组的是否可用只要需要它就会自动存在而且垃圾收集器会在我们完成后自动将其清除

  1. 通用算法
    2.1 在java.util 中的Arrays 数组类容纳着一系列静态方法可简化我们对数组的操作,总共有四个函数。equals()用于比较两个数组是否相等、fill()可将一个值填入数组、sort()可对数组排序、而binarySearch()用于在排好序的数组中查找一个元素。所有这些方法都已为全部原始数据类型及对象重载使用。除此以外还有一个asList()方法可用它获取任意数组然后把数组转变成一个List 容器。

2.2 sort和binarySearch的使用:在Java 2 中有两个办法可提供比较功能。第一个办法是用自然比较方法,这是通过实现java.lang.Comparable 接口来实现。Java 2 提供的第二个办法来进行对象的比较,单独创建一个类实现名为Comparator 的一个接口。接口提供了两个方法分别是compare()和equals() 。不过除非考虑到一些特殊的性能方面的因素,否则我们用不着实现equals() ,因为每次创建一个类的时候它都会默认从Object 继承,而Object 已经有了一个equals()。Comparator可以作为sort和binarySearch方法的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

            

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值