Array数组基础.Arrays工具类

一.一维数组的创建规范

1.正确的创建

char []  a = new char[4];  //4是数组的长度
char []  b= new char[]{'a','b'};
char []  c= {'a','b'};

2.错误的创建方法

char []  d = new char[2]{'a','b'}; //报错
char []  e = new char[2]{};//报错

一.二维数组的创建

int[] aa = new int[5];/创建成功的数组 编译器会给数组每个元素自动赋予其初始值。

//第一
int arr1[][] = new int[][] {{45,78,12},{23,56,89}};
//第二
int arr2[][] = {{74,85,96},{41,52,63}};
//第三
int arr4[][] = new int[2][3];    //第一行就是二维数组的第一个元素
arr4[0]=new int[] {48,15,26};
//arr4[0]={48,15,26};          语法错误 必须用new方法
arr4[1][0] =11;
arr4[1][1] =22;
arr4[1][2] =33;

二.遍历二维数组:

第一种方法:for循环遍历数组 。 第二种方法:foreach循环遍历二维数组

第一种方法的应用:横版竖版遍历古诗。

char arr5[][] = new char[4][]; //合法
arr5[0]=new char[] {'春','眠','不','觉','晓'};
arr5[1]=new char[] {'处','处','闻','啼','鸟'};
arr5[2]=new char[] {'夜','来','风','雨','声'};
arr5[3]=new char[] {'花','落','知','多','少'};
for(int i =0 ;i<arr5.length;i++) {
	for(int q =0 ;q<arr5[i].length;q++) {
		System.out.print(arr5[i][q]);
	}
	if(i%2==0) {
		System.out.print(",");  //i是从0开始的
	}else {
		System.out.print("。");
	}
	System.out.println();
}
	
System.out.println("——竖版打印——");
	for(int j =0;j<arr5[0].length;j++) { 	//切记这里不可以写成 j<arr5[i].length ,因为arr5[4]会导致数组越界
		for(int h =3 ;h>=0 ;h--) {
			System.out.print(arr5[h][j]);
		}
		System.out.println();
	}
		System.out.print("。,。,");

第二种方法的应用:foreach循环遍历古诗

for(char[]a:arr5) {
	for(char b:a) {
		System.out.print(b);
	}
		System.out.println();
}

三.Arrays工具类:数组的填充(一维数组)

一.填充和批量替换数组元素的语法

 Arrays.fill(arr 数组, int value填充的值)
 Arrays.fill(arr 数组,int fromIndex开始位置(包括),int tolndex结束(不包括).int value)

例子:

int[] a = new int[5];
a[0]=4; //此时数组a第一个元素为4,其他四个元素为0
Arrays.fill(a, 2); //现在5个元素全部为2,之前的操作全部被覆盖
char[] b = new char[] {'a','b','c','d','e','f','g','h'};
Arrays.fill(b, 2,5,'改');//结果为: a b 改 改 改 f g h (5的索引不包括)

应用:电话号码掩码。

int[] num = new int[] {1,5,5,2,2,0,4,2,5,4,8};
Arrays.fill(num, 3, 7, 0);
for(int i=0;i<num.length;i++) {
	if(num[i]==0) {
		System.out.print("*");
	}else {
		System.out.print(num[i]);
	}
}
输出结果为:155****2548

四.Arrays工具类:对数组进行排序

语法: Arrays.sort(Object)方法可以对任意类型的数组进行升序排序。

例子:

String[] str = new String[] {"a","sd","S","FD","78s"};
Arrays.sort(str); //结果为: 78s  FD  S  a  sd  
//java中String数组的排序是按照字典编排顺序来排序的
//所以数字在字母前面,大写字符在小写字母前面

五.Arrays工具类:复制数组

一、copyOf方法
Arrays.copyOf(arr数组,复制后数组的长度)
Arrays.copyOfRange(arr数组,开始位置,结束位置(不包括));

首先,我们先对数组进行一个存储状态的分析。

int[] a = new int[] {0,1,2,3,4,5,6,7};
int[] b = a;
String A = a.toString();
String B = b.toString();
//此时A和B的值 相等,说明此时 a和b 对应着相同的位置,他们为同一个对象。
a[2] =99; 		//此时 a,b数组均为 0 99 2 3 4 5 6 7 

例子:

int[] c = new int[] {0,1,2,3,4};
int[] d = Arrays.copyOf(c, 6);  //如果长度大于原数组长度则默认填充为该类型的默认值
// 这个方法为c数组开辟了一个新的内存区域
// c  d这两个数组分别指向两个独立的常量
c[0]=9;
//此时c数组为9 1 2 3 4 
//此时d数组为0 1 2 3 4 0

截取指定长度的数组

int[] c = new int[] {0,1,2,3,4};
int[] e = Arrays.copyOfRange(c, 1, 4);
//e的结果为 1 2 3

二.第二种拷贝数组的方法:(并非Arrays工具类)

System.arraycopy(src, srcPos, dest, destPos, length);
 *src 想要复制的数组
 *srcPos  想要复制的开始索引
 *dest  想复制到的数组
 *destPos  想复制到的数组的位置
 *length  想复制的长度

两者的区别在于,Arrays.copyOf()不仅仅只是拷贝数组中的元素,在拷贝元素时,会创建一个新的数组对象。而System.arrayCopy只拷贝已经存在数组元素。

