Java语言基础(三)-函数、数组

常用的转义字符

        \n 回车
        \t 制表符
        \b 退格
        \r 按下回车键
        windows系统中回车符其实是由两个符号组成的\r\n
        linux中回车符是\n

函数
    什么是函数
        函数就是定义在类中的具有特定功能的一段独立小程序
        函数也称为方法
    定义函数的格式
        修饰符 返回值类型 函数名(参数类型 形参2,参数类型 形参2,...)    //函数名有多个单词时,第一个单词小写,后面的单词首字母大写
        {
            执行语句;
            return 返回值;
        }
    特殊情况:
        功能没有具体的返回值。    这时,retrun的后面直接用分号结束,因为没有具体值,所以不可以写具体的数据类型,
        在java中只能用一个关键字void来表示这种情况。
        注意:如果返回值类型为void,那么函数中的return语句可以省略不写。
    特点:
        1.定义函数可以将功能代码进行封装
        2.便于对该功能进行服用
        3.函数只有被调用才会被执行
        4.函数的出现提高了代码的复用性
    注意:
        函数中只能调用函数,不能在函数内部定义函数。
        定义函数时,函数的结果应该返回给调用者,交由调用者处理。
 

class FunctionDemo3

 {

     public static void main(String[] args)

     {

         System.out.println(add(4,5));

         draw(7,9);

         System.out.println(equals(5,6));

         System.out.println(getMax(4,5));

     }



     /*

     需求1:定义一个功能,完成两个整数的和的获取

     思路:既然定义功能,就是可以用函数来体现

                 如何定义一个函数?

                 通过两个明确来完成

     明确1:这个功能的结果是什么? 是两个整数的和,是功能的结果,所以该功能的返回值类型是int

                 明确返回值的类型。

     明确2:这个功能实现过程中是否需要未知内容参与运算? 需要加数和被加数。

                 这就是函数的参数列表(参数的个数,参数的类型)

                 明确参数列表

     注意:返回值类型和参数类型没有直接关系

     */

     public static int add(int a,int b)

     {

         return a+b;

     }



     /*

     需求2 定义一个功能,在控制台画一个矩形

     明确1:这个功能的结果是什么?没有结果,直接打印到控制台

     明确2:这个功能实现过程中是否需要未知内容参与运算? 行和列不确定,需要两个整数int

     */

     public static void draw(int row,int col)

     {

         for (int x=1;x<=row ;x++ )

         {

             for (int y=1;y<=col ;y++ )

             {

                 System.out.print("*");

             }

             System.out.println();

         }

     }



     /*

     需求3 定义一个功能,比较两个数是否相等

     明确1:这个功能的结果是什么?有结果,true或false,返回值为boolean

     明确2:这个功能实现过程中是否需要未知内容参与运算? 两个数不确定,需要两个整数int

     */

     public static boolean equals(int a,int b)

     {

         /*

         if(a==b)

             return true;

         else

             return false;

         */

         return a==b;//a==b,本身是在进行比较运算,结果是true或false,不要要是用(a==b)?true:false

     }

     /*

     需求4 定义一个功能,获取两个整数中较大的那个数

     明确1:这个功能的结果是什么?有结果,返回较大的整数

     明确2:这个功能实现过程中是否需要未知内容参与运算? 参与比较的数不确定,需要两个整数int

     */

     public static int getMax(int a,int b)

     {

         return (a>b)?a:b;

     }

 }

    函数的重载(overload)
        重载的概念
            在同一个类中,允许存在一个以上的同名名称,只要他们的参数个数或者参数类型不同即可。
        重要特点
            与返回值类型无关,只看参数列表
  

class FunctionDemo4

  {

      public static void main(String[] args)

      {

          System.out.println(add(1.2,2.5));

          printCFB(5);

          printCFB();

      }

      /*

      函数的重载

      1.同一个类

      2.同名

      3.参数个数不同或参数类型不同

      4.函数重载和返回值类型无关

      5.java是严谨性语言,如果函数出现调用的不确定性,会编译失败

      */



       //加法运算,两个整数的和

      public static int add(int a,int b)

      {

          return a+b;

      }



       //加法运算,两个小数的和

       public static double add(double a,double b)

      {

           return a+b;

       }



       //加法运算,三个整数的和

       public static int add(int a,int b,int c)

      {

           return a+b+c;

       }



       /*

       打印乘法表

       */

       public static void printCFB(int num)

      {

          for (int x=1;x<=num ;x++ )

          {

              for (int y=1; y<=x;y++ )

              {

                  System.out.print(y+"*"+x+"="+y*x+"\t");//使用制表符'\t'能够实现输出时对齐

              }

              System.out.println();

          }

       }



       /*

       打印标准乘法表

       */

       public static void printCFB()

      {

              printCFB(9);

       }

  }

