Java的数组

数组。

数组引入和定义
int
char

数组:是一种数据类型符号为[].这种数据类型可以保存一组数,是一组数的集合。这一组数数据的类型必须是相同的。

数组的定义:
定义变量:
int age = 10;
定义数组:
int[] ages = new int[10];
int[] ages;
ages = new int[10];

语法:
数组元素类型[] 数组名 = new 数组元素类型[元素个数];

每个元素都是一个变量。如何访问每一个元素:数组名[元素的序号]
元素的序号从0开始,0序的。最大的序号 是 【个数-1】

小练习

需求:10个学生,有各自的成绩。score [60-100] 求这十个学生的平均成绩和总成绩。

static void testArray(){
		int avg = 0,sum = 0;
		//定义数组,10个int 类型的数据空间
		int[] scores = new int[10];
		//给每一个数组的元素赋值。element
		for(int i=0;i<10;i++){
			scores[i] = getRandomNumberByRange(60,101);
			sum += scores[i];
		}
		avg = sum/10;
		
		System.out.println("avg = "+avg);
		System.out.println("sum = "+sum);
		
		for(int i=0;i<10;i++){
			System.out.println("scores["+i+"] = "+scores[i]);
		}
	}

数组的特点

关于数组的细节的内容:

1:数组里面的包含的数据的类型必须是唯一的,每一个数据被称为数组的元素 element。
2:数组元素在堆内存中连续分配。每个元素会有一个序号。称之为 下标、索引、角标。下标从0开始。0序的。 index
3:数组通过 数组名+[下标] 来访问每个元素。每个元素都可以被看作是一个普通的变量来对待。
4:数组有一个长度的属性(元素的个数). 用 数组名.length 获得。 类型为 int。
5:数组的下标的范围 [0, 数组名.length-1] [.]点引用符。
6: 数组是一种引用数据类型,数组变量名是指向堆内存中数组元素的首地址的引用。
7:数组的长度一旦确定,就不能再更改了。
8:数组的元素的类型是java支持的任意类型。

int[] arr =new int[20];

arr[10] = 10;

连续分配的好处:
快速定位元素:元素地址 == 首地址+元素类型所占的字节数*下标。
坏处:每个数组对空间的要求都是连续的,如果没有连续的这么大的请求的空间,那么就报错了。

数组的初始化

数组的初始化分为两种:

1:动态初始化。
例子:int[] ages = new int[10];

特点:
1:动态初始化,需要显式的指定数组的元素的个数和类型。
2:使用new 关键字进行动态初始化。
3:new 关键字的作用:1:向jvm 申请内存空间 2:将申请得来的内存空间的首地址带回 赋值给 数组变量。
4:动态初始化的数组的每个元素都会被赋予默认值。
整数类型默认值:0 byte short int long char 中0 对应的字符。
浮点数默认值:0.0
布尔类型:flase。
引用数据类型的默认值: null。 是一个关键字,代表空 空指向。
5:动态初始化,声明和赋值可以分开进行。
int[] ages = null; ages = new int[10];

2:静态初始化
例子:
int[] ages = new int[]{12,23,45,56};

特点:
1:数组的长度由右边大括号中的值的个数来确定。
2:每个元素的默认值由大括号中的数值来初始化。没给大括号中的值用 逗号 分割。
3:静态初始也可以声明和赋值分开。
int[] ages; ages = new int[]{2,3,54,5};

静态初始化还有一种语法:
int[] ages = {12,4,5,5}; 糖语法。

特点:赋值和声明必须在同一行进行。不能声明和赋值分开进行。

数组定义的多种语法:
int[] ages = new int[10];
int ages[] = new int[10];
int []ages = new int[10];
int [] ages = new int[10];

数组练习题

//定义一个boolean类型的数组,动态初始化,长度随机[5-10];并打印输出数组的长度。然后对数组元素随机赋值 Random提供的nextBoolean 方法。
//遍历输出数组的元素的内容。 上述内容,在一个自定义的方法内实现。
//在写一个方法:功能要求:定义一个byte类型的数组,长度为5,静态初始化,元素的数值要求随机,范围[0-100],最后遍历输出数组的内容。

import java.util.Random;
public class TestArray1{
	
	public static void main(String[] args){
		test2();
	}
	
	static void test1(){
		Random random = new Random();
		int length = (int)(Math.random()*(11-5)+5);
		System.out.println("length = "+length);
		boolean[] bools = new boolean[length];
		
		for(int i = 0;i<bools.length;i++){
			System.out.print(bools[i]+"\t");
		}
		System.out.print("\n");
		
		for(int i = 0;i<bools.length;i++){
			bools[i] = random.nextBoolean();
			System.out.print(bools[i]+"\t");
		}
	}
	
