zoukankan      html  css  js  c++  java
  • java 数组详解

    数组

    概念:数组是一个定长的容器,数组中存储的数据类型需要是一致的

    数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

    数组的四种定义方式:

    数据类型是数组中元素的数据类型

    数组是有默认值的{0,0,0,0,0,0,0,0,0,0,}

    int数据类型是数组中元素的数据类型

    数组的数据类型是 int[]

    元素 --> 数组中储存的值

    数组的长度 --> 数组中的元素个数

    //数据类型[] 数组名 = new 数据类型[数组中元素的个数]
     
    int[] array = new int[10];

    2.先声明数组,然后再进行赋值

    //在类中,定义成员变量,方法传递
    int[] array2;
    array2 = new int[10];

    3.创建数组的同时,给定当前数组中储存元素的值

    //数组的长度:后面{}中储存多少个值,数组就有多长
     
    int[] array3 = new int[]{1,2,3,4}

    4.第3的简化版本

    int[] array4 = {1,2,3,4}

    数组的概念

        同一种类型数据的集合。其实数组就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么.不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素, 数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。

    数组的内存分析

     

     数组声明后实际上是在栈内存中保存了此数组的名称,接下来便是要在堆内存中配置数组所需的内存,其中“元素的个数”(数组的长度)是告诉编译器,所声明的数组要存放多少个元素,而“new”则是命令编译器根据括号里的长度开辟空间。

    二维数组:

    Arrays的使用

    遍历: toString()    将数组的元素以字符串的形式返回

    排序: sort()        将数组按照升序排列

            int[] arr = {23,64,2,37,43,67,1};
            Arrays.sort(arr); //升序
            for(int i=0;i<arr.length;i++) {
                System.out.println(arr[i]);
            }

    查找: binarySearch()在指定数组中查找指定元素,返回元素的索引,如果没有找到返回(-插入点-1) 注意:使用查找的功能的时候,数组一定要先排序。

     

    二维数组:实质就是存储是一维数组。

    数组定义:

           数组类型[][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素的个数];



    数组排序:

    数组排序有很多中:冒泡 ,选择,插入,快速,堆等等

    * 速度最快的就是 堆 排序

    冒泡排序 ( 两两相比 )
    是相邻的两个数组元素进行比较

    若当前元素大于后面的元素,交换两个元素的位置

    若当前元素不大于后面的元素,就不交换

    比较所有相邻的元素,最终的到一个有序的结果

    冒泡最大的特点就是会先找出最大的值,然后放到数组的最后一位

    升序(从小到大),降序(从大小) --> 默认排序都是升序

    只要经过一轮排序,肯定会有一个数放到正确的位置上

     

    3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列

    3,4,6,7,1,9 -- > 9

    3,4,6,1,7,9 --> 7,9

    3,4,1,6,7,9 --> 6,7,9

    3,1,4,6,7,9 --> 4,6,7,9

    1,3,4,6,7,9 --> 1,3,4,6,7,9

           for(int i = 0 ; i < array.length - 1 ; i++){
              for(int j = 0 ; j < array.length -1 -i ; j++){
               if(array[j] > array[j + 1]){
                  int tmp = array[j];
                  array[j] = array[j+1];
                  array[j + 1] = tmp;
               }
             }

    选择排序 ( 固定一位一次向后比 )

    升序(从小到大),降序(从大小) --> 默认排序都是升序

    固定一个元素,依次和后面的元素进行比较

    若当前元素大于后面的元素,交换

    若当前元素不大于后面的元素,不交换

    每次比较完成们都会有一个数放到正确的位置上,小的那个数

     

    3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列

    1,7,4,6,9,3 --> 1

    1,3,7,6,9,4 --> 1,3

    1,3,4,7,9,6 --> 1,3,4

    1,3,4,6,9,7 --> 1,3,4,6

    1,3,4,6,7,9 --> 1,3,4,6,7,9

    for(int i = 0 ; i < array.length ; i++){
              for(int j = i+1 ; j < array.length ;j++){
                      if(array[i] > array[j]){
                            int tmp = array[i];
                           array[i] =  array[j];
                           array[j] = tmp; 
              }
          }
    }

    数组的复制
     

               int[] a = {10,20,30,40,50};
               //数组的扩容(创建了新的数组并将源数组的数据复制过去了)
               a = Arrays.copyOf(a,a.length+1); //
               for(int i=0;i<a.length;i++) {
                   System.out.println(a[i]); //10 20 30 40 50 0
               }

               int[] a = {10,20,30,40,50};
               //a:源数组
               //a1:目标数组
               //6:目标数组的长度(多则补默认值,少则截取)
               int[] a1 = Arrays.copyOf(a,6); //灵活性差
               for(int i=0;i<a1.length;i++) {
                   System.out.println(a1[i]); //10 20 30 40 50 0
               }
               int[] a = {10,20,30,40,50};
               int[] a1 = new int[6]; //0,0,0,0,0,0
               //a:源数组
               //1:源数组的起始下标
               //a1:目标数组
               //0:目标数组的起始下标
               //4:要复制的元素个数
               System.arraycopy(a,1,a1,0,4); //灵活性好
               for(int i=0;i<a1.length;i++) {
                   System.out.println(a1[i]); //20 30 40 50 0 0 
               }

    操作数组的工具类:Arrays

    java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法,它提供的所有这些方法都是静态的。

    Arrays拥有一组static方法:

    public static int binarySearch(Object[] a, Object key)
    用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。

    public static boolean equals(long[] a, long[] a2)
    如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

    public static void fill(int[] a, int val)
    将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
    public static void sort(Object[] a)
    对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。












    public class Test {
        public static void main(String[] args) {
            int array[] = { 2, 5, 8, 3, 1, 4, 9, 6, 7 }; // 声明一个整型数组 
            System.out.println("Object的toString:"array.toString()); //Object的toString()方法
            Arrays.sort(array);  // 数组排序
            System.out.println("排序后的数组: " + Arrays.toString(array)) ; 
            int point = Arrays.binarySearch(array, 3) ; // 检索数据位置
            System.out.println("元素‘3’的位置在:" + point) ;
            Arrays.fill(array, 6) ; // 填充数组
            System.out.print("数组填充:" + Arrays.toString(array)) ;
        }
    }

    执行结果

    Object的toString:[I@7852e922
    排序后的数组: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    元素‘3’的位置在:2
    数组填充:[6, 6, 6, 6, 6, 6, 6, 6, 6]

    数组的基本操作

    线性查找(顺序查找)

    从数组中的第一个元素开始,依次向后查找,直到找当前要查找的值

    要么是找到了,要么就是没有找到

    //顺序查找
     for (int i = 0; i < array.length; i++) {
         if(n == array[i]){
            return i;    //需要范围找到的下标,系统API
         }
      }
         return -1;    //返回一个负数
         return i;    //需要范围找到的下标,系统API
       }
    }
    return -1;    //返回一个负数

    折半查找(二分查找) 先排序

    一定是一个有序的数组,通过待查找的数和数组中间索引值进行比较

    大于: 待查找值大于中间索引值,就需要向数组的右半边进行查找

    等于:待查找值等于中间索引值,就是找到了

    小于:待查找值下于中间索引值,就需要向数组的左半边进行查找

        //定义开始值
        int beginIndex = 0;
        //定义结束值
        int endIndex = array.length-1;
        //获取中间值
        int middleIndex = (beginIndex+endIndex)/2;
        //进行比较 用中间值来比较要查找的值
        //第一种比较的次数应该是数组的长度
        //第二中死循环
        while(true){
                //缩小范围
            if(n > array[middleIndex]){
                //修改开始值
                beginIndex = middleIndex+1;
            }else if(n < array[middleIndex]){
                //修改结束值
                endIndex = middleIndex -1;
            }else{
                return middleIndex;
            }
            //无论是开始值还是结束中发生了改变
            //就要重新结算中间值
            middleIndex = (beginIndex+endIndex)/2;
            //若出现了一种情况 开始 > 结束
            if(beginIndex > endIndex){
                return -1;
            }   
    
      }





  • 相关阅读:
    深入理解JavaScript系列(15):函数(Functions)
    深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP
    深入理解JavaScript系列(2):揭秘命名函数表达式
    深入理解JavaScript系列(3):全面解析Module模式
    深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
    理解Javascript_13_执行模型详解
    深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
    深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
    深入理解JavaScript系列(11):执行上下文(Execution Contexts)
  • 原文地址:https://www.cnblogs.com/jyy599/p/12037763.html
Copyright © 2011-2022 走看看