(十)Core Java 数组 (94)

 
目录 :     
1 ) . 数组(概述--内存结构)

2 ) . 数组(静态初始化-常见问题)

3 ) .   数组(常见操作-遍历)

4 ) .  数组(常见操作--获取最值)

5 ) .  数组(排序--选择排序)

6 ) .  数组(排序--冒泡排序)

7 ) .  数组(排序--位置置换功能抽取)

8 ) .  数组(折半查找)

9 ).    数组(十进制,二进制)

10 ).  数组(十进制,十六进制)

11 ).  数组(查表法十进制,十六进制)

12 ).  数组 ( 查表法十进制,二进制)

13 ). 数组(进制转化优化)

14 ) . 数组(二维数组)  

15 ). 数组(二维数组练习)


     一 .   数组(概述--内存结构)

1 ) . 简述要点 :

1.1 数组的定义

[1] 概念 :  同一种类型数据的集合,其实数组就是一个容器,用来存数据的一种方式

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

[3] 格式 : 

①  元素类型[]  数组名 = new 元素类型[元素个数或数组长度]  例 : int[]   arr=new int[5];

②  元素类型[] 数组名 =new 元素类型[]{元素,元素,......};  例 : int [] arr=new int[]{3,5,7};       int[] arr = {3,5,7};

1.2 数组的内存分配及特点

特点  : [1]  内存地址值, [2] 默认初始化值  -->依据类型而定,记住特殊的boolean是flase ,其它都是 0  / 0.0  , 0.0f  之类的即可    [3] 垃圾回收机制

1.3 数组操作常见问题

1.4 数组常见操作

1.5 数组中的数组

2 ) . 内存结构 -->Java程序运行时,需要在内存中分配空间,为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式

2.1 栈内存 --> 用于存储局部变量,当数据使用完,所占空间会自动释放

2.2 堆内存 

[1] 数组和对象,通过new 建立的实例都存放在堆内存中

[2]  每一个实体都有内存地址值

[3] 实体中的变量都有默认初始化值

[4] 实体不在被使用,会在不确定的时候内被垃圾回收器回收  -->java的特点

2.3 方法区 

2.4 本地方法区

2.5 寄存器

3 ) .  示例 :

 int[] arr  = new int[5];   -->           定义了一个名称为arr的数组,类型是int类型,并标识出了数组中的长度为7  -->定义了实体为arr,类型是int,标识数组长度为7

 int[]  arr  =new int[]{1,2,3};  ---> 定义了一个名称为arr的数组,类型是int类型,通过大括号的形式标识出了数组中元素的内容为,1,2,3 

4 ) . 数据不同定义格式的用法 : 

4.1 数据明确时 :  -->不标识长度

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

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

4.2 数据不明确时 :  -->标识长度

[1]  int[] arr  = new int[5];


小结 :  

           1.  栈和堆之间的桥梁是进制地址数据,用来标识关系
        
 

       二.  数组(静态初始化-常见问题)


1 ) . 静态初始化的方式 : 

1.1   int[]  arr  =new int[]{1,2,3};    ---> 定义了一个名称为arr的数组,类型是int类型,通过大括号的形式标识出了数组中元素的内容为,1,2,3 

1.2   int[]  arr  ={1,2,3};   --> 1.2 是 1.1  的简化形式

2 ) . 数组常见异常 : 

2.1 ArrayIndexOutOfBoundsException :  -->数组下标越界异常 : 操作数组时,访问到了数组中不存在的角标时出现

2.2 NullPointerException : --> 空指针异常 : 当引用没有任何指指向值或只为空时,该引用还在用于操作实体时出现

 

小结 :  

           1.  int[]  arr  =new int[2]; 与  int arr[] =new int[2] ; 两者没有什么区别
        
           2.  数组中坐标从0开始

 

      三.  数组(常见操作-遍历)

1 ) . 简述 : 遍历-->指对数组的操作 : 获取数组中的元素

属性 : length :  数组中用来获取数组元素个数  ;使用方式 : .length

2 ) . Demo示例  :    简单遍历

    int[] arr=new int[]{1,2,3,4,5};
    
    
     for(int i=0;i<arr.length;i++)
     {
    
     System.out.println("arr["+i+"]="+arr[i]);
    
     }
    



3 ) .  数组标准化输出格式 :   -->    //需求 : 定义一个用于打印数组中的元素,用逗号隔开

     //需求 : 定义一个用于打印数组中的元素,用逗号隔开
    
     public static void printArray(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.print(arr[x]+"]");
            
            
         }
        
        
     }
    

 
