代表曝光

时间:2013-11-18 17:08:53

标签: java

试图了解表示暴露是什么。 你能解释一下吗?

public class CharSet2 {
   private ArrayList<Character> elts    = new ArrayList<Character>();

   public void insert(Character c) { elts.add(c); }
   public void delete(Character c) { elts.remove(c); }
   public boolean member(Character c) { return elts.contains(c); }
   public ArrayList<Character> getElts() { return elts; }


   public static void main(String[] args) {
      CharSet2 s = new CharSet2();
      Character a = new Character('X');
      s.insert(a);
      //s.getElts().add(a);
      s.delete(a);
      if (s.member(a)) System.out.println("Has a");
      else System.out.println("No a");
   }
}

当s.getElts()。add(a)被注释掉时,结果为“No a”,但是使用它,结果是“Has a”。这是否意味着方法插入对列表elts没有任何作用?我认为s.insert(a)和s.getElts()。add(a)会做同样的事情。

3 个答案:

答案 0 :(得分:0)

没有

使用s.getElts().add(a);a中会有两个ArrayList个实例。所以当你删除它时,它仍然有一秒。

他们确实以不同的方式做同样的事情。


s.insert(a);        // Count of a in list -> 1
s.getElts().add(a); // Count of a in list -> 2
s.delete(a);        // Count of a in list -> 1

CharSet2中的方法有助于封装ArrayList。它们不提供直接访问,但可以修改控制。虽然您直接添加它并通过表示添加它之间不做任何更改,但仍有改变它的空间。

如果你想根据它的哈希码在特定索引处添加元素,那么这将是有用的一个例子。然后,在CharSet#insert(Character)方法中,您可以控制此行为。

答案 1 :(得分:0)

是的,它们是一样的。您将a两次添加remove并将其Collections.html#unmodifiableList添加一次,因此列表中会保留一个a,因此s.member将返回true!

如果您不想公开内部列表,则必须返回列表的只读视图或其副本。

使用{{3}}的只读视图(尝试更改返回的列表将导致UnsupportedOperationException

public ArrayList<Character> getElts() {
    return Collections.unmodifiableList(elts);
}

副本:

public ArrayList<Character> getElts() { 
    return new ArrayList<(elts);
}

答案 2 :(得分:0)

当您调用List的add函数时,您只需添加对现有对象的引用(Character a = new Character('X');)。 add函数不会创建新的单独的instansiation。以下两个函数调用将列表中的两个引用添加到同一个instansiated对象: s.insert(一); 。s.getElts()添加(a)的

在下面的代码中,我展示了即使我将x1和x2引用设置为null,仍然有三个对这两个对象的引用。此外,列表中的前两个引用指向同一个对象,而第三个引用则不指向同一个对象。 输出如下: 3 真正 假

    Character x1 = new Character('1');
    Character x2 = new Character('1');

    List<Character> chars = new ArrayList();
    chars.add(x1);
    chars.add(x1);

    chars.add(x2);

    x1=null;
    x2=null;

    System.out.println(chars.size());
    System.out.println(chars.get(0)==chars.get(1));
    System.out.println(chars.get(0)==chars.get(2));