	static void test2(){
		byte[] values = {
			getRandomNumberByRange(0,101),
			getRandomNumberByRange(0,101),
			getRandomNumberByRange(0,101),
			getRandomNumberByRange(0,101),
			getRandomNumberByRange(0,101)
		};
		for(int i=0;i<values.length;i++){
			System.out.println("values["+i+"] = "+values[i]);
		}
	}
	
	public static byte getRandomNumberByRange(int min,int max){
		byte number = (byte)(Math.random()*(max-min)+min);
		return number;
	}
	
	
}

// 1:定义一个方法,根据给定的长度,动态初始化一个int类型元素数组,然后对元素随机赋值,根据指定的区间, 返回该数组 就是返回数组变量。

// 2:通过上面的方法,得到一个数组之后,再自定一个方法,对给定的数组,求出该数组中存在内容为指定值(随机产生[10-20] 并打印输出一下)的元素的数量。
// 有多少个元素和指定的值相同,,最后输出结果。

// 3:方法要求:将指定数组元素的内容为指定值 的 索引(数组下标)全部返回。返回一个数组,数组中包含的是指定数组的元素的索引值。

public class TestArray3{
	
	public static void main(String[] args){
		int[] arr = getRandomArrayByLength(12,10,17);
		
		printArray(arr);
		
		System.out.println(getCountByTheValue(arr,12));
		
		int[] indexs = getValueIndexs(arr,15);
		
		printArray(indexs);
	}
	
	//得到指定的长度,指定元素区间的int 类型的数组
	public static int[] getRandomArrayByLength(int length,int min,int max){
		//动态初始化一个数组
		int[] temp = new int[length];
		//对数组的元素随机赋值
		for(int i=0;i<length;i++){
			temp[i] = getRandomNumberByRange(min,max);
		}
		return temp;
	}
	
	//得到指定数组,中指定值的数量
	public static int getCountByTheValue(int[] array,int value){
		int counter = 0;
		final int LEN = array.length;
		for(int i=0;i< LEN ;i++){
			if(array[i] == value){
				counter ++;
			}
		}
		return counter;
	}
	
	//得到指定的数组中的指定值的索引的集合
	public static int[] getValueIndexs(int[] array,int value){
		//先得到相同数据的个数
		int length = getCountByTheValue(array,value);
		int[] indexs = new int[length];
		//
		int index = 0;
		for(int i=0;i<array.length;i++){
			if(array[i] == value){
				indexs[index++] = i;
				// index ++;
			}
		}
		return indexs;
	}
	
	//对指定的int 类型的数组,进行打印元素内容[1,2,3,5,5,43] 
	public static void printArray(int[] array){
		System.out.print("[");
		for(int i=0;i<array.length-1;i++){
			System.out.print(array[i]+",");
		}
		System.out.print(array[array.length-1]);
		System.out.print("]\n");
	}
	
	public static byte getRandomNumberByRange(int min,int max){
		byte number = (byte)(Math.random()*(max-min)+min);
		return number;
	}
	
}

自定义方法,对与给定数组,求出最大值。

// 定义方法,求指定的数是否是 偶数

public class TestArray4{
	
	public static void main(String[] args){
		// int[] array = getRandomArrayByLength(10,10,20);
		// int max = getArrayMaxValue(array);
		// System.out.println(max);
		//System.out.println(getArrayMaxValue(getRandomArrayByLength(10,10,20)));
		int[] array = getRandomArrayByLength(2,10,20);
		changeArrayValue(array);
		printArray(array);
	}
	
	
	//求指定的数是否是偶数
	public static boolean isEven(int value){
		return value % 2 == 0;
	}
	
	//自定义方法,对与给定int数组,求出最大值。
	public static int getArrayMaxValue(int[] array){
		int max = array[0];
		final int LEN = array.length;
		//和后续的元素逐个比较,比max大,就把元素的值赋值给max
		for(int i = 1;i<LEN ;i++){
			if(max < array[i]){
				max = array[i];
			}
		}
		return max;
	}
	
	//对指定的长度为2的数组,交换该数组的两个元素的值。
	public static void changeArrayValue(int[] array){
		int temp = array[0];
		array[0] = array[1];
		array[1] = temp;
	}
	
	
	//得到指定的长度,指定元素区间的int 类型的数组
	public static int[] getRandomArrayByLength(int length,int min,int max){
		//动态初始化一个数组
		int[] temp = new int[length];
		//对数组的元素随机赋值
		for(int i=0;i<length;i++){
			temp[i] = getRandomNumberByRange(min,max);
		}
		
		printArray(temp);
		
		return temp;
	}

	//对指定的int 类型的数组,进行打印元素内容[1,2,3,5,5,43] 
	public static void printArray(int[] array){
		System.out.print("[");
		for(int i=0;i<array.length-1;i++){
			System.out.print(array[i]+",");
		}
		System.out.print(array[array.length-1]);
		System.out.print("]\n");
	}
	
