在Java编程中,创建包含数字1到100的数组是一个常见的基础操作,适用于数据处理、算法练习等多种场景,以下将从核心原理、多种实现方式、性能优化、典型错误及解决方案等维度展开详细说明,并提供完整的代码示例与对比分析。

核心概念解析
1 数组的本质
Java中的数组是一种对象,用于存储同类型元素的集合,其特点包括:
✅ 固定长度:创建后无法动态调整大小;
✅ 连续内存分配:元素在内存中按顺序排列;
✅ 默认初始化值:数值型数组默认值为0,布尔型为false,对象型为null。
2 需求拆解
目标:生成一个长度为100的整型数组,且元素值依次为1, 2, 3, …, 100,需满足以下条件:
- 索引0对应值1,索引99对应值100;
- 所有元素必须严格递增且无重复;
- 支持后续对数组的遍历、修改等操作。
主流实现方案对比
| 方法名称 | 关键特性 | 时间复杂度 | 适用场景 |
|---|---|---|---|
| 手动赋值法 | 逐项硬编码 | O(n²) | 教学演示(仅小数组) |
| for循环填充 | 通过索引计算赋值 | O(n) | 通用场景 |
| Stream API | 函数式编程风格 | O(n) | Java 8+高级用法 |
| Arrays.setAll() | 官方工具类批量设置 | O(n) | 快速开发 |
| 数学公式推导 | 基于起始值+偏移量计算 | O(1)设计+O(n)执行 | 特殊需求优化 |
1 方案一:for循环填充(推荐)
public class ArrayCreationExample {
public static void main(String[] args) {
// 创建长度为100的整型数组
int[] numbers = new int[100];
// 通过循环填充1~100的值
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i + 1; // 索引i对应值i+1
}
// 验证前5个和最后5个元素
System.out.println("前5个元素:");
for (int j = 0; j < 5; j++) {
System.out.print(numbers[j] + " "); // 输出: 1 2 3 4 5
}
System.out.println("n最后5个元素:");
for (int j = numbers.length 5; j < numbers.length; j++) {
System.out.print(numbers[j] + " "); // 输出: 96 97 98 99 100
}
}
}
优势:
🔹 逻辑清晰易懂,适合初学者理解数组索引机制;
🔹 可灵活调整起始值和步长(如需改为0~99只需修改i);
🔹 兼容性强,适用于所有Java版本。
潜在问题:
⚠️ 若误将循环条件写为i <= numbers.length会导致ArrayIndexOutOfBoundsException;
⚠️ 大数组场景下可能影响性能(本例仅100次迭代,可忽略)。
2 方案二:Stream API(Java 8+)
import java.util.stream.IntStream;
public class StreamArrayDemo {
public static void main(String[] args) {
// 使用IntStream生成1~100的流并转为数组
int[] numbers = IntStream.rangeClosed(1, 100)
.toArray();
// 打印数组长度验证
System.out.println("数组长度: " + numbers.length); // 输出: 100
}
}
关键方法说明:

rangeClosed(startInclusive, endInclusive):生成包含端点的有序整数流;toArray():将流转换为基本类型数组。
适用场景:
✔️ 需要链式调用进行复杂数据处理时;
✔️ 结合Lambda表达式实现并行处理(parallel());
❌ 不适合极低版本的Java环境(需Java 8+)。
3 方案三:Arrays.setAll()(JDK自带工具)
import java.util.Arrays;
public class ArraysSetAllDemo {
public static void main(String[] args) {
int[] numbers = new int[100];
// 使用setAll方法批量赋值
Arrays.setAll(numbers, index -> index + 1);
// 验证中间元素
System.out.println("第50个元素: " + numbers[49]); // 输出: 50
}
}
参数解析:
- 第一个参数:目标数组;
- 第二个参数:
IntUnaryOperator接口的实现,接收索引返回对应值。
优势:
🚀 底层采用原生循环实现,性能优于普通for循环;
🔧 支持自定义映射规则(如奇偶位交替赋值)。
4 方案四:数学公式直接计算(进阶技巧)
若需频繁生成类似序列,可封装为工具方法:
public class MathBasedArray {
public static int[] generateSequence(int start, int end) {
int length = end start + 1;
int[] arr = new int[length];
for (int i = 0; i < length; i++) {
arr[i] = start + i; // 通用公式:a_n = a₁ + (n-1)d (d=1)
}
return arr;
}
public static void main(String[] args) {
int[] numbers = generateSequence(1, 100);
System.out.println("数组生成成功,长度: " + numbers.length);
}
}
扩展性:
📌 修改start和end可生成任意等差数列;
📌 添加第三个参数step可实现变步长序列。

常见问题与解决方案
1 典型错误汇总
| 错误现象 | 原因分析 | 解决方案 |
|---|---|---|
ArrayIndexOutOfBoundsException |
循环条件错误(如i <= arr.length) |
改为i < arr.length |
| 数组元素全为0 | 未正确初始化或遗漏赋值逻辑 | 检查循环体是否执行到位 |
| 倒序排列(100在前) | 计算公式错误(如arr[i] = 101 i) |
调整公式为i + 1 |
| 空指针异常 | 未实例化数组(仅声明未new) | 确保new int[size]存在 |
2 性能考量
- 微小差异:对于100元素的数组,各方案执行时间均在纳秒级,无明显差异;
- 大规模数据:当数组长度达到百万级时:
Arrays.setAll()> for循环 > Stream API(因涉及装箱拆箱开销);
- 最佳实践:优先选择可读性高的方案,除非性能临界。
相关问答FAQs
Q1: 如何将生成的数组转换为ArrayList?
A: 可通过以下两种方式实现:
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class ArrayToListConversion {
public static void main(String[] args) {
int[] numbers = new int[100];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i + 1;
}
// 方法一:使用Arrays.asList() + 自动装箱
List<Integer> list1 = new ArrayList<>(Arrays.asList(numbers));
// 方法二:手动转换(避免基本类型自动装箱问题)
List<Integer> list2 = new ArrayList<>();
for (int num : numbers) {
list2.add(num);
}
System.out.println("List大小: " + list1.size()); // 输出: 100
}
}
注意:直接使用Arrays.asList()返回的是固定大小的列表,若需可变长度需新建ArrayList。
Q2: 如果只需要访问数组而不修改,有什么优化建议?
A: 可将数组声明为final以防止意外修改,并配合增强for循环提升可读性:
public class ImmutableArrayAccess {
public static void main(String[] args) {
final int[] readOnlyArray = new int[100];
for (int i = 0; i < readOnlyArray.length; i++) {
readOnlyArray[i] = i + 1;
}
// 使用增强for循环遍历(只读操作)
for (int value : readOnlyArray) {
System.out.println(value); // 安全访问,不会修改数组
}
// 以下代码编译错误:无法给final数组重新赋值
// readOnlyArray = new int[50]; // Error: cannot assign a value to final variable readOnlyArray
}
}
优势:
🔹 final修饰符明确表达设计意图;
🔹 编译器会进行额外检查,减少运行时错误;
🔹 配合IDE提示功能,提高代码维护
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/95496.html