Java基础 - 方法和数组

13.方法和数组

方法

  • 方法定义

    程序中完成某个独立的功能,可重复使用的一段代码的集合,解决功能重复的问题;

  • 方法结构

      [修饰符] 返回值类型 方法名([数据类型 变量名1,数据类型 变量名2,...]) {
    
              方法体;
    
              [return 值;]
      }
    

    参数列表:又称为参数清单,包含参数的个数、参数类型、参数顺序。

    方法签名:方法名+方法参数列表,判断是否是同一个方法的标准。

  • 方法特点

    • 它可以实现独立的功能,必须定义在类里面。

    • 它只有被调用才会执行,它可以被重复使用。

    • 方法结束后方法里的对象失去引用, 变量会消失。

  • 方法的重载

    在同一个类中,允许多个方法的名字相同,但是他们的参数列表绝对不能相同

    遵守的原则:两同一不同

    • 两同:同一个类,方法名相同

    • 一不同:方法的形参列表(参数的个数,参数的类型,参数顺序)

    注意:方法重载和方法的返回值类型无关。

  • 方法的递归

    所谓递归就是方法自己调用自己,可以执行结束(有出口),

  • 方法参数的值传递机制

    方法被调用时,方法里的参数是以值传递的方式传递的。

    所谓值传递,就是将实际参数的副本(复制品)传入方法,而参数本身不受影响

    • 若是基本数据类型,就直接传递实参值的副本

    • 若是引用数据类型,就传递实际参数的16进制地址值

    示例代码:

    基本类型

      需求:定义一个方法change,改变传入实参的值。   
      public static void main(String[] args) {
          int x=10;
          change(x);
          System.out.println("main中执行change后的x=" + x); //输出 x = 10
      }
    
      public static void change(int x) {
          System.out.println("change前...x=" + x); // x = 10
          x=20;
          System.out.println("change后...x=" + x); // x = 20
      }
    

    引用类型

      案例:定义一个change方法,改变数组索引为1的元素的值。
    
      public static void main(String[] args) {
          int[] arr = {1,2 };
          change(arr);
          System.out.println("main中执行change后arr[1]= " + arr[1] );// {1,10}
      }
    
      public static void change(int[] arr) {
          System.out.println("chagne前...arr[1]= " + arr[1] ); // {1,2}
          arr[1] = 10;
          System.out.println("chagne后...arr[1]= " + arr[1] ); // {1,10}
      }
    

数组

  • 数组定义

    把具有相同类型的若干变量按有序的形式组织起来, 这些按一定顺序排列的同类型数据的集合称为数组

    数组也是一种数据类型.

  • 数组初始化

    Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。

    初始化数组的两种方式:

    1. 静态初始化

       元素类型[] 数组名 = new 元素类型[]{值1,值2,...}
       int[] arr = new int[]{1,2,3}    
       
       简写语法:
      
       元素类型[] 数组名 = {元素1,元素2,元素3...元素n}
       int[] arr = {1,2,3}
      
    2. 动态初始化

       元素类型[] 数组名 = new 元素类型[长度]
       int[] arr = new int[10];
      
  • 二维数组

    1. 一维数组中每一个元素都是一个值

    2. 二维数组:就是里面的每一个元素都是一个一维数组(内存地址值)

      int[][] arr = {{1,2,3},{5,6,7},{8}}

    3. 三维数组,就是里面是每一个元素都的二维数组(内存地址值)

  • 可变参数

      public void test(int a,int...ss)
    

    可变参数也是编译器的特性(语法糖),底层依然是数组,和数组的打包

    一个方法中可变参数只能有1个,且必须位于最后

    二维数组的可变参数是int[]... arr

  • 排序算法

    1. 冒泡排序(Bubble Sort)

      这是最简单的排序法,

      • 基本思路:

        对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。

        可以看出若有N个元素,那么一共要进行N-1轮比较,第M轮要进行N-M次比较。(若6个元素,要进行6-1轮比较,第一轮比较6-1次,第三轮比较6-3次)。

      • 示例代码:

          int[] arr = {3, 5, 4, 1, 8, 2};
          //外层循环表示要比较多少轮
          for (int i = 1; i < arr.length; i++) {
              //内循环表示每轮比较多少次
              for (int j = 0; j < arr.length - i; j++) {
                  //每次比较时,相邻的两个数,前面大于后面的元素,则交换值,得到该次比较的最大值
                  if (arr[j] > arr[j + 1]) {
                      //异或的位运算,交换值
                      arr[j] = arr[j] ^ arr[j + 1];
                      arr[j + 1] = arr[j] ^ arr[j + 1];
                      arr[j] = arr[j] ^ arr[j + 1];
                  }
              }
          }
        
    2. 选择排序

      • 基本思路

        选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。

        可以看出选择排序,第一轮会选出最小值,第二轮会选出第二小的值,直到最后。

        第一轮从arr[0]和后面元素相比较,第二轮从arr[1]和后面的元素相比较,依次类推。N个数要进行N-1轮。相对于冒泡排序效率高一些。

      • 示例代码

          int[] arr = {3, 5, 4, 1, 8, 2};
          for (int i = 0; i < arr.length - 1; i++) {
              for (int j = i + 1; j < arr.length; j++) {
                  if (arr[i] > arr[j]) {
                      //异或的位运算,交换值
                      arr[i] = arr[i] ^ arr[j];
                      arr[j] = arr[i] ^ arr[j];
                      arr[i] = arr[i] ^ arr[j];
                  }
              }
          }
        
    3. 二分查找

      当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的

      • 基本思路

        每一次都跟数组的中间变量作比较,根据大于或者小于来改动开始和结束的索引

        只要中间值和key相同就返回索引

        如果循环结束都没有返回那就说明key在数组中不存在,返回-1

  • 数组工具类 Arrays

    常用方法

      int binarySearch(type[] arr,type key)   使用二分法查找数组里某元素并返回其索引,若找不到返回负数.
    
      void sort(type[] arr)   使用调优后的快速法对指定数组排序。
    
      String toString(type[] arr) 返回指定数组内容的字符串表示形式。
    
      public static type[] copyOf(type[] original, int newLength) 复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容