Java 数组(Array)用于存储固定大小的同类型元素序列,数组中的元素可以是基本类型或对象类型。每个元素在数组中都有一个索引,通过索引可以高效地访问、修改或遍历元素
Java 的数组和 JavaScript 数据有几个明显的区别
- JavaScript 数组中可以存储任意类型的元素;Java 数组是强类型的,只能存储相同类型的元素
- JavaScript 数组是动态的,大小可以随时改变,也可以通过 delete 关键字删除数组元素;Java 数组是静态的,它在声明时就需要指定数组大小,数组大小不能动态改变
初始化
数组必须先声明后使用,并在创建时指定类型与大小,一旦创建无法更改
java
// 创建一维数组,包含10个整数
int[] numbers;
numbers = new int[10];
// 一维数组初始化,注意和 JavaScript 的语法区别,元素使用 {} 而不是 []
int[] numbers = {1, 2, 3, 4, 5};
// 二维数组初始化
String[][] names = {
{"Alice", "Bob"},
{"Charlie", "David"},
{"Eve", "Frank"}
};
// 使用 `new` 关键字进行部分初始化
double[] salary = new double[]{50000.0, 60000.0, 55000.0};
JavaScript 中字面量初始化数组使用 []
遍历
Java 遍历数组的方式和 JavaScript 非常类似
java
int[] nums = {1, 2, 3, 4, 5};
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
for (int n : nums) { // JavaScript 使用 for...in
System.out.println(n);
}
排序
对于数值类型的数组,可以直接通过 Arrays 的静态函数 sort 排序,数组本身被改变
java
int[] nums = {4, 2, 9, 5, 8, 6, 0};
Arrays.sort(nums); // 升序
sort 方法支持自定义排序方式
java
import java.util.Arrays;
import java.util.Comparator;
class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer x, Integer y) {
return y - x;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
Integer[] nums = { 1, 2, 3, 4, 5, 0 };
Comparator<Integer> cmp = new MyComparator();
Arrays.sort(nums, cmp);
for (int n : nums) {
System.out.println(n);
}
}
}
当然可以使用 lambda 表达式简化程序
java
import java.util.Arrays;
public class Demo {
public static void main(String[] args) throws Exception {
Integer[] nums = { 1, 2, 3, 4, 5, 0 };
Arrays.sort(nums, (x, y) -> y - x);
for (int n : nums) {
System.out.println(n);
}
}
}
java.util.Arrays 工具类
java.util.Arrays
是一个实用类,提供了操作数组的静态方法,如排序、搜索、填充和比较等
方法 | 描述 |
---|---|
sort() |
对数组进行排序 |
binarySearch() |
使用二分查找在排序数组中查找元素 |
copyOf() |
复制指定长度的数组 |
copyOfRange() |
复制数组的一个范围 |
fill() |
使用特定值填充数组 |
equals() |
比较两个数组是否相等 |
hashCode() |
生成数组的哈希码 |
toString() |
将数组转换为字符串描述 |
deepToString() |
深层次转换多维数组为字符串描述 |
stream() |
将数组转换为流 |
java
import java.util.Arrays;
public class ArraysExample {
public static void main(String[] args) {
int[] numbers = {40, 10, 30, 20, 50};
// 排序
Arrays.sort(numbers);
System.out.println("排序后: " + Arrays.toString(numbers)); // 输出: [10, 20, 30, 40, 50]
// 二分查找
int index = Arrays.binarySearch(numbers, 30);
System.out.println("30 的索引位置: " + index); // 输出: 2
// 复制数组
int[] copy = Arrays.copyOf(numbers, numbers.length);
System.out.println("复制数组: " + Arrays.toString(copy)); // 输出: [10, 20, 30, 40, 50]
// 填充数组
Arrays.fill(copy, 0);
System.out.println("填充后: " + Arrays.toString(copy)); // 输出: [0, 0, 0, 0, 0]
// 比较数组
boolean isEqual = Arrays.equals(numbers, copy);
System.out.println("数组是否相等: " + isEqual); // 输出: false
}
}
集合框架
Java 通过数组这种数据结构来满足基本的存储和操作需求,但数组有许多限制性的问题,如固定大小、操作方法有限等。为了能够更灵活、更高效地管理复杂的数据集合,Java 提供了一个丰富的集合框架(Collection Framework)
- List :代表有序的元素集合,允许重复元素。常见实现类有
ArrayList
、LinkedList
。 - Set :代表不允许重复的无序集合。常见实现类有
HashSet
、LinkedHashSet
、TreeSet
。 - Map :存储键值对映射关系。常见实现类有
HashMap
、LinkedHashMap
、TreeMap
。 - Queue :代表一个先进先出的集合,常见实现类有
PriorityQueue
、LinkedList
(可作为队列使用)。
java
import java.util.ArrayList;
import java.util.List;
List<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
numbers.add(50);
int target = 30;
if (numbers.contains(target)) {
System.out.println(target + " 存在于集合中。");
} else {
System.out.println(target + " 不存在于集合中。");
}