package router;import java.util.ArrayList;public class Test { public static void main(String[] args) {
ArrayList<RouterItem2> items = new ArrayList<RouterItem2>();
items.add(new RouterItem2());
RouterItem2 item = items.get(0);
item.setDestination("111"); // 改变了items.get(0)的值
System.out.println(items.get(0).getDestination()); RouterItem2 item2 = new RouterItem2("sdfsf", 1, "Sd"); // 没有改变items.get(0)的值 为什么呢?2次输出都是"111"
item = item2;
System.out.println(items.get(0).getDestination()); }
}/**
* 路由表中的一项,只抽象出了3个属性,其余的暂不考虑
*/
class RouterItem2 {
private String destination;// 目的网络 private int distance;// 距离 private String nextRouter;// 下一条路由器 public RouterItem2() {
destination = "";
distance = 16;
nextRouter = "";
} public RouterItem2(String dest, int dis, String next) {
destination = dest;
distance = dis;
nextRouter = next;
} public void setDistance(int distance) {
this.distance = distance;
} public String getDestination() {
return destination;
} public int getDistance() {
return distance;
} public String getNextRouter() {
return nextRouter;
} public void setDestination(String destination) {
this.destination = destination;
} public void setNextRouter(String nextRouter) {
this.nextRouter = nextRouter;
}
}
ArrayList<RouterItem2> items = new ArrayList<RouterItem2>();
items.add(new RouterItem2());
RouterItem2 item = items.get(0);
item.setDestination("111"); // 改变了items.get(0)的值
System.out.println(items.get(0).getDestination()); RouterItem2 item2 = new RouterItem2("sdfsf", 1, "Sd"); // 没有改变items.get(0)的值 为什么呢?2次输出都是"111"
item = item2;
System.out.println(items.get(0).getDestination()); }
}/**
* 路由表中的一项,只抽象出了3个属性,其余的暂不考虑
*/
class RouterItem2 {
private String destination;// 目的网络 private int distance;// 距离 private String nextRouter;// 下一条路由器 public RouterItem2() {
destination = "";
distance = 16;
nextRouter = "";
} public RouterItem2(String dest, int dis, String next) {
destination = dest;
distance = dis;
nextRouter = next;
} public void setDistance(int distance) {
this.distance = distance;
} public String getDestination() {
return destination;
} public int getDistance() {
return distance;
} public String getNextRouter() {
return nextRouter;
} public void setDestination(String destination) {
this.destination = destination;
} public void setNextRouter(String nextRouter) {
this.nextRouter = nextRouter;
}
}
得set才行
原因同一楼
这就明白了
*
* 用Java语言模拟路由更新算法
*
* @author 雷文
*
* @date 2010/11/29
*
*/
public class Router { private ArrayList<RouterItem> items; public Router() {
items = new ArrayList<RouterItem>();
} /**
* 向路由表的末尾添加一项
*
* @param item
*/
public void addItem(RouterItem item) {
items.add(item);
} /**
* 向路由表的末尾添加多项
*
* @param items
*/
public void addItems(RouterItem[] items) {
for (int i = 0; i < items.length; i++) {
addItem(items[i]);
}
} /**
*
* @param otherItems
* 相邻路由器发来的路由更新信息
* @param sender
* 发送路由更新信息的路由器的名字
*/
public void update(RouterItem[] updateItems, String sender) {
if (updateItems == null) {
return;// 更新信息为null,直接返回
} // 打印相邻路由器发来的信息
System.out.println(sender + "路由器发来的路由信息");
printUpdateItem(updateItems); // 相邻路由器更新项的个数
int size = updateItems.length; // 2重循环,路由更新算法
for (int i = 0; i < size; i++) {
RouterItem updateItem = updateItems[i]; // 距离+1,下一跳路由器改为Sender(发送更新信息的路由器)
updateItem.setDistance(updateItem.getDistance() + 1);
updateItem.setNextRouter(sender); // 先修改下一跳路由器和距离再获取
int updateDistance = updateItem.getDistance();
String updateDest = updateItem.getDestination();
String updateRouter = updateItem.getNextRouter(); int n = items.size();
// 路由表中是否有updateDest的目的网络,默认没有
boolean hasDest = false;
for (int j = 0; j < n; j++) {
RouterItem item = items.get(j);
String dest = item.getDestination();
String router = item.getNextRouter();
int dis = item.getDistance();
if (dest.equals(updateDest)) {
hasDest = true;// 路由表有目的网络dest
// System.out.println("路由表有目的网络dest" + dest);
if (router.equals(updateRouter)) {
// 为什么要替换呢?因为这是最新的消息,要以最新的消息为准
// item = updateItem;此行代码有问题。疑问,引用类型直接赋值
items.set(j, updateItem);
} else {
// 目的网络相同,但下一跳路由器不同,比较距离
if (updateDistance < dis) {
item = updateItem;
/*
* System.out.println("路由表有目的网络dest 距离更小" +
* updateItem.getDestination());
*/
items.set(j, updateItem);
}
} }
}
if (!hasDest) {
addItem(updateItem);
}
} } /**
* 打印路由表中的信息
*
*/
public void print() {
System.out.println("目的网络\t距离\t下一跳路由器");
for (int i = 0; i < items.size(); i++) {
RouterItem item = items.get(i);
if (item != null) {
System.out.println(item.getDestination() + "\t"
+ item.getDistance() + "\t" + item.getNextRouter()); } }
} /**
* 打印相邻路由器发来的路由信息
*
* @param items
*/
public void printUpdateItem(RouterItem[] items) {
System.out.println("目的网络\t距离\t下一跳路由器");
for (int i = 0; i < items.length; i++) {
RouterItem item = items[i];
if (item != null) {
System.out.println(item.getDestination() + "\t"
+ item.getDistance() + "\t" + item.getNextRouter()); } }
} /**
* @param args
*/
public static void main(String[] args) {
// 测试1
Router router = new Router();
RouterItem[] items = { new RouterItem("Net2", 3, "R4"),
new RouterItem("Net3", 4, "R5") }; router.addItems(items);
System.out.println("更新之前的路由表:");
router.print(); RouterItem[] updateItems = { new RouterItem("Net1", 3, "R1"),
new RouterItem("Net2", 4, "R2"),
new RouterItem("Net3", 1, "直接交付") };
router.update(updateItems, "R4");
System.out.println("更新之后的路由表:");
router.print();
System.out.println(); // 测试2
Router router2 = new Router();
RouterItem[] items2 = { new RouterItem("N1", 7, "A"),
new RouterItem("N2", 2, "C"), new RouterItem("N6", 8, "F"),
new RouterItem("N8", 4, "E"), new RouterItem("N9", 4, "F") }; router2.addItems(items2);
System.out.println("更新之前的路由表2:");
router2.print(); RouterItem[] updateItems2 = { new RouterItem("N2", 4, ""),
new RouterItem("N3", 8, ""), new RouterItem("N6", 4, ""),
new RouterItem("N8", 3, ""), new RouterItem("N9", 5, "") };
router2.update(updateItems2, "C");
System.out.println("更新之后的路由表2:");
router2.print();
}
}
你可以选择把原来的对象删除后再添加新对象,或者直接通过原来对象的set方法将新对象的属性赋值过去。