小结 :  

           1.  通过length动态获取数组长度,以此动态遍历
        
        
          
 

      四.  数组(常见操作--获取最值)

1 ) . 案例详解 : 功能方法  : 

     //需求 : 获取数组当中的最大值,最小值
    
     //思路 : 需要一个临时变量存储第三方变量,而后一对一做比较,并记录住最大值的那个
    
     //实践 :
    
     //1. 未知参数 : 一个数组 int[]
    
     //2. 返回类型 : 是一个int类型的返回类型
    
    
     //方式一 : 通过初始化数组中任意一个元素的方式
    
     public static int arrayMax(int[] arr){
        
         int max=5;
        
         for(int i=1;i<arr.length;i++)
         {
             if(arr[i]>max)
                 max=arr[i];
            
         }
        
         return max;
     }
    
    
      public static int arrayMin(int[] arr){
        
         int min=5;
        
         for(int i=1;i<arr.length;i++)
         {
             if(arr[i]<min)
                 min=arr[i];
            
         }
        
         return min;
     }
    
    
    
    
     //方式二 : 通过初始化数组角标
    
     public static int arrayMax_2(int[] arr){
        
         int max=0;
        
         for(int i=1;i<arr.length;i++)
         {
             if(arr[i]>arr[max])
                 arr[max]=arr[i];
            
         }
        
         return arr[max];
     }
    
      
      
      public static int arrayMin_2(int[] arr){
        
         int min=0;
        
         for(int i=1;i<arr.length;i++)
         {
             if(arr[i]<arr[min])
                 arr[min]=arr[i];
            
         }
        
         return arr[min];
     }
    

2 ) . main方法 : 

class ArrayDemo
{
    public static void main(String[] args)
    {

        int max =    arrayMax(arr);
        
        int max2 =    arrayMax_2(arr);
        
        System.out.println("max第一种获取最大值初始化方式结果:"+max);
        
        System.out.println("max第二种获取最大值初始化方式结果:"+max2);
    
    
        int min =    arrayMin(arr);
        
        int min2 =    arrayMin_2(arr);
        
        System.out.println("min第一种获取最大值初始化方式结果:"+min);
        
        System.out.println("min第二种获取最大值初始化方式结果:"+min2);


    }

}

 
 
小结 :  

           1.  用数组获取最大值最小值一般用在数值类型的属性时,若boolean类型,则默认是false
        
         
          

  五 .   数组(排序--选择排序)

1 ) . sortDemo  :

class ArraySort
{
    public static void main(String[] args)
    {
    
     //需求 : 选择排序
    
    
    
     int[] arr={1,4,2,7,4,6,23,45,322,45};
    
    
                //排序前
                printArray(arr);
                //排序
                getArraySort(arr);
               //排序后
                printArray(arr);
            
    
    
    }
    
     //定义一个排序的函数
    
     //1.明确返回值还是原数组,因此没有返回类型
    
     //2.需传入一个数组
    
    
     public static void getArraySort(int[] arr)
     {
         //这里长度减1是因为最后一个值无需比较
         for(int i=0;i<arr.length-1;i++)
         {
             //这里i+1是因为一前一1后进行比较
             for(int j=i+1;j<arr.length;j++)
             {
                 if(arr[i]>arr[j])
                 {
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                 }
             }
     }
            
    }
    
     public static void printArray(int[] arr){
        
         System.out.print("[");
         for(int i=0;i<arr.length;i++)
         {
            
             if(i!=arr.length-1)
                System.out.print(arr[i]+", ");
            else
                System.out.println(arr[i]+"]");
         }
        
        
    
     }
    
    
}


2 ) . 特点 :  内循环结束一次,最值出现在头角标的位置上

 
小结 :  

           1.  选定一个固定点,依次与其他定点逐个比较的方式是选择排序
        
           2.  堆内存中可以有多个引用,一个实体的存在

           3. 排序的核心是只要谨记上条件下初始值即可通过正倒三角实现完成

     

       六.  数组(排序--冒泡排序)


1 ) . 简述 :  相邻的两个元素进行比较,若如何条件则换位   

2 ) . 特点 : 内循环结束一次,最值出现在最后位标的位置上

3 ) .  boobbleSort : 

class bubbleSort
{
    public static void main(String[] args)
    {
    
     //需求 : 冒泡排序
    
    
    
     int[] arr={1,4,2,7,4,6,23,45,322,45};
    
    
                //排序前
                printArray(arr);
                //排序
                getBubbleSort(arr);
               //排序后
                printArray(arr);
            
    
    
    }
    
