数组

1 数组: 本质上就是让我们能 “批量” 创建相同类型的变量.

2 创建数组:

定义 加赋值, [] 里面不能写数组大小.
(1) 动态初始化: int[] arr1 = new int[]{1, 2, 3};
(2) 静态初始化: int[] arr2 = {1, 2, 3};

定义 但不赋值, [] 里面可以写数组大小.
int[] arr1 = new int[3]; 初始默认里面的元素 都为0.

3 数组的使用
(1) arr.length能够获取到数组的长度.
(2) 数组下标从0开始,下标的访问不能超出有效范围[0,length-1],如果超出有效范围就会出现下标越界异常. 使用数组一定要下标谨防越界.

4 for-each 遍历数组(更方便,推荐使用)

int[] arr = {1, 2, 3};
for (int x : arr) {
    System.out.println(x);
}

5 数组是引用类型,也属于一个new出来的对象.
6 null在 java中表示 “空引用” , 也就是一个无效的引用.一旦尝试读写, 就会抛出 NullPointerException异常.

7 JVM与数组的关系.在这里插入图片描述
在这里插入图片描述
8 (1) 打印数组: Arrays.toString(). 也就是把数组转字符串输出, 输出格式为 [1,2,3,4,5,6].

int[] arr = {1,2,3,4,5,6};
String str = Arrays.toString(arr);
System.out.println(str);        [1, 2, 3, 4, 5, 6]

实现自己版本的数组转字符串(就是拼接字符串)

public static String toString(int[] arr) {
    String ret = "[";
    for (int i = 0; i < arr.length; i++) {
        ret += arr[i];
        if (i != arr.length - 1) {
            ret += ", ";
       }
   }
    ret += "]";
    return ret;

(2) toArray(). 集合转为数组.

Collection<String> collection=new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("计算机");
Object[] array=collection.toArray();

9 Arrays.copyOf(). 数组拷贝. copyOfRange(), 自定义拷贝范围.
相比于 arr2= arr 这样的 赋值, copyOf 是将数组进行了 深拷贝. 即又创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中. 因此, 修改原数组,不会影响到新数组.

int[] arr = {1,2,3,4,5,6};
int[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));
arr[0] = 10;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("newArr: " + Arrays.toString(newArr));
// 拷贝某个范围. 
int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
System.out.println("newArr2: " + Arrays.toString(newArr2));

实现自己版本的数组拷贝

public static int[] copyOf(int[] arr) {
    int[] ret = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        ret[i] = arr[i];
   }
    return ret; }

10 二分查找的效率很高, 但前提是数组必须是 有序数组.

 public static int binarySearch(int[] arr, int toFind) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (toFind < arr[mid]) {
                // 去左侧区间找
                right = mid - 1;
            } else if (toFind > arr[mid]) {
                // 去右侧区间找
                left = mid + 1;
            } else {
                // 相等, 说明找到了
                return mid;
            }
        }
        // 循环结束, 说明没找到
        return -1;
    }

11 Arrays.sort(). 默认是 升序排序的. 是Java内置的 高效的数组排序算法,

public static void main(String[] args) { 
 int[] arr = {9, 5, 2, 7}; 
 Arrays.sort(arr); 
 System.out.println(Arrays.toString(arr)); 
}

12 数组逆序.
设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素. 然后让前一个下标自增,后一个下标自减,循环执行.

public static void reverse(int[] arr) { 
 int left = 0; 
 int right = arr.length - 1; 
 while (left < right) { 
 int tmp = arr[left]; 
 arr[left] = arr[right]; 
 arr[right] = tmp; 
 left++; 
 right--; 
 } 
}

13 练习: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.

public class Solution {
    public void reOrderArray(int [] array) {
        int k=0;
        for(int i=0;i<array.length;i++){
            if(array[i]%2==1){
                int tmp=array[i];
                int j=i;
                while (j>k){     // 注意循环条件
                    array[j]=array[j-1];  //将该奇数之前的内容(偶数序列), 整体后移一个位置
                    j--;
                }
                array[k++]=tmp;
            }
        }
    }
}

14 二维数组. 定义及相关长度.

	int[][] arr = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
	int[][] arr = new int[3][5];
    int[][] arr1 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    System.out.println(arr.length); // 3
    System.out.println(arr[0].length); // 4
    System.out.println(arr[2][3]); // 12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值