《java核心技术-第三章-数组》学习笔记

数组

 //数组的声明
 String[] names;  
 String names[];
 int[] scores;
 ---给数组初始化分为,静态初始化和动态初始化
 //静态初始化:初始化数组与给数组元素赋值同时进行
 names = new String[]{"一","二","三","四"};  
 
 //初始化数组与给数组元素赋值分开进行
 scores = new int[4];
 //给数组赋值
 scores[0] = 01;  
 scores[1] = 02;
 scores[2] = 03;
 scores[3] = 04;
  1. 数组是多个相同数据类型的组合,实现对这些数据的统一管理

  2. 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型

  3. 数组属于引用类型,数组型数据类型是对象(object),数组中的每个元素相当于该对象的成员变量

  4. 数组一旦初始化以后,长度不可变

  5. 数组中每个元素的空间是一样的

 

  • 这里是一个整数数组

  • int+[]+你希望的数组的名字这里就是a

 int[] a;    //这是一个可以保存整数的数组类型       数组变量声明
  • 要创建数组需要使用new操作符 new a[100] //这会构造一个包含100个整数的数组

 int a = new a[100]  //创建一个包含100个整数元素的数组然后,把它保存在这个变量a中
  • 数组索引从0开始,这个数组的索引从099,数组的长度是a.length,这里length不是方法调用,单词length后面没有小括号()

  • 现在这个特定的数组长度为100,数组的长度不是合法索引,必须将数组长度减1来得到最大索引,在这里也就是99

  • 要使用中括号[]操作符来访问元素,所以a是数组,a[i]就是其中第i个元素

 for (int i = 0; i < a.length; i++)
  System.out.println(a[i]);
 } //这里看到这个特定的循环允许`i`取值从`0`值到数组长度减`1`然后打印出第`i`个元素

如果你想跳过某些元素,或者如果你想以某种方式更新元素就要使用别的循环方式,

你也可以写一个循环或者通过一组单个的赋值语句填充一个数组,不过通常都希望能够在声明,一个数组的同时提供初始值

可以使用这种初始化语法,同样先声明类型int[],数组名然后是一个=这类似于,初始化一个整数的做法

不过由于现在有多个值,要把所有值放在一起,包围在大括号里{}值之间用逗号分隔,

所以在这种情况下Java编译器能,确定你声明了一个长度为6,它会把这6个数放在你的数组中

这个特定的数组有一个名字名为smallPrimes

 int[]   smallPrimes = {2,3,5,7,11,13};
  • 有时你可能想创建一个数组,只是要把它传递到一个方法,你并不会把它存放到一个变量中,

  • 在这种情况下可以声明一个匿名数组,

 new int[]{ 17,19,23,29,31,37 }
  • 数组变量并不包含数组,它只是包含数组的一个引用,它包含内存中存储这个数组的位置

  • 创建副本时,我们复制的只是那个引用,数组变量并不包含元素,它包含的是引用

  • luckyNumberssmallPrimes指向内存的同一个位置,所以他们的值是相同的

  • 如果修改luckyNumbers的值smallPrimes也会改变,因为他们实际上是同一个数组

 int[] luckyNumbers = smallPrimes;
 luckyNumbers[5] = 12; // now smallPrimes[5] is also 12
  • 如何复制一个真的数组,copyOf方法取一个数组,以及长度,就是你想复制多少个元素

  • 它会为你返回一个新数组,其中包含全新的值,所以现在它们是完全不同的数组

举例:在n个数里面随机抽K个数

 public static void main(String[] args) throws IOException {
 
         Scanner in = new Scanner(System.in);
 
         //赌以下组合。它会让你变得富有!
         System.out.println("Bet the following combination. It'll make you rich!");
         //你能抽几个数
         int k = in.nextInt();
 
         //你能抽的最高数字是多少?
         System.out.print("what is the highest number you can draw? ");
         //你抽的组合一共有多少个数
         int n = in.nextInt();
 
         //用数字1 2 3 N 填充一个数组。
         //fill an array with numbers 1 2 3 . . . n
         int[] numbers = new int[n];
         for (int i = 0; i < numbers.length; i++) {
             numbers[i] = i + 1;
        }
 
         // 画出K个数字,并将它们放入第二个数组中
         // draw k numbers and put them into a second Array
         int[] result = new int[k];
         for (int i = 0; i < result.length; i++) {
 
             //在0和n-1之间创建一个随机索引
             // make a random index between 0 and n - 1
             int r = (int) (Math.random() * n);
 
             //在随机位置拾取元素
             // pick the element at the random location
             result[i] = numbers[r];
 
             //将最后一个元素移动到随机位置
             // move the last element into the random location
             numbers[r] = numbers[n - 1];
             n--;
 
        }
 
         //打印排序后的数组
         // print the sorted array
         Arrays.sort(result);    //数组排序
         for (int r : result) {
             System.out.println(r);
        }
    }
 }

