数组的创建
Java数组的创建和C语言有着较大的区别,在理解程度上个人认为是C语言的数组创建模式更能让人接受,但是在结构合理上Java则更胜一筹;
创建数组有三种方式:
//第一种,创建加字面量
int[] arr = new int[]{1, 2, 3, 4};
//第二种,是第一种的简化
int[] arr1 = {1, 2, 3, 4};
//第三种,给出数组空间并将元素初始化为0
int[] arr2 = new int[4];
数组的使用
数组的常规使用
获取数组个数
在Java中获取一个数组的个数是使用.length来获取的,具体使用格式为:数组名.length;
int[] arr2 = new int[4];
System.out.println(arr2.length);
4
获取数组元素
在Java中获取元素的方法和C语言中一样的,同时Java数组下标也与C语言一样,首元素地址的下标也是0;
int[] arr1 = {1, 2, 3, 4};
System.out.println(arr1[0]);
1
数组的运用
数组的遍历
Java中数组的遍历与C语言略微有些不一样,Java中数组的遍历有两种样式,一种是for循环遍历,还有一种是for-each遍历;
int[] arr1 = {1, 2, 3, 4};
//for循环遍历
for(int i = 0; i < arr1.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
//for each遍历
for(int x : arr1){
System.out.print(x + " ");
}
值得注意的是,for-each遍历不能够改变数组中的值,即可以打印数组、可以用数组进行运算,但是就是不能改变数组中的元素的字面量;
数组的快速打印
我们知道任何类型的值在与String类型的变量进行连接后,其最终的结果都是String类型的;
所以我们可以根据这个来进行快速打印出数组;
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(arrayToString(arr));
}
public static String arrayToString(int[] arr) {
String result = "[";
for(int i = 0; i < arr.length; i++){
result += arr[i];
if(i != arr.length - 1){
result += ", ";
}
}
result += "]";
return result;
}
但是,我们能够想到的事情,开发者们回想不到吗?所以我们没有必要一要打印数组就把这个方法写一遍,因为标准库中本来就有;
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(Arrays.toString(arr));
注意:使用Arrays类需要导包:java.util.Arrays;
数组引用
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
int[] ret = arrayToString(arr);
System.out.println(Arrays.toString(ret));
}
public static int[] arrayToString(int[] arr) {
int[] result = new int[4];
for(int i = 0; i < arr.length; i++){
result[i] = arr[i] * 2;
}
return result;
}
在这个代码中有数组引用的几个知识点;
1、数组传参传数组名即可,方法接收实参的形参应该是这么书写:类型 数组名;其中形参的数组名是可以变化的,不一定非和实参的数组名一致;
2、Java的方法是能够返回数组的,这和C语言具有本质上的区别,因为Java中的数组就是数组,不会隐式转换成其他形式的数据;
3、如果方法是返回一个数组的话,其方法返回类型也得是数组才可;
查找元素
遍历查找元素是最暴力也是最有效的方法,遍历可以用for循环遍历,也可以会用for-each遍历;
public static void main(String[] args) {
int[] arr = new int[]{4, 5, 8, 9, 36, 1};
int ret = findArray(arr, 9);
System.out.println(ret);
}
public static int findArray(int[] arr, int num) {
for(int i = 0; i < arr.length; i++){
if(arr[i] == num){
return i;
}
}
return -1;
}
二分查找
遍历查找虽然有效但却不是最有效率的,一旦数组元素多的话所耗费的时间也将大幅度上升,所以我们又出现了二分查找;
public static void main(String[] args) {
int[] arr = new int[]{4, 5, 8, 9, 36, 1};
int ret = searchArray(arr, 9);
System.out.println(ret);
}
//二分查找本质上就是找中间值与所查找的值进行比较,根据比较结果来缩小范围
public static int searchArray(int[] arr, int num) {
//设置两个边界值
int left = 0;
int right = arr.length - 1;
while(left <= right){
//设置中间值
int mid = (left + right) / 2;
//进行比较判断
if(arr[mid] == num){
return mid;
}else if(arr[mid] > num){
right = mid - 1;
}else if(arr[mid] < num){
left = mid + 1;
}
}
return -1;
}
冒泡排序
冒泡排序是算法比较常考的一种排序方法,它可以将数组中的元素按升序或降序的队形排列;
public static void main(String[] args) {
int[] arr = new int[]{4, 5, 8, 9, 36, 1};
bubbleArray(arr);
System.out.println(Arrays.toString(arr));
// System.out.println(ret);
}
//冒泡排序就是通过循环嵌套使两两相邻的两个元素进行比较
public static void bubbleArray(int[] arr) {
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
同样的,我们在排序的时候也不用自己写一个方法,标准库中的Arrays早就为我们准备好了,使用Arrays.sort就能够进行排序;
public static void main(String[] args) {
int[] arr = new int[]{4, 5, 8, 9, 36, 1};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
[1, 4, 5, 8, 9, 36]
每日一答
从今天开始,我会在每篇博客的最后加上每日一答,希望和大家一起探讨,也希望大家能把自己的答案和见解发到评论中,具体的答案会在下一篇博客中给出;
本篇博客的问题,请问下列代码输出的结果是什么?
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = arr1;
arr2[0] = 100;
System.out.println(Arrays.toString(arr1));