     //定义一个排序的函数
    
     //1.明确返回值还是原数组,因此没有返回类型
    
     //2.需传入一个数组
    
    
     public static void getBubbleSort(int[] arr)
     {
        
        
         for(int i=0;i<arr.length-1;i++)
         {
            
             for(int y=0; y<arr.length-i-1;y++) //-i 指让每一次比较的元素减少   -1 指避免角标越界
             {
                
                 if(arr[y]>arr[y+1])
                 {
                     int temp=arr[y];
                     arr[y]=arr[y+1];
                     arr[y+1]=temp;
                    
                 }
             }
         }
    
     }
    
    
      public static void printArray(int[] arr)
    {
        
         System.out.print("[");
         for(int i=0;i<arr.length;i++)
         {
            
             if(i!=arr.length-1)
                System.out.print(arr[i]+", ");
            else
                System.out.println(arr[i]+"]");
         }
            
    }
    
    
}  class bubbleSort
{
    public static void main(String[] args)
    {
    
     //需求 : 冒泡排序
    
    
    
     int[] arr={1,4,2,7,4,6,23,45,322,45};
    
    
                //排序前
                printArray(arr);
                //排序
                getBubbleSort(arr);
               //排序后
                printArray(arr);
            
    
    
    }
    
     //定义一个排序的函数
    
     //1.明确返回值还是原数组,因此没有返回类型
    
     //2.需传入一个数组
    
    
     public static void getBubbleSort(int[] arr)
     {
        
        
         for(int i=0;i<arr.length-1;i++)
         {
            
             for(int y=0; y<arr.length-i-1;y++) //-i 指让每一次比较的元素减少   -1 指避免角标越界
             {
                
                 if(arr[y]>arr[y+1])
                 {
                     int temp=arr[y];
                     arr[y]=arr[y+1];
                     arr[y+1]=temp;
                    
                 }
             }
         }
    
     }
    
    
      public static void printArray(int[] arr)
    {
        
         System.out.print("[");
         for(int i=0;i<arr.length;i++)
         {
            
             if(i!=arr.length-1)
                System.out.print(arr[i]+", ");
            else
                System.out.println(arr[i]+"]");
         }
            
    }
    
    
}


4 ) . 排序的基本原理就是相互比较,只是比较的方式不同罢了


小结 :  

           1.  排序方式最快的是希尔排序,三层循环加位移运算的排序
        
           2.  排序方式效率越高意味着在堆内存置换的次数就越少,大多数在堆内进行了临时存储

       


      七.  数组(排序--位置置换功能抽取)

1 ) . 前言 : 经选择排序和冒泡排序,发现其中的共性代码是位置置换,因此可以提取成一个单独的函数存在

2 ) . swap : 

class bubbleSort
{
    public static void main(String[] args)
    {
    
     //需求 : 冒泡排序
    
    
    
     int[] arr={1,4,2,7,4,6,23,45,322,45};
    
    
                //排序前
                printArray(arr);
                //排序
                getBubbleSort(arr);
               //排序后
                printArray(arr);
            
    
    
    }
    
    //用来置换
    public static void getSwap(int[] arr,int a,int b)
    {
        int temp=arr[a];
        
        arr[a]=arr[b];
        
        arr[b]=temp;
        
    }
    
    
    
    
    
     //定义一个排序的函数
    
     //1.明确返回值还是原数组,因此没有返回类型
    
     //2.需传入一个数组
    
    
     public static void getBubbleSort(int[] arr)
     {
        
        
         for(int i=0;i<arr.length-1;i++)
         {
            
             for(int y=0; y<arr.length-i-1;y++) //-i 指让每一次比较的元素减少   -1 指避免角标越界
             {
                
                 if(arr[y]>arr[y+1])
                 {
                     //置换代码
                     getSwap(arr,y,y+1);
                     /*
                     int temp=arr[y];
                     arr[y]=arr[y+1];
                     arr[y+1]=temp; */
                 }
             }
         }
    
     }
    
    
      public static void printArray(int[] arr)
    {
        
         System.out.print("[");
         for(int i=0;i<arr.length;i++)
         {
            
             if(i!=arr.length-1)
                System.out.print(arr[i]+", ");
            else
                System.out.println(arr[i]+"]");
         }
            
    }
    
    
}
  


3 ) .  要点 : 

3.1 Arrays.sort(arr);  --> 该句是java中定义好的一种排序方式,开发中, 对数组排序时使用

 
小结 :  

           1.  分清楚要传的参数列表是什么,也需明白想要的结果是什么
        
        
 

     八   数组(折半查找)

