在算法里面,经常会遇到需要初始化数组的题目。
我就在想除了for遍历还能有哪些可以快速生成1,2,3---1000这样的数组。
先说结论,对于基本数组来说还是for最快。
但是对于集合来说就不一定了。
例外:
我查到还有着第三方包速度很快,像eclipseCollections 对集合的处理速度很快,不过由于学习成本的问题,这里不进行讨论。
本来应该写在最后的:不过有的人应该只看结论就提前了。
对于数组来说,就用for就好,如果对效率要求没那么高intstream写起来很舒服,效率也差不到多少。
对于集合来说,instream会更快,如果知道容量的话for也不差,不知道的话会差很多。
对于stream基本流来说,无论是数组还是集合,效率都差不多。也都比较慢。
平时的话我会推荐intstream,有提示写起来比较舒服。
一维数组
for遍历
很好理解就是
for (int j = 0; j < n;a[j] = j,j++);
Stream流
Stream
Object[] objects = Stream.iterate(1, i -> i < n, i -> i + 1).toArray();
IntStream
int[] a = IntStream.rangeClosed(1, n).toArray();
效率
模式 | 10000平均时间 | 100000平均时间 |
---|
for | 7986.278 | 79757.494 |
intstream | 8645.855 | 75615.701 |
stream | 53950.274 | 498647.562 |
二位数组
for
int[][] a = new int[3][n+1];
for (int i = 0; i < 3;i++)
for (int j = 0; j < n;j++,a[i][j] = j);
ArraysCopy
int[][] a = new int[3][n+1];
for (int i = 0; i < n;i++,a[0][i] = i);
for (int i = 1; i < 3; i++) {
a[i] = Arrays.copyOf(a[0], n);
}
效率
模式 | 10000平均时间 | 100000平均时间 |
---|
for | 22579.664 | 216966.408 |
copy | 26174.465 | 320343.790 |
集合
for
ArrayList<Integer> a = new ArrayList<>(n);
for (int i = 0; i < n; a.add(i),i++) ;
stream
List<Integer> list = Stream.iterate(1, i -> i < n, i -> i + 1).toList();
intStream
List<Integer> list = IntStream.rangeClosed(1, n).boxed().toList();
效率
模式 | 10000平均时间 | 100000平均时间 |
---|
intstream | 34971.503 | 392437.797 |
for | 37548.544 | 421568.481 |
for不知道容量 | 43829.615 | |
stream | 51799.554 | 494847.233 |