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;
}
}

解决方案 »

  1.   

    你只是对List外面的一个引用操作,就是改变了那个引用指向的实例,和List里面任何东西都没关系
      

  2.   

    items.set(0,item2);
    得set才行
    原因同一楼
      

  3.   

    是这个问题,看一下java值和引用吧
    这就明白了
      

  4.   

        在提问题之前,用set确实成功了。1楼和楼下的确实有些道理哟!
      

  5.   

    package router;import java.util.ArrayList;/**
     * 
     * 用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();
    }
    }
      

  6.   

    不行的。你要对List集合中的对象进行赋值操作,不能直接给引用的。
    你可以选择把原来的对象删除后再添加新对象,或者直接通过原来对象的set方法将新对象的属性赋值过去。