数组(引用数据类型)
    概念:同一种类型数据的结合,其实数组就是一个容器
    数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素
    格式1
        元素类型[] 数组名=new 元素类型[元素个数或数组长度];
        int[] arr=new int[5]
    格式2
        元素类型[] 数组名=new 元素类型[] {元素,元素,……};
        int[] arr=new int[]{3,5,1,7};
        int[] arr={3,5,1,7};
    内存的划分
        1.寄存器
        2.本地方法区
        3.方法区
        4.栈内存
             存储的都是局部变量(程序运行时,方法要进栈,否则,局部变量无法进栈)。
             而且变量所属的作用域一旦结束,该变量就自动释放
        5.堆内存
             存储的是数组和对象(其实数组就是对象);凡是new建立的,都在堆中
             特点:
             1.每一个实体都有首地址值
             2.堆内存中的每个变量都有默认初始化值,根据类型的不同而不行(整数是0,小数是0.0或0.0f,boolean是false,char'\u0000')
             3.垃圾回收机制
       
        arr不做任何实体指向,则arr=null;//数组arr为空,所有元素的值都为默认初始化值
        int[] x=new int[3];//假设首地址为0x0034,数组内元素为x{0,0,0}
        int[] y=new int[3];//假设首地址为0x0087,y{0,0,0}
        x[0]=9;//x{9,9,9}
        y[0]=34;//x{34,0,0}
        x=y;//首地址变为0x0087,x{34,0,0}
        多个数组变量可以指向同一个实体。
  

class ArrayDemo

  {

      public static void main(String[] args)

      {

          //元素类型[] 数组名=new 元素类型[元素个数或数组长度];

          int[] arr=new int[3];

          arr[0]=89;



          System.out.println(arr[0]);

      }

  }

数组
    数组的遍历
  

class ArrayDemo3

  {

      public static void main(String[] args)

      {

          /*

          需要一个容器,但是不明确容器的具体数据

          */

          //int[] arr=new int[3];



          /*

          需要一个容易,存储已知的具体数据

          */

          //int[] arr=new int[]{89,34,270,17};

          int[] arr={89,34,270,17}; //静态初始化方式



          /*

          对数组操作最基本的动作就是存和取

          核心思想:就是对角标的操作。

          */

          //数组的遍历

          for (int i=0;i<arr.length ;i++ ) //arr.length,可以获取数组的长度

          {

              System.out.println("arr["+i+"]="+arr[i]+";");

          }

      }

  }

    获取数组中的最值
   

class  ArrayDemo4

   {

       public static void main(String[] args)

       {

           int[] arr={-34,-19,-11,-109,-3,-56};

           System.out.println("max="+getMax(arr));

           System.out.println("max="+getMax_2(arr));

           System.out.println("min="+getMin(arr));

       }



       /*

       获取数组中的最大值

       思路:

           1.需要进行比较,并定义变量记录每次比较后较大的值

           2.对数组中的元素进行遍历取出,和变量中记录的元素进行比较,

           如果遍历到的元素大于变量中记录的元素,就用变量记录较大的值

           3.遍历结束,该变量记录就是最大值



       定义一个功能来实现:

       明确1:结果

                   是数组中的元素,int型

       明确2:未知内容

                   数组

       */

       public static int getMax(int[] arr)

       {

           //定义变量记录较大值

           int max=arr[0];

           for (int i=1;i<arr.length ;i++ )

           {

               if(arr[i]>max)

                   max=arr[i];

           }

           return max;

       }



       public static int getMax_2(int[] arr)

       {

           //定义变量记录较大值

           int maxelement=0;

           for (int i=0;i<arr.length ;i++ )

           {

               if(arr[i]>arr[maxelement])

                   maxelement=i;

           }

           return arr[maxelement];

       }

   }

    排序
        选择排序
   