我们看过Arrays.copyOf()的源码就会知道,该方法的底层还是调用了System.arrayCopyOf()方法。

案例一:
将一个数组的另一部分复制到另一个数组

int[] a = new int[] {1,2,3,4};
int[] b = new int[10];
System.arraycopy(a, 0, b, 0,4);
System.out.println(Arrays.toString(b)); //结果[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]

案例二:
从数组中删除某些元素 (本质上还是数组的拷贝)
例如我们打算删除数组中第二个元素,这里用自己复制给自己的方法比较好。

String[] str = new String[] {"aa","bb","cc","dd","ee"};
System.arraycopy(str, 3, str, 3-1, 2);
str[str.length-1]=null;
System.out.println(Arrays.toString(str));

本案例应用 封装一个删除数组中 某些元素的方法 并将原数组返回

//想要删除数组中s中索引为index的元素
public static String[] removeElements(String[] s,int index) {
	System.arraycopy(s, index+1, s, index, s.length-1-index);
	s[s.length-1]=null;
	System.out.println(Arrays.toString(s));
	return s;
}

案例三:
数组的扩容 本质上是 先定义一个更大的数组 ,然后将原数组内容原封不动拷贝到新数组

public static void extendRange() {
	int[] a = new int[] {4,6,5,6,1,4,587,42,4};
	int[] b = new int[a.length+10];
	System.arraycopy(a, 0, b, 0, a.length);
	System.out.println(Arrays.toString(b));
}

案例四:(综合练习)
封装一个方法,使调用该方法可以往指定的数组之中添加新的指定元素

第一种思路:
public static String[] putInsertElement(String[] s1,int index,String str) {
	String[] s2 = new  String[s1.length+1];
	System.arraycopy(s1, 0, s2, 0, index);
	System.arraycopy(s1, index, s2, index+1, s1.length-index);
	s2[index] = new String(str);
	System.out.println(Arrays.toString(s2));
	return s2;
}
第二种思路:
public static String[] putInElement(String[] s,int index,String str) {
	String[] s2 = new String[s.length+1];
	System.arraycopy(s, 0, s2, 0, s.length);
	System.arraycopy(s2, index, s2, index+1, s.length-index);
	s2[index]=new String(str);
	for(int i=0;i<s2.length;i++) {
		System.out.println(i+"---"+s2[i]);
	}
	return s2;
}

六.Arrays工具类:输出数组内容

方法:Arrays.toString()和Arrays.deepToString()

首先,我们先来看一维数组

int[] a= {1,2,45,3,4,5};
System.out.println(a);//结果为  [I@27716f4
System.out.println(Arrays.toString(a));//结果为  [1, 2, 45, 3, 4, 5]

其次我们再来看二维数组

int[][] b = {{1,2,3,4},{5,6,7,8}};
System.out.println(b);//结果为:[[I@27716f4
System.out.println(Arrays.toString(b));//结果为:[[I@8efb846, [I@2a84aee7]
System.out.println(Arrays.deepToString(b));//结果为:[[1, 2, 3, 4], [5, 6, 7, 8]]

##总结一小下,当用一维数组的时候,可以用Arrays.toString(数组名)来输出此格式的数组元素内容;当用二维数组的时候,可以用Arrays.deepToString()(数组名)来输出此格式的数组元素内容。

七.Arrays工具类:数组查询

方法:Arrays.binarySearch(数组名,值)
Arrays.binarySearch(数组名,开始的索引,结束的索引(不包括),值);

	如果值包含在数组之中,则返回搜索值的索引,否则返回-1或“-”(插入点),插入点是搜索键将要插入的数组的哪一个点,即第一个大于此键的元素索引。
第二个方法返回查找值在指定范围内是否存在,并返回在整个数组中的索引或“-”插入点

前提:必须要在调用此方法前使用Arrays.sort()方法对数组进行排序,否则会发生无法正确得出结果。

int[] c = {40,1,3,2,25,10};
Arrays.sort(c);
Arrays.toString(c); // 1 2 3 10 25 40
	//数组元素中没有8,8在10前,所以插入点元素为10 → 1 2 3 8 10 25 40,插入点的索引为4
System.out.println(Arrays.binarySearch(c, 8));// -4
	//数组元素中没有80,80在40之后,所以插入点为? → 1 2 3 10 25 40 80 ? ,插入点的索引为7
System.out.println(Arrays.binarySearch(c, 80)); //-7
	//10是数组元素,返回10在数组中的索引 3
System.out.println(Arrays.binarySearch(c, 10)); //3

	int[]d = {1,2,3,4,5,6,7,8,9};
	//第二个方法返回查找值在指定范围内是否存在,并返回在整个数组中的索引或“-”插入点
	System.out.println(Arrays.binarySearch(d,2,7,5));//结果是4
	//61不在截取的数组内,61在77前,所以77位插入点 。在整个数组中1,2,3,4,5,6,61,77,88,99,插入点索引为7
	System.out.println(Arrays.binarySearch(d,4,8,61));//-7
	//6不在截取的数组内,6在5的后面,所以第二个6为插入点。在整个数组中1,2,3,4,5,6,6,77,88,99,插入点索引为6
	System.out.println(Arrays.binarySearch(d,1,5,6));//-6
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值