Java 数组相关

主要点说明:

  • 数组元素替换,数组元素插入值
  • 杨辉三角,二维数组动态声明锯齿状
  • 交换变量值的三种方法
  • 给Main函数传值

数组

1.定义:

数组是引用数据类型,用来保存多个数据

1.1数据结构:

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

1.2数组特性:

连续存储,下标从0开始,数组一旦创建,长度无法修改;

查询、修改效率极高,添加删除效率较低(并且数组没有提供添加和删除功能)

如果想实现添/删除功能,只能复制源数组到新数组中,在复制的过程中进行增加/删除操作

1.3数组声明:
1.3.1静态声明:

一维数组的静态声明:

数据类型[] 数组名 = {值,值,值,值......}

int[] arr ={1,2,3,4,5};

二维数组的静态声明:

数据类型[][] 数组名 ={{值,值,值..},{值,值,值..},{值,值,值..}...}

int[][] arr = {{1,2,3},{11,12,13},{111,112,113}};

1.3.2动态声明:

一维数组的动态声明:

int[] arr = new int[length];

//length是这个数组的长度,必须规定一下

二维数组的动态声明:

int[][] arr = new int[length1][length2];

//length1是一维数组的个数,length2是每个一维数组中的个数

1.4数组在内存中的形式
1.4.1一维数组:

1.4.2二维数组:

1.5数组的使用
1.5.1一维数组使用

获取数据        

// 查询  数组[下标]  下标从0开始

        System.out.println(arr1[0]);

        System.out.println(arr1[3]);

        // 最后一个数据

        System.out.println(arr1[arr1.length-1]);

        // 长度

        System.out.println(arr1.length);

 更改数据

         // 修改 数组[下标] = 值

        arr1[2] = 25;

 遍历        

// 遍历

        for (int i = 0; i < arr1.length; i++) {

            System.out.println(arr1[i]);

        }
1.5.2二维数组使用

获取数据       

 // 查询  数组[下标]

        int i = arr1[2];

        int[] arr3_0 = arr3[0];

        int arr3_0_1 = arr3_0[1];

        // 第0个一维数组中的第1个数据(下标)

        // 二维数组[下标][下标]

        arr3_0_1 =  arr3[0][1];

        // 第一个一维数组中的第一个元素

        System.out.println(arr3[0][0]);

        // 最后一个一维数组中的最后一个元素

        System.out.println(arr3[2][3]);

        int[] arr3_2 = arr3[arr3.length-1];

        int arr3_2_3 = arr3_2[arr3_2.length-1];

        System.out.println(arr3_2_3);

        System.out.println(arr3[arr3.length-1][arr3[arr3.length-1].length-1]);

 更改数据

arr4[2][3] = 29;

 遍历        

// 遍历

        for (int j = 0; j < arr4.length; j++) {

            // int[] arri = arr4[j];

            for (int k = 0; k < arr4[j].length; k++) {

                System.out.print(arr4[j][k] + "  ");

            }

            System.out.println();

        }
1.6数组传递

    

public static void main(String[] args) {

        int i = 1;

        m1(i);

        m1(1);

        int[] arr = { 1, 3, 4 };

        m1(arr);

        // 字面量写法

        m1(new int[] { 1, 3, 4 });

    }

    public static void m1(int a) {

    }

    public static void m1(int[] arr) {

    }
1.7给Main方法传参

1.8传值和传址

传值是说基本数据类型,比如:

    public static void main(String[] args) {
    int i = 10;
    m1(i);
    System.out.println(i);
    }

    public static void m1(int i) {
    i++;
    System.out.println(i);
    }
}
  

这个打印结果应该是11,10

11是m1方法的打印结果;10是main方法打印结果(这些变量值是存在每个方法的栈帧里的,互不影响)

传值是引用类型传递,因为是传递的地址,所以两个变量会指向同一个堆内存对象数据

    public static void main(String[] args) {
    int[] arr = {1,2};
    m2(arr);
    System.out.println(arr[0]);
    }
    public static void m2(int[] arr){
    arr[0] = 11;
    System.out.println(arr[0]);
    }

这个打印结果是11,11

本质区别就是数据储存的地方不同,数组储存在堆内存中,栈帧的方法名只是储存了数组的地址而已,所以某一个地方把对象中数据进行修改,则所有进行访问该对象的数据时,都是修改之后的

 1.9数组替换复制
