基础必会必考点 Java数组

Java 数组

连续存储的元素集合

<font face="楷体">个人认为Java中的数据即C++、C语言相同,一定是连续分配的。笔者在C语言教材找到这样一段话可以证明:All elements of a one-dimensional array are always stored in consecutive memory locations.

数组定义

非初始化:

int [] a1;

初始化:

int [] a2 = new int[10];

和C语言一样,数组的长度是不可变的,如果需要使用可变长的集合应该使用List而不是数组,当然也可以使用自己实现的Buffer。如List中使用的扩容方法是一个叫arraycopy的方法,感兴趣的可以取看下,其底层是JVM的实现。

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

C语言中要自己分配某长度的内存空间需要使用malloc函数。

p = (int *)malloc(len*sizeof(int)); 

数组遍历

方式1:

for (int item : a2){
    System.out.println(item);
}

方式2:

for (int i=0;i<a2.length;i++){
    System.out.println(a2[i]);
}

数组操作Arrays类

Java Arrays类中提供了很多便捷的方法对数组进行操作,包括排序,搜索,数组复制等操作。

如数组排序:

Arrays.sort(a2);

如数组是否相等比较:

boolean equals = Arrays.equals(a1, a2);

数组常见排序算法

选择排序

/**
 * 从第一个位置开始,依次选出最小的一个
 * @param arr
 */
public void selectionSort(int []arr){
    for(int i=0;i<arr.length;i++){
        int min = arr[i];
        int index = i;
        for (int j=i;j<arr.length;j++){
            if (arr[j]<min){
                min = arr[j];
                index = j;
            }
        }
        int temp = arr[index];
        arr[index] = arr[i];
        arr[i] = temp;
    }
}

冒泡排序

/**
 * 冒泡排序
 * @param arr
 */
public void bubbleSort(int []arr){
    for (int i=0;i<arr.length;i++){
        for (int j=0;j<arr.length-1;j++) {
            if (arr[j]>arr[j+1]){
                int temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j]   = temp;
            }
        }
    }
}

插入排序

/**
 * 插入排序
 * @param arr
 */
public void insertSort(int []arr){
    for (int i=0;i<arr.length;i++){
        for (int j=i;j>0;j--){
            if (arr[j]<arr[j-1]){
                int temp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = temp;
            }
        }
    }
}

快速排序

public void quickSort(int[] arr, int low, int high){
    if (low>=high)
        return;
    //基准值
    int base = arr[low];
    int i = low;
    int j = high;
    while (i!=j){
        //从左往右找一个大于基准值的,一定要先左右往左
        // 如 6 5 8 4 7 先右指正指向7索引为4,
        // 交换变成6 5 4 8 7,此时左指针为2,右指左指针指向8针为3
        // 先循环右指针,则最后i = j = 2
        // 先循环左指针,则最后i = j = 3 而索引为3的位置是大于base的不能和基准位置交换
        while (arr[j]>=base&&i<j){
            j--;
        }
        while (arr[i]<=base&&i<j){
            i++;
        }
        if (i<j){
            arr[j] = arr[j]^arr[i];
            arr[i] = arr[j]^arr[i];
            arr[j] = arr[j]^arr[i];
        }
    }

    {
        arr[low] = arr[low] ^ arr[i];
        arr[i] = arr[low] ^ arr[i];
        arr[low] = arr[low] ^ arr[i];
    }

    quickSort(arr,low,i-1);
    quickSort(arr,i+1,high);
}

public void quickSort(int []arr){
    quickSort(arr,0,arr.length-1);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兴趣使然的程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值