1 ) . 简述 : 折半查找是最快的以减半的方式缩小范围查找,前提是有序的

2 ) . HalfSearch示例  :

class ArrayFind
{
    public static void main(String[] args)
    {
    
     //需求 : 折半查找
    
    
    
    // int[] arr={1,4,2,7,4,6,23,45,322,45};
    
     int [] arr={1,2,3,4,5,6,7,8,9,20,23};
      
        int index= halfSearch(arr,6);
        int index2= halfSearch_2(arr,20);
        System.out.print("halfSearch折半第一次下标是 : "+index);
            System.out.print("halfSearch折半第二次下标是: "+index2);
    
    }
    
    
        
    
    
    //需求 : 进行折半查找的功能编写
    
    //1.返回值应该是int
    
    //2.参数列表是数组和数值
    
    //折半查找的第一方式
    public static int halfSearch(int[] arr,int num){
        
        int min=0;
        int max=arr.length-1;
        int mid=(min+max)/2;
        
        while(arr[mid]!=num){
            
            if(num>arr[mid])
            {
                min=mid+1;
            }else if(num<arr[mid])
            {
                max=max-1;
            }
            
            if(max>min)
                return -1;
            
            mid=(min+max)/2;
            
            
        }
        
        return mid;
        
        
    }
    
    //折半查找的第二方式
    public static int halfSearch_2(int arr[] ,int num)
    {
        int min=0,max=arr.length,mid;
        
        while(min<=max){
            
            mid=(min+max)>>1;
            
            if(num>arr[mid])
                min=mid+1;
            else if(num<arr[mid])
                max=mid-1;
            else
                return mid;
            
        }
        
        return -1;
    }
    
    
    
    
    //需求 : 需要一个传入数值便可或许下标的函数
    
    //1.返回值是int
    
    //2.参数列表是 数组和 数值
    
    //定义功能 : 获取key第一次出现在数组中的位置,如果返回是-1,那么代表该key在数组中不存在
    
/*     public static int getIndex(int[] arr,int num)
    {
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i]==num)
                return i;
            
        }
        
        return -1;
        
    }
     */
    
    
    
}
  


3 ) .  小心得 : 折半查找是通过折中的方式,不断除以二以寻找到中间值

4 ) . 思考题 :   如何往有序数组中插入一条数据,并保证在插入后,这个数组还有有序的?

解答 : 可以通过折半查找的方式,先判断该数据在数组中是否已存在,若存在,则获取其位置的角标值,在该值后插入即可;若不存在,则获取其最小min值,在该值处插入即可
  

 
小结 :  

           1.在数组中,  -1 可用来代表角标不存在或者数不存在     
        
  
  九 .      数组(十进制,二进制)

1 ) . 十进制转二进制对于计算机而言就是%2 与 /2的循环 ,详细见下边
 
2 ) . 练习 : 

2.1 基础练习题--> 十进制-->二进制的Demo

class ArrayText
{
    public static void main(String[] args)
    {
      
      
      tobin(10);
    
    }
    
    
    //需求 : 十进制-->二进制
    
    public static void tobin(int num)
    {
        
    StringBuffer sb = new StringBuffer(); // 可以用来装数据的容器
        
        while(num!=0){
            
            sb.append(num%2);
    
            
            num=num/2;
            
        }
            System.out.println(sb.reverse());
        
    }
}
  
 
小结 :  

           1.  先 %2 ,再 /2 ,然后循环即可
        
     
 

       十.  数组(十进制,十六进制)


1 ) . 十进制转十六进制思路 : 十进制 -->二进制-->十六进制

1.1 二进制转十六进制的思路 :   记得 四位 是一组

1.2 十进制转十六机制 先 &上15(十六进一)得出二进制第一组(四位一组)的十六进制数,而后再右移(无符号右移)>>>推上来的 第一组二进制数 再 进行&15 得出这一组的十六进制数

2 ) . 代码实现 : 

    //需求 : 十进制-->十六进制
    
    public static void toHex(int num)
    {
        
        StringBuffer sb = new StringBuffer();
        
        //循环8是因为int类型是32位,每四位转化一次

        for(int i=0;i<8;i++)
        {
            int temp=num&15;

            //判断是否大于九是因为十六进制10以后是字母表示
            if(temp>9)

                sb.append((char)(temp-10+'A'));//转化为字符
            else
                sb.append(temp);
            
            num=num>>>4;
            
        }

    System.out.println(sb.reverse());
        
        
    }
    
    
    
 

