Java数组,Arrays工具类

数组的基本概念

    数组是储存多个相同类型的元素,虽然数组中的元素均为基本元素,但是Java中使用了类似对象的处理方式处理数组。在数组的初始化中使用new进行初始化。

创建一个一维数组

定义数组的方式为:

    数组元素类型    [ ]数组名;如下实例

int arr1[];		//定义一个int类型的数组
int []arr2;
String []arr3;	        //定义一个String类型的数组
char []arr4;            //定义一个字符类型数组
boolean []arr5;         //定义一个boolean类型数组

    数组定义中中括号[ ]可以在数组名的前面或者后面,表达式效果相同,Java中推荐放在数组名前。

数组定义后还不能对数组进行访问,因为定义中只是声明了数组的类型和数组名,想要真正让数组发挥作用还需要对数组进行初始化,为当前数组分配内存空间。

数组的初始化

    数组的初始化分为静态初始化和动态初始化两种。

动态初始化

       动态初始化中需要给数组指定一个长度,语法格式为:
//先定义再初始化.
	int []arr1;			
	arr1=new int[6];
//定义和初始化一起执行.
	int []arr2=new int [5];
动态初始化中只需给定一个数组长度,系统会默认给当前数组中的元素提供一个默认值。默认值随数组类型给出,比如:
int []arr1=new int[5];
System.out.println(arr1[2]);
	//此时会输出 0
String []arr2=new String[3];
System.out.println(arr2[2]);
	//此时会输出 null
boolean []arr3=new boolean[4];
System.out.println(arr3[2]);
	//此时会输出 false

静态初始化

    静态初始化中需要给定数组中的元素的值,由系统计算数组的长度。语法格式为:

int []arr=new int[]{1,2,3,4,5};
int []arr2={3,4,5,6};
静态初始化中可以省略new,两种方式效果一样。需要注意 不可以写成如下形式:
//int []arr=new int[5]{1,2,3,4,5};
//这种书写方式是错误的,数组的初始化中静态初始化和动态初始化只能选择一种。

数组的应用

    数组的遍历

        for循环遍历。

public class TextDemo {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		out(arr);
	}

	public static void out(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ", ");
			}
		}
	}
}
//输出结果为[1, 2, 3, 4, 5, 6, 7, 8, 9]

需要注意描述数组的长度时数值从1开始,操作数组中的元素时的脚标从0开始如:

int [ ]arr=new int[ 3 ];

arr这个数组中包含了arr[0],arr[1],arr[2]这三个元素。

arr.length表示当前数组的长度。

        使用Arrays类中的toString方法遍历数组

此方法可以将数组转化成字符串遍历输出。

该方法为静态方法使用类名调用。

import java.util.Arrays;//需要导包

public class arr {
	public static void main(String[] args) {
		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		System.out.println(Arrays.toString(arr));
		int[][] arr2 = { { 1, 2, 3 }, { 4, 5, 6 } };
		System.out.println(Arrays.toString(arr2[0]));
		System.out.println(Arrays.toString(arr2[1]));
	}
}
/**输出为:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3]
[4, 5, 6]
 */

        使用String拼接

public class buffer {
	public static void main(String[] args) {
		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		String a = new String();
		a += "[";
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				a += arr[i];
				a += "]";
			} else {
				a += arr[i];
				a += ", ";
			}
		}
		System.out.println(a);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	}
}

 使用StringBuffer中的append方法

public class buffer {
	public static void main(String[] args) {
		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		StringBuffer a = new StringBuffer("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				a.append(arr[i]+"]");
			} else {
				a.append(arr[i]+", ");
			}
		}
		System.out.println(a);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	}
}

数组元素的逆序

public class TextDemo {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		out(arr);
		reversed(arr);
		out(arr);
	}

	public static void reversed(int[] arr) {
		//数组逆序排列
		for(int i=0;i<=arr.length/2;i++) {
			int temp=arr[i];
			arr[i]=arr[arr.length-1-i];
			arr[arr.length-1-i]=temp;
		}
		
	}
 	public static void out(int[] arr) {
		//打印数组
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ", ");
			}
		}
	}
}
/**输出为:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
*/

数组中的元素的查找

    基本查找法