class SelectSort

   {

       public static void main(String[] args)

       {

           int[] arr={34,19,11,109,3,56};

           getArr(arr);

           selectSort(arr);

           getArr(arr);

           selectSort_2(arr);

           getArr(arr);

       }



       /*

       选择排序:

       思路:

           1.第一个元素与后边的所有元素比较,将最小值放在arr[0],比较次数为arr.length-1

           2.需要多轮排序,且每次的比较次数 -1

           3.需要一个变量作为中转

           4.返回排好序的数组

       */

       public static void selectSort(int[] arr)

       {

           for (int i=0;i<arr.length-1 ;i++ ) //外循环中最多取到arr[arr.length-1]即可,此时就是arr[length-1]与arr[length]比较,比较之后结束

               for (int j=i+1;j<arr.length ;j++ )

               {

                   if (arr[i]>arr[j])

                   {

                       swap(arr,i,j);

                   }

               }

       }



       /*

       高效选择排序

       使用变量记录角标,获得最小值角标之后,只进行一次交换,提高了效率

       */

       public static void selectSort_2(int[] arr)

       {

           for (int i=0;i<arr.length-1 ;i++ )

           {

               int num=arr[i],index=i;

               for (int j=i+1;j<arr.length ;j++ )

               {

                   if (num>arr[j])

                   {

                       num=arr[j];

                       index=j;

                   }

               }

               swap(arr,i,index);

           }

       }



       /*

       遍历取出数组中的元素

       */

       public static void getArr(int[] arr)

       {

           System.out.print("[");

           for (int i=0;i<arr.length ;i++ )

           {

               if(i!=arr.length-1)

               {

               System.out.print(arr[i]+","); //使用System.out.print(arr[i]+','),输出结果为47556378100109,而使用System.out.print(arr[i]+“,")则能正常输出3,11,19,34,56,109,

               //解决:使用' ',在输出时强制转换为int型(int类型+char类型=int类型),而使用" ",int类型+string类型不能进行转化,只能在输出的数后边添加字符串

               }

               else

                   System.out.print(arr[i]);

           }

           System.out.print("]");

           System.out.println();

       }



       /*

       实现交换功能:实现arr[i]与arr[i+1]值的交换

       */

       public static void swap(int[] arr,int a,int b)

       {

           int temp=arr[a];

           arr[a]=arr[b];

           arr[b]=temp;

       }

   }

        冒泡排序
       

class BubbleSort

       {

           public static void main(String[] args)

           {

               int[] arr={34,19,11,109,3,56};

               getArr(arr);

               bubbleSort(arr);

               getArr(arr);

               bubbleSort_2(arr);

               getArr(arr);

           }



           /*

           冒泡排序

               1.相邻两个元素相比,较大的后移(下沉)

               2.下一次比较比本次比较次数-1,且最后面的i个元素已排好序,不需要比较

               3.总共需要排序arr.length-1次

               4.内循环-1,为了避免角标越界;为了让外循环增加一次,内循环参数与比较的元素个数递减

           */

           public static void bubbleSort(int[] arr)

           {

               for (int i=0;i<arr.length-1 ;i++)

               {

                   for (int j=0;j<arr.length-1-i;j++ ) //外循环次数+1,则内循环需要比较次数-1

                   {

                       if (arr[j]>arr[j+1])

                       {

                           swap(arr,j,j+1);

                           //int temp;

                           //temp=arr[j];

                           //arr[j]=arr[j+1];

                           //arr[j+1]=temp;

                       }

                   }

               }

           }



           /*

           1.外循环从最后一个元素开始取值

           2.外循环每次角标-1

           3.内循环的比较次数随着外循环的变化而变化

           */

           public static void bubbleSort_2(int[] arr)

           {

               for (int i=arr.length-1;i>0 ;i-- )

               {

                   for (int j=0;j<i ;j++ )

                   {

                       if (arr[j]>arr[j+1])

                       {

                           swap(arr,j,j+1);

                           //int temp;

                           //temp=arr[j];

                           //arr[j]=arr[j+1];

                           //arr[j+1]=temp;

                       }

                   }

               }

           }



           /*

           遍历输出数组元素

           */

           public static void getArr(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.print(arr[i]);

               }

               System.out.print("]");

               System.out.println();

           }



           /*

           实现交换功能:实现arr[i]与arr[i+1]值的交换

           */

           public static void swap(int[] arr,int a,int b)

           {

               int temp=arr[a];

               arr[a]=arr[b];

               arr[b]=temp;

           }

       }

    数组的查找
      