小结 :  

           1.  先 &  ,再 判断值 是否大于9 ,然后再无符号右移4位>>>  ,循环即可
        
      


      十一.  数组( 查表法 十进制,十六进制)  

1 ) . 十进制-->十六进制

    //需求 :  -->十进制-->十六进制完整可负数的版本
    public static void toHex(int num)
    {
        //建立临时容器
        char[] chs={'1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        
        //使用char数组存储
        char[] arr= new char[8];
        
        //使用指针的方式获取值
        int pos=arr.length;
    
        //循环8是因为int类型是32位,每四位转化一次
        while(num!=0)
        {
            int temp=num&15;
        
                //--pos意思是 倒着存入
                arr[--pos] = chs[temp];//转化为字符
            
            num=num >>> 4;
            
        }
    for(int x=pos;x<arr.length;x++)
    {
        System.out.print(arr[x]);
    }
    
        
        
    }



2 ) . 以上代码难点在于倒着存储值,带给我的思考是借力使力不费力

 

小结 :  

           1.  \u0000  -->这是一个空位
        
          
 

     十二 数组 ( 查表法 十进制,二进制)

1 ) .  十进制-->二进制

    
    //需求 : 十进制-->二进制 (查表法)
    
    
    
    public static void tobin(int num)
    {
        //定义一个二进制的表
        
        char[] ch ={'1','0'};
        
        //定义一个临时存储器
        
        char[] arr=new char[32];
        
        //定义一个操作数组的指针
        
        int pos=arr.length;
        
     //用来循环转化二进制数
     while(num!=0){
        
            //规律所得,你可以写下来尝试看看
            int temp=num & 1;
            arr[--pos]=ch[temp];
            
            num=num>>>1;
        
     }
    
    
     for(int x=pos;x<arr.length;x++)
     {
        
         System.out.print(arr[x]);
     }
        
        
    }
    
    
 

 
小结 :  

           1.  不明觉厉,用下标去查数,用>>>无符号右移,用临时存储器存储查出来的值,用指针使得在哪里开始插入
        
        
          
  十三 .   数组(进制转化优化)

1 ) . 进制之间的共性抽取,转化,优化的过程

class ArrayTance
{
    public static void main(String[] args)
    {
    
        toHex(60);
        
    
     }
    
    
     // 十进制-->十六进制
    
     public static void toHex(int num){
        
         trans(num,15,4);
     }
    
    
     //十进制-->八进制
    
      public static void toOct(int num){
        
         trans(num,7,3);
     }
    
    
     //十进制-->二进制
    
      public static void toBin(int num){
        
         trans(num,1,1);
     }
 
     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 ) . 对相关共性进行抽取时先采用参数列表的形式进行抽取,然后对具体函数值进行抽取,而后罗列成新的参数列表

3 ) .  前提是三者返回的参数类型是统一的

 
小结 :  

           1.  高内聚低耦合,A-->B-->C : 使用者-->第三方-->提供者
        
      
 

       十四.  数组(二维数组)  


1 ) . 简述  : int[] [] arr =new int[3][4];  --> 定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组中有四个元素

2 ) . 格式 : 

2.1  int[][]  arr =new int[3][2]; 

[1] 定义了名称为arr的二维数组

[2] 二维数组中有3个一维数组

[3] 每一个一维数组中有两个元素

[4] 一维数组的名称分别为arr[0],arr[1],arr[2]

[5] 给第一个一维数组1脚标位赋值为78写法是 :  arr[0][1] =78

2.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 ) .   数组的应用

3.1 数组的格式明显是大圈套小圈,毫不犹豫的进行for循环
 
int [] [] arr={{1,2,3},{1,5,3},{5,3,2}};
    
    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);
    
    




小结 :  

           1.  我们可通过打印空的arr ,而后会得到地址,从地址判断是否是二维数组
        
           2.  引入类型的初始化值都是null

           3. 在堆中只要开辟了空间,然后再进行赋值,那么对方调用方式就是指定引用地址,而非完全赋值元素内容

           4. 二维数组可以对关系进行有效的分类


      十五.  数组(二维数组练习)

1 ) . 一维数组格式  : 

[1] int [] x;

[2] int x [];

2 ) . 二维数组格式  :

[1] int[] []  y ;

[2] int y[] [];

[3] int[] y []; 

3 ) .  int[] x, y[] ;  //x一维 , y二维

 
小结 :  

           1.   一维可以赋给二维,但二维不可赋给一维,前提是分清一维和二维
        
       
  



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值