2.8 数组

2020-02-29  本文已影响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);
上一篇下一篇

猜你喜欢

热点阅读