二维数组

二维数组的初始化

 //静态初始化
 int[][] scores = new int[][]{{1,2,3},{3,4,5},{6,7}}
 
 //动态初始化方式一
 String[][] names = new String[6][5];
 //动态初始化方式二
 String[][] names = new String[6][];
 names[0] = new String[5];
 names[0] = new String[7];
 names[0] = new String[8];
 names[0] = new String[7];
 names[0] = new String[9];
 names[0] = new String[6];
  • 这是数字的一个二维排列,首先必须指定类型,维数组的类型是lnt[][]

  • 一个中括号对应行索引,另一个中括号对应列索引,这里数组名是magicSquare

  • 要有这些大括号来包围整个数组,另外每一行也分别用大插号包围

 int[][] magicSquare ={
    {16,3,2,13},
    {5,10,11,8},
    {9,6,7,12},
    {4,15,14,1}
 };
  • 而且你不想提供初始值,如果你有一个二维数组

 int[][] magicSquare = new int[ROWS][COLUMNS];       //ROWS行数    COLUMNS列数
  • 要访问数组元素需要,提供两个中括号,第一个中插号提供行,第二个中括号提供这一行中这一列的元素

  • 实际上二维数组会存储为一维数组的数组

  • 遍历二维数组

 for (int[] row : magicSquare)   //row是一个存储一个数组的元素
     for (int element : row)
    do something with element
  • 二维数组是数据的一种表格排例

举例: 以一个二维数组,存储不同利息下每年的不同本息

 public static void main(String[] args) throws IOException {
     final double STARTRATE = 10;
     final int NRATES = 6;
     final int NYEARS = 10;
 
     //将利率设定为10...15%
     // set interest rates to 10 . . . 15%
     double[] interestRate = new double[NRATES];
     for (int j = 0; j < interestRate.length; j++) {
         interestRate[j] = (STARTRATE + j) / 100;
    }
     //定义一个数组   用来存储年份和不同利率的金额
     double[][] balances = new double[NYEARS][NRATES];
 
     //将初始余额设置为10000
     // set initial balances to 10000
     for (int j = 0; j < balances[0].length; j++) {
         balances[0][j] = 10000;
    }
     //计算未来几年的利息
     // compute interest for future years
     for (int i = 1; i < balances.length; i++) {
         for (int j = 0; j < balances[i].length; j++) {
 
             //从上一行获取去年的余额
             // get last year's balances from previous row
             double oldBalance = balances[i - 1][j];
 
             //计算利息
             // compute interest
             double interest = oldBalance * interestRate[j];
 
             //计算今年的余额
             // compute this year's balances
             balances[i][j] = oldBalance + interest;
        }
    }
     //打印利率
     for (double N : interestRate) {
         System.out.printf("%8.2f"+"|",N);
    }
     for (double[] row : balances) {
         System.out.println();           //给行换行
         for (double element : row) {
             System.out.printf("%8.2f"+"|",element);     //格式化输出
        }
    }      
  }
 //输出结果
     0.10|    0.11|    0.12|    0.13|    0.14|    0.15|
 10000.00|10000.00|10000.00|10000.00|10000.00|10000.00|
 11000.00|11100.00|11200.00|11300.00|11400.00|11500.00|
 12100.00|12321.00|12544.00|12769.00|12996.00|13225.00|
 13310.00|13676.31|14049.28|14428.97|14815.44|15208.75|
 14641.00|15180.70|15735.19|16304.74|16889.60|17490.06|
 16105.10|16850.58|17623.42|18424.35|19254.15|20113.57|
 17715.61|18704.15|19738.23|20819.52|21949.73|23130.61|
 19487.17|20761.60|22106.81|23526.05|25022.69|26600.20|
 21435.89|23045.38|24759.63|26584.44|28525.86|30590.23|
 23579.48|25580.37|27730.79|30040.42|32519.49|35178.76|

 

数组的默认初始化值

对于byteshortintlong而言:创建数组以后默认值为0

对于floatdouble而言,默认值是0.0

对于char而言默认值是空格

对于Boolean而言默认值为false

对于引用类型变量构成的数组而言默认值是null

posted @ 2022-04-02 22:30    阅读(184)  评论(0)    收藏  举报