Java动态数组实现Worst fit最坏适配算法的删除块逻辑正确性校验
代码问题校验与修复方案
现存核心问题
你的删除逻辑存在4个明显问题,也是此前触发数组越界、后续可能出现隐性bug的根源:
- 删除逻辑循环边界错误:原
deleteBlock方法中遍历原块数组时仅循环到temp.length(即原数组长度-1),遗漏了原数组最后一个元素。如果删除的不是最后一个块,会导致新数组末尾元素为默认值0,原数组最后一个块的数据直接丢失。 - 无效ID校验缺失:输入的块ID小于0、大于等于原数组长度时属于非法输入,原代码未做拦截,会产生不符合预期的返回结果,甚至触发数组越界异常。原代码中
id == blocks.length的分支逻辑完全错误:数组下标最大为length-1,输入等于length的ID本身就是非法值,你反而直接删除了最后一个块。 - 边界场景适配缺失:当原块数组长度为1时,删除后应返回空数组,原逻辑未做针对性校验。
- 业务逻辑隐患:删除内存块时未校验该块是否已被分配给进程,直接删除会导致分配记录与实际块数据不一致。
修复后的deleteBlock代码
private static int[] deleteBlock(int[] blocks) { // 空数组提前拦截 if (blocks == null || blocks.length == 0) { System.out.println("当前无内存块可删除"); return new int[0]; } // 打印现有块信息 for (int i = 0; i < blocks.length; i++) { System.out.printf("Block id %s blockSize= %s%n", i, blocks[i]); } System.out.println("Enter block id to delete"); int id = in.nextInt(); // 非法ID校验拦截 if (id < 0 || id >= blocks.length) { System.out.println("输入的块ID非法,删除失败"); return blocks; } int[] temp = new int[blocks.length - 1]; int c = 0; // 遍历整个原数组,跳过要删除的ID对应元素 for (int i = 0; i < blocks.length; i++) { if (i != id) { temp[c++] = blocks[i]; } } return temp; }
其他优化建议
- 建议使用
ArrayList<Integer>存储块和进程信息,Java集合已经封装好了新增、删除元素的逻辑,不需要自行处理数组拷贝,能大幅降低边界异常概率。 - 后续实现删除进程功能时,需要补充内存块回收逻辑,把进程占用的空间归还到对应的块中。
- 你当前在main方法中两次调用
worstFit方法,第二次传入的块数组是第一次分配后的剩余空间,不符合实际内存分配的业务逻辑,建议每次重新分配时基于初始块大小,或者补充进程退出的块回收逻辑。
内容的提问来源于stack exchange,提问作者Mohammed Hamdoon
相关产品推荐
相关产品推荐

