《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;
-
数组是多个相同数据类型的组合,实现对这些数据的统一管理
-
数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
-
数组属于引用类型,数组型数据类型是对象(object),数组中的每个元素相当于该对象的成员变量
-
数组一旦初始化以后,长度不可变
-
-
这里是一个整数数组
-
int+[]+你希望的数组的名字这里就是a
int[] a; //这是一个可以保存整数的数组类型 数组变量声明
-
要创建数组需要使用new操作符
new a[100]//这会构造一个包含100个整数的数组
int a = new a[100] //创建一个包含100个整数元素的数组然后,把它保存在这个变量a中
-
数组索引从
0开始,这个数组的索引从0到99,数组的长度是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 }
-
数组变量并不包含数组,它只是包含数组的一个引用,它包含内存中存储这个数组的位置
-
创建副本时,我们复制的只是那个引用,数组变量并不包含元素,它包含的是引用
-
luckyNumbers和smallPrimes指向内存的同一个位置,所以他们的值是相同的 -
如果修改
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
