zoukankan      html  css  js  c++  java
  • Java数组

    前言

    如果我要给妹子送10部手机,但是我的双手只能拿2部;

    此时我就需要1个袋子,这个袋子可以装下10部手机,我把10部手机装进这1个袋子中;

    然后拎起袋子,把这个装有10部手机的袋子,送给妹子;

    Java中的数组相当于上文提到的袋子,数组是用于存储相同数据类型的集合

    一、创建数组

    在Java中,创建数组有以下3种方式:

    方式1:              由于JVM会自动给声明了长度的数组内填充默认值,我们称方式1为动态赋值;

    方式2、方式3:我们不仅确定了数组的长度,还确定了数组中所有元素,固称为静态赋值

    package ArryOpration;
    
    public class TestArray {
        public static void main(String[] args) {
            //方式1:只是声明了变量+开辟了存储5个格子大小的内存空间,没有在格子中写入数据
            int[] bag = new int[5];
            for (int i : bag) {
                System.out.println(i);
            }
            //方式2:声明变量+开辟内存空间+写上数据
            int[] bag1 = {1, 2, 3, 4, 5};
            for (int i : bag1) {
                System.out.println(i);
            }
    
            //方式3:声明变量+开辟内存空间+写入数据
            int[] bag2 = new int[]{6, 7, 8, 9, 10};
            for (int i : bag2) {
                System.out.println(i);
            }
    
    
        }
    
    }

     二、使用数组

    Java数组在内存中是连续的,所以我们根据索引来查询数组中的元素很快;

    然而一旦数组结构需要更改,例如增加、删除元素操作,就需要大量移动元素或者重新创建数组,所以数组查询快、操作比较耗时;

    所以一般使用数组储结构基本不会修改的数据

    package ArryOpration;
    
    public class TestArray {
        public static void main(String[] args) {
            int[] bag2 = new int[]{6, 17, 82, 9, 10};
            //索引取值
            System.out.println(bag2[2]);
            //数组遍历
            for (int i = 0; i < bag2.length; i++) {
                System.out.println(bag2[i]);
            }
            for (int i : bag2) {
                System.out.println(i);
            }
            //寻找数组最大的数字
            int max_number = 0;
            for (int i : bag2) {
                if (i >= max_number) {
                    max_number = i;
                }
            }
            System.out.println(max_number);
    
            //数组求和
            int sum_number = 0;
            for (int i : bag2) {
                sum_number += i;
            }
            System.out.println(sum_number);
        }
    
    }

    1.append元素

    在Python中list类型自带了append、insert、extend方法,方便我们在list中添加元素;

    Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a=[1,2,3]
    >>> id(a)
    2680172336136
    >>> b=[4,5,6]
    >>> id(b)
    2680173603592
    >>> a.extend(b)
    >>> id(a)
    2680172336136
    >>> a.append(2)
    >>> id(a)
    2680172336136
    >>> a.insert(1,3)
    >>> a
    [1, 3, 2, 3, 4, 5, 6, 2]
    >>> id(a)
    2680172336136
    >>>

     在Java中数组长度是固定的,我们需要自己去实现;

    package ArryOpration;
    
    import java.util.Arrays;
    
    public class TestArray {
        public static void main(String[] args) {
            String[] l1 = {"我", "是"};
            String[] l2 = {"张", "根"};
            String[] l3 = new String[l1.length + l2.length];
            for (int i = 0; i < l1.length; i++) {
                l3[i] = l1[i];
            }
            for (int i = 0; i < l2.length; i++) {
                l3[l1.length + i] = l2[i];
            }
            //把l3的内存地址赋值给l1
            l1=l3;
            System.out.println(Arrays.toString(l1));
        }
    
    }

    2.remove元素

    re-重新-move移动,重新移动了=删除;

    方案1:

    package ArryOpration;
    
    import java.util.Arrays;
    
    //删除数组中的某个元素
    public class TestArray01 {
        public static void main(String[] args) {
            int[] array1 = {3, 4, 5, 6, 2, 7, 8, 9};
            //删除索引为2的元素
            int del_index = 2;
            //step1:从删除的位置开始,向前移动元素
            for (int i = del_index; i < array1.length - 1; i++) {
                array1[i] = array1[i + 1];
            }
            //step2:将最后1个闲置位的元素,置为0;
            array1[array1.length - 1] = 0;
            System.out.println(Arrays.toString(array1));
    
        }
    
    }

    方案2:

    package ArryOpration;
    
    import java.util.Arrays;
    
    public class TestArray02 {
        public static void main(String[] args) {
            int[] array1 = {1, 9, 9, 8, 0, 5, 8, 9};
            //删除索引为5的元素
            int del_index = 5;
            //step1:创建1个新的数组
            int[] new_array = new int[array1.length - 1];
            //step2:移动目标索引之前的元素;
            for (int i = 0; i < del_index; i++) {
                new_array[i] = array1[i];
            }
            System.out.println(Arrays.toString(new_array));
            //step3:移动目标索引之后的元素;
            for (int i = del_index + 1; i < array1.length; i++) {
                new_array[i - 1] = array1[i];
            }
            //step4:使array1栈内存存储的引用地址和new_array相同;
            array1 = new_array;
            System.out.println(Arrays.toString(array1));
        }
    }

    3.练习

    3.1 分类数组中的奇数和偶数

    package ArryOpration;
    /*
     *@Description: 数组中的奇数和偶数分别存放到2个不同的数组里面;
     *@Author:  Gen.Zhang
     *@CreateDate: 2013.06.25
     */
    
    import java.util.Arrays;
    
    public class Practice {
        public static void main(String[] args) {
            int[] array1 = {12, 4, 5, 6, 85, 54, 74, 95, 65, 82, 26, 34};
            //Step1:统计一下奇数或者偶数的个数,以便确定动态创建存储奇数和偶数的数组长度;
            int odd_counter = 0;
            for (int n : array1) {
                if (n % 2 == 0) {
                    odd_counter += 1;
                }
            }
            //Step2:创建存储奇数和偶数的数组
            int[] odd_array = new int[odd_counter];
            int[] even_array = new int[array1.length - odd_counter];
            //Step3:记录奇数数组和偶数数组中当前的索引位置;
            int odd_current_position = 0;
            int even_current_position = 0;
            //Step4:遍历数组array1并判断奇偶;
            for (int n : array1) {
                if (n % 2 == 0) {
                    odd_array[odd_current_position] = n;
                    odd_current_position++;
                } else {
                    even_array[even_current_position] = n;
                    even_current_position++;
                }
            }
            System.out.println(Arrays.toString(odd_array));
            System.out.println(Arrays.toString(even_array));
        }
    }

    二、Arrays数组工具类

    JRE提供了1个叫Arrays的工具类,封装了排序、查找极值、遍历输出等功能,可以帮助我们对数组进行操作;

    package ArryOpration;
    
    import java.util.Arrays;
    
    public class TestArray {
        public static void main(String[] args) {
            int[] bag2 = new int[]{6, 17, 82, 9, 10};
            //显示数组
            int[][] bag1 = new int[][]{{1, 2}, {3, 4}};
            for (int[] a : bag1) {
                System.out.println(Arrays.toString(a));
            }
            System.out.println(Arrays.toString(bag1));
            System.out.println(Arrays.toString(bag2));
            //通过二分法,对数组进行排序然后再获取元素的索引
            Arrays.sort(bag2);
            System.out.println(Arrays.toString(bag2));
            System.out.println(Arrays.binarySearch(bag2, 9));
            //切片数组中的元素
            int[] new_array = Arrays.copyOf(bag2, 4);
            System.out.println(Arrays.toString(new_array));
            //区间切片
            int[] new_array1 = Arrays.copyOfRange(bag2, 1, 4);
            System.out.println(Arrays.toString(new_array1));
            //判断2个数组中的值是否相等?
            int[] array1 = {1993, 0};
            int[] array2 = new int[]{1993, 0};
            System.out.println(Arrays.equals(array1, array2));
            //从数组1中复制元素到数组2
            int[] src_array = new int[]{1, 2, 3, 4};
            int[] des_array = new int[10];
            //将源数组下标位1开始,复制到目标数组的下标3,一共复制3个元素
            System.arraycopy(src_array, 1, des_array, 3, 3);
            System.out.println(Arrays.toString(des_array));
    
        }
    
    }

    三、二维数组

    在机器学习中数据集最终会变成1个数字类型二维数组;

    但是我在Python里定义二维数组时,思维是由外至内的;[ [1,2,3],[2,4,5,9] ];

    在Java中定义二维数组时思维是由内向外:1个int圈起来=int[]=数组,再把数组圈起来=int[][]=1个二维数组;

    package ArryOpration;
    
    import java.util.Arrays;
    
    public class TestArray {
        public static void main(String[] args) {
            String[][][][] a1 = {{{{}}}};
            System.out.println(Arrays.toString(a1));
    
        }
    
    }

    参考

  • 相关阅读:
    String和StringBuffer、StringBuilder的区别
    猜字谜小游戏编程
    const 和非 const 函数重载
    沉溺于 Mac,沉溺于 XCode
    开源软件与自由软件的区别——个人体会
    C++/C宏定义中## 连接符与# 符的含义
    const 关键字用法代码观
    博客搬家
    注销、关闭和重启计算机
    c/c++笔试题——const类型的成员函数内部如何改变成员变量
  • 原文地址:https://www.cnblogs.com/sss4/p/15441420.html
Copyright © 2011-2022 走看看