Android平台下实现一维数组队列并无额外内存转为二维数组的方法
如何在Android中实现存储一维数组的Queue并在低内存开销下转换为二维矩阵?
先看你提供的测试代码,这里有个关键问题:你在循环里复用了同一个int[] arr对象,每次调用data.add(arr)只是把这个数组的引用加入队列,所以最后队列里的所有元素其实都是同一个数组的引用,最终所有元素都会是你最后一次输入的值。这是第一个要修正的点。
接下来解决你的核心需求:实现存储一维数组的Queue,并且在**不占用额外内存(除了必要的二维数组引用结构)**的前提下转成二维矩阵。其实思路很简单,因为二维矩阵int[][]本质就是存储多个一维数组的引用,所以我们只需要把Queue中的一维数组引用直接迁移到二维数组中即可,不需要复制数组元素,这样内存开销最小。
步骤1:正确实现存储一维数组的Queue
先修正你的测试代码,每次循环都创建新的一维数组,确保队列里的每个元素都是独立的数组:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class QueueToMatrixTest { public static void main(String[] args) { // 存储一维数组的Queue,使用LinkedList实现 Queue<int[]> dataQueue = new LinkedList<>(); Scanner scan = new Scanner(System.in); // 示例:添加3个长度为3的一维数组 for (int j = 0; j < 3; j++) { // 每次循环新建一个数组,避免引用复用 int[] arr = new int[3]; for (int i = 0; i < 3; i++) { arr[i] = scan.nextInt(); } dataQueue.add(arr); } scan.close(); } }
步骤2:低内存开销转换为二维矩阵
要做到最小内存开销,我们不需要复制任何数组元素,只需要把Queue中的一维数组引用直接放到二维数组里。具体实现如下:
// 转换为二维矩阵 int[][] matrix = new int[dataQueue.size()][]; int index = 0; // 遍历队列,直接将数组引用赋值到二维矩阵 for (int[] arr : dataQueue) { matrix[index++] = arr; } // 验证输出 System.out.println("转换后的二维矩阵:"); for (int[] row : matrix) { for (int num : row) { System.out.print(num + " "); } System.out.println(); }
为什么这个方法内存开销小?
- 二维数组
matrix本身只是一个存储引用的数组,它的大小是队列长度 * 引用大小(在Java中一个引用占4或8字节,取决于平台),这是不可避免的必要开销。 - 我们没有复制任何一维数组的元素,只是把原队列中已有的一维数组的引用直接赋值给二维矩阵的行,所以不会额外占用存储数组元素的内存。
Android平台的注意事项
在Android中,这个实现完全兼容:
LinkedList和Queue都是Java标准库类,Android全版本支持。- 如果是在UI线程中处理输入,不要用
Scanner,可以通过EditText获取输入内容后拆分转换为int数组,避免阻塞UI线程。
比如Android中的简易示例(在Activity中):
import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.LinkedList; import java.util.Queue; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView resultTv = findViewById(R.id.result_tv); // 模拟存储一维数组的Queue Queue<int[]> dataQueue = new LinkedList<>(); dataQueue.add(new int[]{1,2,3}); dataQueue.add(new int[]{4,5,6}); dataQueue.add(new int[]{7,8,9}); // 转换为二维矩阵 int[][] matrix = new int[dataQueue.size()][]; int index = 0; for (int[] arr : dataQueue) { matrix[index++] = arr; } // 显示结果 StringBuilder sb = new StringBuilder(); for (int[] row : matrix) { for (int num : row) { sb.append(num).append(" "); } sb.append("\n"); } resultTv.setText(sb.toString()); } }
内容的提问来源于stack exchange,提问作者Revaapriyan
相关产品推荐
相关产品推荐