/*

      面试题

      给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,

      那么这个元素的存储的角标如何获取

      {13,15,19,20,33,45,78,106}

      */

      import java.util.*;

      class ArrayDemo5

      {

          public static void main(String[] args)

          {

              //int[] arr={4,1,5,7,3,8,2};

              int[] arr={13,15,19,28,33,45,78,106};

              //int index=getIndex(arr,50);

              //System.out.println("index="+index);

              int index1=halfSearch(arr,50);

              System.out.println("index="+index1);

              int index2=halfSearch_2(arr,50);

              System.out.println("index="+index2);



              int index3=Arrays.binarySearch(arr,50);//java中的折半查找

              /*

              如果存在,则返回的是具体的角标位置;不存在,则返回的是 -插入点-1。

              */

              System.out.println("indxe="+index3);





          }



          /*

          数组常见功能:查找。

          1.确定需要查找的数组

          2.确定需要查找的元素

          需要两个形参

          */

          public static int getIndex(int[] arr,int key)

          {

              for (int i=0;i<arr.length-1 ;i++ )

              {

                  if (arr[i]==key)

                  {

                      return i;

                  }

              }

              return -1;

          }



          /*

          折半查找(二分查找)

              1.数组必须为有序数组

              2.头角标和尾角标可能变化,故需要变量min,max

              3.中间角标为mid=(min+max)/2

              4.如果要查找的值key>arr[mid],则该值可能在后半部分,min+1;否则,可能在前半部分,max-1

              5.当max<min时,停止查找,该数组中没有要查找的值key

          */

          public static int halfSearch(int[] arr,int key)

          {

              int max,min,mid;

              min=0;

              max=arr.length-1;

              mid=(min+max)/2;

              while(key!=arr[mid])//当key==arr[mid]时,查找成功,停止查找

              {

                  if (key>arr[mid])

                      min=mid+1;

                  else if (key<arr[mid])

                      max=mid-1;

                  if(max<min)

                      //return -1;//查找结束,该数组中不存在此元素

                      return  min;//返回插入点

                  mid=(min+max)/2;

              }

              return mid;

          }



          public static int halfSearch_2(int[] arr,int key)

          {

              int max,min,mid;

              min=0;

              max=arr.length-1;





              while(min<=max)//当min>max时,整个数组已查找完毕,停止查找

              {

                  mid=(min+max)/2;

                  if (key>arr[mid])

                      min=mid+1;

                  else if (key<arr[mid])

                      max=mid-1;

                  else

                      return mid;

              }

              //return -1;//查找结束,该数组中不存在此元素

              return min;//返回插入点

          }

      }

进制转换

class ArrayTest3 

{

    public static void main(String[] args) 

    {

        toHex(60);

        toBinary(6);

        toOctal(8);

        System.out.println(Integer.toBinaryString(6));//二进制转换



    }

    //十进制转十六进制

    public static void toHex(int num)

    {

        trans(num,15,4);

    }

    //十进制转八进制

    public static void toOctal(int num)

    {

        trans(num,7,3);

    }

    //十进制转二进制

    public static void toBinary(int num)

    {

        trans(num,1,1);

    }

    public static void trans(int num,int base,int offset)

    {

        if(num==0)

        {

            System.out.println("0");

            return ;//如果不写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;

        }

        printHex(arr,pos);

        System.out.println();



    }



    public static void printHex(char[] arr,int pos)

    {

        for (int x=pos;x<=arr.length-1 ;x++ )

        {

                System.out.print(arr[x]);

        }

    }

}



二维数组
    格式1:int[][] arr=new int[3][2];
        定义了名称为arr的二维数组
        二维数组中有3个以为数组
        每一个一维数组中有2个元素
        一维数组的名称分别为arr[0],arr[1],arr[2]
        给第一个一维数组的1脚标位赋值78:arr[][1]=78;
    格式2:int [][] arr=new int[3][];
        分别对二维数组中的每一个小数组进行初始化:
        arr[0]=new int[2];
        arr[1]=new int[1];
        arr[2]=new int[3];
    格式3:
        静态定义一个二维数组
        int[][] arr={{3,1,7},{5,8,2,9},{4,1}};

  /*

二维数组定义的格式

*/

class  Array2Demo

{

    public static void main(String[] args)

    {

        //int[] arr=new int[3];

        //System.out.println(arr);//[I@bdb503,@左边是实体的类型,右边是实体的哈希值



        //int[][] arr=new int[3][2];//创建一个二维数组,该数组中有3个一维数组,每个一维数组中有2个元素



        //System.out.println(arr);//直接打印二维数组,[[I@bdb503,@左边有两个[,是二维数组

        //System.out.println(arr[0]);//打印二维数组中脚标0的一维数组,@左边有1个[,是一维数组

        //System.out.println(arr[0][0]);//打印二维数组中脚标0的一维数组中脚标为0的元素



        //int[][] arr=new int[3][];

        //System.out.println(arr);//直接打印二维数组,[[I@bdb503,@左边有两个[,是二维数组

        //System.out.println(arr[0]);//一维数组未初始化,null

        //System.out.println(arr[0][0]);//一维数组为初始化,一维数组中没有元素(不是元素为0)



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

        //System.out.println(arr.length);//打印二维数组的长度,其实就是一位数组的个数

        //System.out.println(arr[1].length);//打印脚标为1的一维数组的长度





        /*

        遍历二维数组

        */

        int[][] arr={{3,1,7},{5,8,2,9},{4,1}};

        int sum=0;

        for (int x=0;x<arr.length ;x++ )

        {

            System.out.print("{");

            for (int y=0;y<arr[x].length ;y++ )

            {

                if(y!=arr[x].length-1)

                    System.out.print(arr[x][y]+",");

                else

                    System.out.print(arr[x][y]);

                sum+=arr[x][y];

            }

            System.out.println("}");



        }

        System.out.println("sum="+sum);

    }

}

你可能感兴趣的:(java语言)