import java.util.Scanner;
public class TextDemo {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
		find(arr);
	}
	public static void find(int[] arr) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入要查询的数:");
		int a = sc.nextInt();
		int j = 0;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == a) {
				System.out.println("该元素在当前数组的第" + (i+1) + "位。");
				j++;
			}
		}
		if (j == 0) {
			System.out.println("该元素不在当前数组中。");
		}
	}
}
/**输入为3时的输出:
 请输入要查询的数:
3
该元素在当前数组的第3位。
该元素在当前数组的第7位。
 */

/**输入为7时的输出:
请输入要查询的数:
7
该元素不在当前数组中。
*/

折半查找法

折半查找是每次去出需要查找的中间值,然后和需要查找的数进行比较,大的话就从左边的再进行折半查找,小的话就从右边开始折半查找,最终找到相等的值时返回此时的下标。

折半查找法需要数组是按从小到大排列的,如果数组不是有序的还是使用基本查找法。

import java.util.Scanner;

public class ArrayDemo3 {

	public static void main(String[] args) {

		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		System.out.println("请输入要查询的元素");
		Scanner sc = new Scanner(System.in);
		int index = search(arr, sc.nextInt());
		if (index == -1) {
			System.out.println("查找元素不在数组中");
		} else {
			System.out.println("查找元素下标为:" + index);
		}

	}

	public static int search(int[] arr, int value) {
		// 1定义数组中的最小索引和最大索引
		int min = 0;
		int max = arr.length - 1;
		// 2 计算出中间索引
		int mid = (max + min) / 2;
		// 3)拿中间索引对应的元素和需要查找的元素进行比较
		// 如果相等,返回
		while (arr[mid] != value) {
			// 不相等
			if (arr[mid] > value) {
				max = mid - 1;
			} else {
				min = mid + 1;
			}
			// 如果这value在数组中找不到,找不到返回-1
			if (min > max) {
				return -1;
			}
			// 重新计算出中间索引
			mid = (max + min) / 2;
		}
		return mid;
	}
}
/**
请输入要查询的元素
10
查找元素下标为:9

 请输入要查询的元素
55
查找元素不在数组中
 * */

    数组的排序

将一个数字数组按从小到大顺序排列

        冒泡排序法

此方法是依次比较数组中前后两个数的大小,前一个比后一个大则交换,每次循环后会将最大的数换到最后。

import java.util.Arrays;

public class Arr {
	public static void main(String[] args) {
		int[] arr = { 2, 5, 6, 9, 1, 3, 8, 4, 10, 7 };
		System.out.println(Arrays.toString(arr)); // Arrays.toString方法遍历数组
		for (int i = 0; i < arr.length; i++) { // 控制循环排序次数,一共进行数组长度-1次
			for (int j = 0; j < arr.length - 1 - i; j++) { // 依次对比将大的交换到最后,每遍历过一次后比较的次数-1
				//注意因为有arr[j + 1],所以j的取值只能取到数组长度-1次,不然会超出范围
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j + 1];
					arr[j + 1] = arr[j];
					arr[j] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
	}
}
// [2, 5, 6, 9, 1, 3, 8, 4, 10, 7]
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

        比较排序法

抽取第一个元素然后和之后所有元素比较,谁比他小就交换,最终会将最小的排在第一个,然后再抽取下一位。

import java.util.Arrays;

public class Arr {
	public static void main(String[] args) {
		int[] arr = { 2, 5, 6, 9, 1, 3, 8, 4, 10, 7 };
		System.out.println(Arrays.toString(arr));
		for (int i = 0; i < arr.length - 1; i++) {// 控制循环进行的次数
			for (int j = i + 1; j < arr.length; j++) { // 从抽取的数的下一位开始依次比较
				if (arr[i] > arr[j]) {
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}

			}
		}
		System.out.println(Arrays.toString(arr));
	}
}
// [2, 5, 6, 9, 1, 3, 8, 4, 10, 7]
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

对象数组

用来存储对象的数组

class Student {
	// 创建一个学生类
	String name;
	int age;

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public Student() {
		super();
	}

