用java实现动态分区

这篇博客介绍如何使用Java来实现动态分区管理,通过链表数据结构进行内存分配和回收。文章详细阐述了回收过程中涉及的8种不同情况,并解释了如何根据这些情况进行空闲分区的合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用java实现动态分区问题,运用链表的知识,实现分配和回收,这个问题在回收过程中需要考虑8种情况,并按照相应的情况决定是否对空闲分区进行合并。



package 动态分区;



public class Area {
private int number;
private String name;
private int startaddress;
private int size1;

private int flag;


public Area(){};

public Area(String name,int size1,int startaddress,int flag)
{
this.name = name;
this.size1 = size1;
this.startaddress = startaddress;
this.flag = flag;
}
public Area(String name,int size1)
{
this.name = name;
this.size1 = size1;

}
public void setName(String name)
{
this.name = name;
}
    public String  getName(){
    return name;
    }
    public void setSize(int size1)
    {
    this.size1 = size1;
    }
    public int getSize()
    {
    return size1;
    }
    public void setFlag(int flag)
    {
    this.flag = flag;
    }
    public int getFlag()
    {
    return flag;
    }
    public void setStartaddress(int startaddress)
    {
    this.startaddress = startaddress;
    }
    public int getStartaddress()
    {
    return startaddress;
    }
    

}


package 动态分区;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Allocation {
static List <Area> e = new ArrayList<Area>();
public static void alloction(Area a)  //分配函数
{
int i;
for( i = 0;i < e.size(); i++)
{
if(a.getSize() < (e.get(i)).getSize() && (e.get(i)).getFlag() == 0)
{
if((e.get(i)).getSize() - a.getSize() <= 2)
{

(e.get(i)).setName(a.getName());
}
else
{


a.setStartaddress((e.get(i)).getStartaddress());
(e.get(i)).setStartaddress((e.get(i)).getStartaddress() + a.getSize());
(e.get(i)).setSize((e.get(i)).getSize() - a.getSize());
e.add(i,a);
}
e.get(i).setFlag(1);
System.out.println("分配成功!");
break;
}
}
if(i == e.size())
{
System.out.println("没有足够的空间可以分配!");
}
}


public static void Recycle(String name)           //回收函数
{
int i ;
for(i = 0; i < e.size(); i++)
{
if(name.equals((e.get(i)).getName()))
{

if(i >= 1 && i < e.size() - 1)
{
if((e.get(i - 1)).getFlag() == 0&&(e.get(i + 1)).getFlag() == 1)         //回收区前一个空闲后一个占用状态时
{

(e.get(i - 1)).setSize((e.get(i - 1)).getSize() + (e.get(i)).getSize());
(e.get(i - 1)).setName("");
(e.get(i - 1)).setFlag(0);
e.remove(i);

}
else if((e.get(i + 1)).getFlag() == 0&&(e.get(i - 1)).getFlag() == 1)   //回收区前一个占用后一个空闲状态时
{

(e.get(i)).setSize((e.get(i+1)).getSize() + (e.get(i)).getSize());
(e.get(i)).setName("");
(e.get(i)).setFlag(0);
e.remove(i + 1);

}
else if((e.get(i + 1)).getFlag() == 0&&(e.get(i - 1)).getFlag() == 0)     //回收区前一个空闲后一个空闲状态时
{
(e.get(i - 1)).setSize((e.get(i - 1)).getSize() + (e.get(i)).getSize() + (e.get(i + 1)).getSize());
(e.get(i - 1)).setName("");
(e.get(i - 1)).setFlag(0);
e.remove(i);
e.remove(i);
}
else if((e.get(i + 1)).getFlag() == 1&&(e.get(i - 1)).getFlag() == 1)     //回收区前一个占用后一个占用状态时
{
(e.get(i)).setName("");
(e.get(i)).setFlag(0);

}
}
else if(i == 0 && (e.get(i + 1)).getFlag() == 1)      //当回收区为链表第一个并且回收区后一个为占用状态时
{
(e.get(i)).setName("");
(e.get(i)).setFlag(0);
}
else if(i == 0 && (e.get(i + 1)).getFlag() == 0)       //当回收区为链表第一个并且回收区后一个为空闲状态时
{
(e.get(i)).setName("");
(e.get(i)).setSize((e.get(i+1)).getSize() + (e.get(i)).getSize());
(e.get(i)).setFlag(0);
e.remove( i+1);
}
else if(i == e.size() - 1 && (e.get(i - 1)).getFlag() == 1)       //当回收区为链表最后一个并且回收区后一个为占用状态时
{
(e.get(i)).setName("");
(e.get(i)).setFlag(0);
}
else if(i == e.size() - 1 && (e.get(i - 1)).getFlag() == 0)         //当回收区为链表最后一个并且回收区后一个为空闲状态时
{
(e.get(i-1)).setName("");
(e.get(i-1)).setSize((e.get(i-1)).getSize() + (e.get(i)).getSize());
(e.get(i)).setFlag(0);
e.remove( i);
}
System.out.println("回收成功!");
break;
}
}
if(i == e.size())
{
System.out.println("回收区名字错误!");
}

}


public static void display()           //显示函数
{
System.out.println("分区号\t作业名\t起始地址\t分区大小\t状态\t");
for(int i = 0; i < e.size(); i++)
{
   System.out.println((i+1)+"\t"+(e.get(i)).getName()+"\t"+(e.get(i)).getStartaddress()+"\t"+(e.get(i)).getSize()+"\t"+(e.get(i)).getFlag());
}
}

public static void menu()         //菜单函数
{
System.out.println("1.分配内存");
System.out.println("2.回收内存");
System.out.println("3.显示分配结果");
System.out.println("4.退出");
System.out.println("请选择要进行的操作:");
}


}


package 动态分区;


import java.util.Scanner;


public class Dong {
public static void main(String[] args)
{
Area b = new Area("",1024,0,0);
Allocation.e.add(b);
Allocation.menu();
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
while(y >= 1 && y <= 4)
{
switch(y)
{
case 1: System.out.println("请输入要分配的内存的名称:");
   Scanner sd = new Scanner(System.in);
   String c = sd.nextLine();
   System.out.println("请输入要分配的内存的大小");
   Scanner sa = new Scanner(System.in);
   int q = sa.nextInt();
   Area a = new Area(c,q);
   Allocation.alloction(a);
   break;
case 2:
System.out.println("请输入要回收的内存的名称:");
   Scanner se = new Scanner(System.in);
   String w = se.nextLine();
   Allocation.Recycle(w);
   break;
case 3:
Allocation.display();
break;
case 4:
System.exit(0);

}
Allocation.menu();
Scanner sf = new Scanner(System.in);
y = sf.nextInt();
}
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值