	public static byte getRandomNumberByRange(int min,int max){
		byte number = (byte)(Math.random()*(max-min)+min);
		return number;
	}
	
}

增强for循环

增强的for 循环:
for-each jdk 1.5 出现的新的语法形式。
主要是针对数组、容器进行遍历访问用的。

语法:
int[] array;
for(int value : array){

}

说明:
array:是被遍历的数组 或者是 容器。
value 是每次迭代(底层完成的),value 的值就是当前下标的元素的值。

问题:value 只是数组元素值的一个副本 、拷贝。
	通过value 没有办法去修改原本的数组的元素的值。

总结:增强的for 循环,只是比基本的for 循环语法简单了。但是只能用于遍历数组或者容器。
如果想通过循环给元素赋值,或者修改元素的值,是做不到的,必须通过数组名+下标的方式访问元素去修改。

数组删除元素

删除元素 (指定下标):
2种实现
1:直接在源数组上删除。后续的元素需要整体前移。(最后的元素不需要处理)。 最后返回数组的有效数据的个数。
2:创建一个源数组长度 减1 的新数组。将源数组中不需要删除的内容,整体迁移到新数组中。并返回新数组。

//删除元素 在源数组

public static int delElementByIndex(int[] srcArr,int delIndex){
		int count = srcArr.length - delIndex - 1;
		
		for(int i= delIndex;i<delIndex + count;i++){
			srcArr[i] = srcArr[i+1];
		}
		return srcArr.length-1;
	}

在指定的索引的位置插入元素

在指定的索引处的插入一个元素。该位置的原来的元素和后续的所有的元素整体后移。挤掉最后一个元素
1:修改源数组,挤掉最后一个元素。
2:创建一个长度为源数组长度+1的新数组,然后将指定的内容和源数组的内容放置到新的数组中。 最后返回新数组。

//在指定的数组中的位置上插入指定的数据,返回新的数组

public static int[] insertElementByIndex(int[] srcArr,int insertIndex,int value){
		final int NEW_LEN = srcArr.length + 1;
		//创建新数组
		int[] temp = new int[NEW_LEN];
		//循环赋值
		for(int i=0;i<NEW_LEN;i++){
			if(i < insertIndex){
				temp[i] = srcArr[i];
			}else if(i == insertIndex){
				temp[i] = value;
			}else{
				temp[i] = srcArr[i-1];
			}
		}
		return temp;
	}

Arrays工具类

Math:数学工具类。

Arrays :针对数组进行操作的工具类。

java.util.Arrays.
此类包含用来操作数组(比如排序和搜索)的各种方法。

常用的方法:
static int binarySearch(int[] a, int key)
使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。
static int binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。

static int[] copyOf(int[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。

static boolean equals(byte[] a, byte[] a2)
如果两个指定的 byte 型数组彼此相等,则返回 true。

static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组的每个元素。
static void fill(int[] a, int fromIndex, int toIndex, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。

static void sort(int[] a)
对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex)
对指定 int 型数组的指定范围按数字升序进行排序。

static String toString(int[] a)
返回指定数组内容的字符串表示形式。

变参-方法

jdk1.5的特性:变参方法

变参方法的语法:
(参数的类型 … 参数变量名)

特点:
1:变参方法可以接收的参数的数量为[0~n];
2: 如果有定参方法,有变参方法,优先匹配定参的方法执行。
3:如果参数列表中有变参的存在,那么变参参数只能在参数列表的末尾。后面不能在有参数。
4:一个参数列表中,变参的个数最多是一个。
5:变参参数底层使用数组实现。处理变参参数就和处理数组一样一样的。
6:变参参数可以接收数组作为实参。

多维数组

一维数组:
//线性分配空间的。
int[] array = {1,2,3,54,5,6,7,87,77};

多维数组:
严格意义上来说,java 就没有多维数组的概念。

二维数组:本质上还是一维数组,只不过数组的元素还是数组。

语法:
动态初始化
int[][] array  =new int[3][5];
前面中括号称之为 高纬
后面中括号称之为 低纬

可以先分配高纬度,然后再对每一个高纬数组元素分配空间。
//分配了一个一维数组,一位数组的元素是数组,元素数量为3,默认值为 null。
int[][] array  =new int[3][];
//给每一个低纬的一纬数组分配空间
array[0] = new int[10];
array[1] = new int[100];
array[2] = new int[150];


静态初始化。
int[][] array  =new int[][]{
	{1,2,3},
	{23,4,5,67,8,66},
	{12,234,45,56,65,45,34}
};

int[][] array  ={
	{1,2,3},
	{23,4,5,67,8,66},
	{12,234,45,56,65,45,34}
};


数组的知识还有很多,我只讲这么多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值