public static void main(String[] args) {

        int[] src = { 1, 2, 3, 4, 5, 6, 7, 8 };

        int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };

        // 源数组,源数组起始位置(包含),目标数组,目标数组起始位置(包含),复制个数

        // System.arraycopy(src, 1, dest, 1, 3);

        arraycopy(src, 1, dest, 1, 3);

        for (int i = 0; i < dest.length; i++) {

            System.out.println(dest[i]);

        }

    }



    public static void arraycopy(int[] src, int srcIndex, int[] dest,

            int destIndex, int length) {

        for (int i = 0; i < length; i++) {

            dest[destIndex] = src[srcIndex];

            destIndex++;

            srcIndex++;

        }

    }
 2.0数组插入复制

    

public static void main(String[] args) {

        int[] src = { 1, 2, 3, 4, 5, 6, 7, 8 };

        int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };

        dest = arraycopy(src, 1, dest, 2, 3);

        for (int i = 0; i < dest.length; i++) {

            // 11, 12,2, 3, 4, 13, 14, 15, 16, 17, 18

            System.out.println(dest[i]);

        }

    }



    /**

     * 数组插入式复制

     * 

     * @param src

     *            源数组

     * @param srcIndex

     *            源数组 起始索引(包含)

     * @param dest

     *            目标数组

     * @param destIndex

     *            目标数组 起始索引(插入到该索引之后)

     * @param length

     *            插入个数

     * @return 返回新的数组,因为数组长度一旦确定,长度不可更改,既然是插入数据,肯定会扩大长度,所以只能新建数组,用于容纳更多的元素

     *         并把新数组地址返回给调用处

     */

    public static int[] arraycopy(int[] src, int srcIndex, int[] dest,

            int destIndex, int length) {

        // 1 确定新数组长度,并创建新数组

        // 新长度为 dest.length + length

        int[] newDest = new int[dest.length + length];

        // 2 把目标数组起始位置之前的数据,全部拿到新数组中(包含)

        for (int i = 0; i <= destIndex; i++) {

            newDest[i] = dest[i];

        }

        // 3 把源数组起始位置(包含)开始,复制到新数组中,复制 length个

        // 因为后面还要用到目标数组起始位置,所以destIndex的值暂时不能修改

        // 所以把destIndex的值赋值给index,可以对index进行修改

        // index 表示 新数组中,最后一个添加元素的下标

        int index = destIndex;

        for (int i = srcIndex; i < srcIndex + length; i++) {

            // 新数组起始位置为 : 目标数组起始索引 + 1

            index++;

            newDest[index] = src[i];

        }

        // 4 把目标数组起始位置之后的数据,添加到新数组中

        for (int i = destIndex + 1; i < dest.length; i++) {

            index++;

            newDest[index] = dest[i];

        }

        return newDest;

    }
2.1动态声明锯齿状(杨辉三角)
int[][] arr = new int[15][];

        // 初始化数组

        for (int i = 0; i < arr.length; i++) {

            // 第一个一维数组长度为1

            // 第二个一维数组长度为2

            arr[i] = new int[i + 1];

        }

        // 数组赋值

        for (int i = 0; i < arr.length; i++) {

            for (int j = 0; j < arr[i].length; j++) {

                // 首尾都是1

                if (j == 0 || j == arr[i].length - 1) {

                    arr[i][j] = 1;

                } else {

                    // i行j列 = i-1行j-1列 + i-1行j列

                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];

                }

            }

        }



        // 遍历

        for (int i = 0; i < arr.length; i++) {

            for (int j = 0; j < arr[i].length; j++) {

                System.out.print(arr[i][j] + "  ");

            }

            System.out.println();

        }
2.2交换变量的值
int a = 10;
    int b = 5;
    // 1 开发常用,中间变量,简单易懂
    int c = b;
    b = a;
    a = c;
    // 2 相加
    a = 10;
    b = 5;
    a = a + b;
    b = a - b;
    a = a - b;

    // 2 异或运算,面试常用
    a = 10;
    b = 5;
    // a= 0000 1010
    // b= 0000 0101
    // a= 0000 1111
    a = a ^ b;
    // b= 0000 1010
    b = a ^ b;
    // a= 0000 0101
    a = a ^ b;
    System.out.println(a + " : " + b);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值