	@Override
	public String toString() {
		return "Student [姓名=" + name + ", 年龄=" + age + "]";
	}

}

public class Arr {
	public static void main(String[] args) {
		// 创建对象数组
		Student[] stuarr = new Student[4];
		// 创建4个学生对象
		Student s1 = new Student("张三", 23);
		Student s2 = new Student("李四", 24);
		Student s3 = new Student("王五", 21);
		Student s4 = new Student("赵六", 20);
		// 赋值
		stuarr[0] = s1;
		stuarr[1] = s2;
		stuarr[2] = s3;
		stuarr[3] = s4;
		// 遍历
		for (int i = 0; i < stuarr.length; i++) {
			System.out.println(stuarr[i].toString());
		}
	}
}
/**
Student [姓名=张三, 年龄=23]
Student [姓名=李四, 年龄=24]
Student [姓名=王五, 年龄=21]
Student [姓名=赵六, 年龄=20]
 */

二维数组

二维数组的定义:

//动态初始化;
int [][]arr=new int[3][2];
int []arr2[]=new int[3][2];
int arr3[][]=new int[3][2];
//静态初始化
int [][]arr4=new int[][]{{3,5,8,9},{1,2,3,5}};
int [][]arr5= {{1,4,5,8,9},{1,1,2,5,5}};

二维数组中第一个元素相当于定位到第几个一维数组,也就是说一维数组是一些类型相同的元素的集合,二维数组是一些元素相同的一维数组的集合.

动态初始化还可以动态定义每一个一维数组的长度:

//通过动态给定每个一维数组的长度
arr[0]=new int[2];
arr[1]=new int[1];
arr[2]=new int[4];
arr[2][3]= 5;        //该元素是arr[2][]的最后一个元素,而不是arr[2][4].
System.out.println(arr[2][3]);

需要注意此时定义的是长度,也就是说

arr[2]=new int[4];

此时定义的是第三个一维数组的长度为4,则这个数组的最后一个元素为arr[2][3].

如果在调用中写成arr[2][4]则会发生异常ArrayIndexOutOfBoundsException

二维数组的遍历:

public class ARRTEXT {
	public static void main(String[] args) {
		int[][] arr = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9 }, { 10, 11 } };//静态初始化二维数组
		printArray(arr);

	}

	public static void printArray(int[][] arr) {
		for (int x = 0; x < arr.length; x++) {
			for (int y = 0; y < arr[x].length; y++) {
				System.out.print(("["+arr[x][y] + "] "));
			}
			System.out.println();
		}

	}
}
//输出结果为:
/*
[1] [2] [3] [4] [5] 
[6] [7] [8] [9] 
[10] [11] 

 */

Arrays工具类

Java中为我们提供了数组相关的一个工具类,使用该工具类可以方便的输出编辑数组。

工具类只有静态方法。

    toString()

将数组转化为字符串,有多个重载方法,可以支持boolean、float、int、long、short对象数组。

    sort()

将数组升序排列,是一个改进的快速排序,比起传统的冒泡,选择排序速度更快

    binarySearch(int[] a,int key)

二分法查找数组,返回值为int型

import java.util.Arrays;
//使用Arrays工具类需要导包。
public class test {
	public static void main(String[] args) {

		int arr[] = { 5, 4, 8, 9, 6, 7, 1, 2, 3 };
		// 遍历数组
		System.out.println(Arrays.toString(arr));// [5, 4, 8, 9, 6, 7, 1, 2, 3]
		// 数组升序排列
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
		// 查找4在当前数组中的位置,使用二分法查找
		System.out.println(Arrays.binarySearch(arr, 4));

	}

}

    asList(T... a)

public static <T> List<T> asList(T... a)

将数组转化成固定大小的集合,该集合的长度不可变,添加删除等相关功能都会报错。

import java.util.Arrays;
import java.util.List;

public class test {

	public static void main(String[] args) {
		String[] s = { "java", "word", "hello", "google" };
		// 转换成固定长度的集合
		List<String> list = Arrays.asList(s);
		// list.add("android"); UnsupportedOperationException不支持该操作
		// 可以使用替换
		list.set(2, "android");
		for (String st : list) {
			System.out.print(st + " ");// java word android google
		}

	}
}

异常

    数组中常见的异常:

        ArrayIndexOutOfBoundsException:数组角标越界异常

访问了定义中不存在的数组角标,属于运行中异常,编译的时候可以通过。

解决办法可以在代码中加入非空判断,当数组不为空的时候才可以输出。




  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值