美文网首页
2.8 数组

2.8 数组

作者: 姗婷 | 来源:发表于2020-02-29 23:07 被阅读0次

    2.8.1数组的定义

    概念:同一种类型数据的集合。其实数组就是一个容器。
    数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
    格式1:
    元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
    示例:int[] arr = new int[5];5代表5个元素,arr[0],指的是数组第一个角标
    格式2:
    元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
    int[] arr = new int[]{3,5,1,7};
    int[] arr = {3,5,1,7};

    2.8.2数组的内存分配及特点

    image.png
    Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
    栈内存: 用于存储局部变量,当数据使用完,所占空间会自动释放。
    堆内存:
    1. 数组和对象,通过new建立的实例都存放在堆内存中。
    2. 每一个实体都有内存地址值
    3. 实体中的变量都有默认初始化值
      4.实体不在被使用,会在不确定的时间内被垃圾回收器回收
      方法区,本地方法区,寄存器

    2.8.3数组操作常见问题

    int[] arr1 = new int[3];
    System.out.println(arr1[0]);//输出为0,如果是boolean默认初始化为false
    
    int[] arr1 = new int[3];
    System.out.println(arr1[4]);//提示:ArrayIndexOutOfBoundsException: 4(数组角标越界)
    
    int[] arr1 = new int[3];
    arr1 = null;//数组无只想的
    System.out.println(arr1[1]);//提示:NullPointerException空指针异常,当引用没有任何只想值为null的情况,该引用还在用于操作实体。
    

    2.8.4数组常见操作

    操作数组获取数组中的元素,通常会用到遍历(for 循环)。
    数组中有一个属性可以直接获取元素个数length//使用方式:数组名称.length

    int[] arr1 = new int[]{1,5,2,7};
        System.out.println("length="+arr1.length);//获取数组元素个数
        for(int x = 0;x<arr1.length;x++)
        {
            System.out.println("arr["+x+"]="+arr1[x]+";");//输出数组各元素
        }
    

    //定义一个功能,用于打印数组中的元素,元素间用逗号隔开

    public static void ArrayPrint(int[] arr)
            {
                System.out.print("[");
                    for(int x = 0;x<arr.length;x++)
                    {
                        if(x<arr.length-1)
                        {
                            System.out.print(arr[x]+",");
                        }else
                        {
                            System.out.println(arr[x]+"]");
                        }
                
                    }
            }
    

    获取数组中的最大值

        public static int getMax(int[] arr)
        {
        int max = 0;//初始化数组中任意一个角标
    
        for(int x = 1;x<arr.length;x++)
            {
            if(arr[x]>arr[max])
                max = x;
            }
        return arr[max];
        }
    
        public static int getMax_2(int[] arr)
        {
            int max = arr[0];
        for(int x = 1;x<arr.length; x++)
        {
            if(arr[x]>max)
            max=arr[x];
        }
        return max;
        }
    

    数组选中排序

    public static void ArraySort(int[] arr)
        {
            for(int x = 0;x<arr.length-1;x++)
            {
                for(int y = x+1;y<arr.length;y++)
                {
                    if(arr[x]>arr[y])
                    {
                    int temp = arr[x];
                    arr[x] = arr[y];
                    arr[y] = temp;
                    }
                }
            }
        }
    

    //冒泡排序:就是相邻两个数之间的比较

        public static void ArraySort(int[] arr)
        {
            for(int x = 0;x<arr.length-1;x++)
            {
                for(int y = 0;y<arr.length-x-1;y++)//-x:是让每一次比较的元素减少,-1是避免角标越界
                {
                    if(arr[y]>arr[y+1])
                    {
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                    }
                }
            }
        }
    

    数组的查找操作

        public static void getIndex(int[] arr,int key)
        {
            for(int x = 0;x<arr.length;x++)
            {
                if(arr[x]==key)
                    return x;
            }
            return -1;
        }
        //定功能,获取key第一次出现在数组种的位置,如果返回-1,那么代表key在数组种不存在
    

    折半查找可以提高,但是必须要保证该数组是有序的数组。
    方法1:arr[mid] !=key

    public static int halfSearch(int[] arr,int key)
        {
            int min,max,mid;
            min = 0;
            max = arr.length-1;
            mid  = (min+max)/2;
            while(arr[mid] !=key)
            {
                if(key>arr[mid])
                    min = mid+1;
                else if (key<arr[mid])
                    max = mid-1;
                if(min>max)
                    return -1;
                mid  = (min+max)/2;
            }
            return mid;
        }
    

    方法2:min<=max

    public static int halfSearch_2(int[] arr,int key)
        {
            int min=0,max = arr.length-1,mid;
            while(min<=max)
            {
                mid = (max+min)/2;
                if(key>arr[mid])
                    min = mid+1;
                else if(key<arr[mid])
                    max = mid-1;
                else
                    return mid;
            }
            return -1;
        }
    

    练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证数组是有序的。
    通过折半形式查找在这个数组中的位置,如果存在就把这个数插入,如果不存在就返回数组最小角标的值

    public static int halfSearch_2(int[] arr,int key)
        {
            int min=0,max = arr.length-1,mid;
            while(min<=max)
            {
                mid = (max+min)/2;
                if(key>arr[mid])
                    min = mid+1;
                else if(key<arr[mid])
                    max = mid-1;
                else
                    return mid;
            }
            return min;
        }
    

    进制转换:十进制转换成二进制

    public static void toBin(int num)//直接输出所以返回值是void
        {
            StringBuffer sb = new StringBuffer();
            while(num>0)
            {
                sb.append(num%2);
                num = num/2;
            }
            System.out.println(sb.reverse());
        }
    

    十进制转成成十六进制

    public static void toHex(int num)
        {
            StringBuffer sb = new StringBuffer();
            for(int x = 0;x <8;x++)
            {
                int temp = num & 15;            
                if(temp>9)
                {
                    sb.append((char)(temp-10+'A'));
                }else{
                    sb.append(temp);
                }
                num = num >>>4;
            }
            System.out.println(sb.reverse());
        }   
    

    十进制转16进制优化

    public static void toHex(int num)
        {
            //查表发:将所有的元素临时存储起来,建立对应关系
            char[] chs={'0','1','2','3',
                        '4','5','6','7',
                        '8','9','A','B',
                        'C','D','E','F'};
            //定义一个临时容器
            char[] arr = new char[8];//十六进制最多8个字符
            int pos = arr.length;//定义一个操作数组的指针
            while (num!=0)
            {
                int temp = num&15;
                arr[--pos]=chs[temp];
                num = num>>>4;
            }
    {
    

    进制转换优化

    public static void toBin(int num)
        {
            trans(num,1,1);
        }
    
        
        /*
        十进制转八进制
        */
    
        public static void toBa(int num)
        {
            trans(num,7,3);
        }
    
        /*
        十进制转十六进制
        */
    
        public static void toHex(int num)
        {
            trans(num,15,4);
        }
    
        public static void trans(int num,int base,int offset)
        {
            if(num==0)
            {
                System.out.println(0);
                return;
            }
            
            char[] chs={'0','1','2','3',
                        '4','5','6','7',
                        '8','9','A','B',
                        'C','D','E','F'};
    
            //定义一个临时容器
            char[] arr = new char[32];
            //定义一个指针
            int pos = arr.length;
            while (num!=0)
            {
                int temp = num & base;
                arr[--pos]=chs[temp];
                num = num>>>offset;
            }
    
            for(int x =pos;x<arr.length;x++)
            {
                System.out.print(arr[x]+",");
            }
    
        }
    

    2.8.5数组中的数组

    二维数组[][] 格式1:int[][] arr = new int[3][2];
    1.定义了名称为arr的二维数组
    2.二维数组中有3个一维数组
    3.每一个一维数组中有2个元素
    4.一维数组的名称分别为arr[0], arr[1], arr[2]
    5.给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
    格式2:int[][] arr = new int[3][];
    1.二维数组中有3个一维数组
    2.每个一维数组都是默认初始化值null
    3.可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
    格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
    1.定义一个名称为arr的二维数组
    2.二维数组中的有三个一维数组
    3.每一个一维数组中具体元素也都已初始化
    a,第一个一维数组arr[0] = {3,8,2};
    b,第二个一维数组arr[1] = {2,7};
    c,第三个一维数组arr[2] = {9,0,1,6};
    4.第三个一维数组的长度表示方式:arr[2].length; 。 注意特殊写法情况:int[] x,y[]; x是一维数组(int[] x)y是二维数组[int[]y[]]
    练习:获取arr数组中所有元素的和。使用for的嵌套循环即可

             int[][] arr = {{2,41,15,6},{1,81,7,16},{13,9,5,12}};
            int sum = 0;
            for(int x=0;x<arr.length;x++)
            {
                for(int y=0;y<arr[x].length;y++)
                {
                    sum = sum + arr[x][y];
                }
            }
            System.out.println("sum="+sum);
    

    相关文章

      网友评论

          本文标题:2.8 数组

          本文链接:https://www.haomeiwen.com/subject/zwdrqhtx.html