java笔记 -- 数组

时间:2022-06-05 11:44:14

概念:

  • 数组是一种数据结构, 用来存储同一类型值的集合.
  • 通过一个整型的下标可以访问数组中的每一个值.
  • 声明:

int[] a(推荐,将类型int[](整形数组)和变量名分开了) 或者int a[]

  • 赋值:

int[] a = new int[100]; // 创建一个可以存储100个整数的数组,下标是1-99
int[] a = new int[n]; // 100可以是变量n.

  • 初始化:

数字数组: 所有元素初始化为0;
boolean数组: 所有元素初始化为false;
对象数组: 所有元素初始化为null; // String[] names = new String[10];

int smallPrimes = {2, 3, 5, 7}; // 可在创建的时候直接赋值.
new int[] {1, 4, 6, 8}; // 可以初始化一个匿名数组.
smallPrimes = new int[] {1, 4, 6, 8}; // 可以在不创建新变量的时候重新初始化一个数组.

taps:
  Java中允许数组长度为0. ---> new int[0]; // 创建新的长度为0的空数组

  • 获取数组长度:

a.length;

  • for each:

使用: 不需要使用下标的循环, 只关注元素本身.
for (variable : collection) statement
  例: for (int element : a)
    System.out.println(element);

  • 打印数组:

1. 循环打印a[i]
2. Arrays.toString(a)
注意: 不可直接打印a, 打印出来的是地址?

  • 数组拷贝:

用=赋值的新变量与原数组变量引用了同一个地址, 更改一个, 另外一个也会改变.
可以用Arrays.copyOf方法拷贝到一个新数组中:
  int b = Arrays.copyOf(a, length);
  length是新数组b的长度:  如果小于a.length, 只拷贝a中前length个元素.
            : 如果大于a.length, 那么多余的元素会根据数组类型相应的被初始化为0 或 false, 或null

  • 数组排序:

Arrays.sort(a);

数组API:

java.util.Arrays:

  • static String toString(type[] a);

返回包含a中数据元素的字符串, 这个数据元素被放在括号内, 并用逗号分开.
参数a, 类型为int, long, short, char, byte, boolean, float, double的数组.

  • static type copyOf(type[] a, int length)
  • static type copyOf(type[] a, int start, int end)

拷贝0-length个元素或者start-end下标的元素

  • static void sort(type[] a);

采用优化的快速排序算法对数组进行排序.
参数a, 类型为int, long, short, char, byte, boolean, float, double的数组.

  • static int binarySearch(type[] a, type v)
  • static int binarySearch(type[] a, int start, int end, type v)

用二分法搜索算法查找值v. 如果查找成功, 则返回相应的下标值; 否则, 返回一个负数值r.
-r-1是为保持a有序v应插入的位置.
参数a, 类型为int, long, short, char, byte, boolean, float, double的数组.
v 同a的数据元素类型相同的值.

  • static boolean equals(type[] a, type[] b)

如果两个数组大小相同, 并且下标相同的元素都对应相等, 返回true.
参数a, b, 类型为int, long, short, char, byte, boolean, float, double的两个数组.

多维数组:
声明:
  double[][] balance;
  balance = new double[NYEARS][NRATES];
  int[][] b =
  {
    {1, 2, 3,4},
    {11, 22, 33,44},
    {12, 23, 34,45},
    {16, 27, 38,49},
  };
  处理多维数组需要用多层循环嵌套
  打印多维数组:
  1.循环打印;
  2.Arrays.deepToString(a);

package com.picc.sample.arraysample;
import java.util.Arrays; // 多维数组示例:
public class ArrayNote {
public static void main(String[] args) {
final double STARTRATE = 10;
final int NRATES = 6;
final int NYEARS = 10; double[] interestRate = new double[NRATES]; // Arrays.toString(interestRate) --> [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
for (int j = 0; j < interestRate.length; j++)
interestRate[j] = (STARTRATE + j) / 100.0;
// System.out.println(Arrays.toString(interestRate)); double[][] balances = new double[NYEARS][NRATES];
// System.out.println(Arrays.deepToString(balances)); // set initial balances to 1000
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++) {
double oldBalance = balances[i - 1][j];
double interest = oldBalance * interestRate[j];
balances[i][j] = oldBalance + interest;
}
} for (int j = 0; j < interestRate.length; j++)
System.out.printf("%9.0f%%", 100 * interestRate[j]); System.out.println();
for (double[] row : balances) {
for (double b : row)
System.out.printf("%10.2f", b);
System.out.println();
}
}
} 运行结果:

  10%   11%     12%    13%    14%     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

 

package com.picc.sample.arraysample;

import java.util.Arrays;
import java.util.Scanner; // 输出输出, 数组方法
public class LotterDrawing {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); System.out.println("How many numbers do you need to draw");
int k = in.nextInt(); System.out.println("How many numbers do you need to draw");
int n = in.nextInt(); int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers[i] = i + 1; int[] result = new int[k]; for (int i = 0; i < result.length; i++) {
int r= (int) (Math.random() * n);
result[i] = numbers[r];
numbers[r] = numbers[n - 1];
n--;
} Arrays.sort(result); // 两种打印方法
// System.out.println(Arrays.toString(result));
for (int r: result)
System.out.print(r + ", ");
}
} 运行示例:

How many numbers do you need to draw

How many numbers do you need to draw

1, 4, 5, 9, 13,