首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表象曝光

表象曝光
EN

Stack Overflow用户
提问于 2013-11-18 17:08:53
回答 3查看 2.3K关注 0票数 1

试图理解什么是表象曝光。你能解释一下吗?

代码语言:javascript
复制
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",但是使用它时,结果是“具有a”。这是否意味着insert方法不会对列表elts做任何事情?我认为s.insert(a)和s.getElts().add(a)都会做同样的事情。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-18 17:12:48

不是的。

使用s.getElts().add(a);ArrayList中将有两个a实例。所以当你移除它的时候,它还有一秒钟。

他们做同样的事情,只是以不同的方式。

代码语言:javascript
复制
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)方法中,您可以控制这种行为。

票数 0
EN

Stack Overflow用户

发布于 2013-11-18 17:23:42

是的,它们是一样的。您可以将a添加两次,并将其添加一次,因此列表中保留了一个删除,因此s.member将返回true!

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

使用Collections.html#unmodifiableList的只读视图(试图更改返回的列表将导致UnsupportedOperationException)

代码语言:javascript
复制
public ArrayList<Character> getElts() {
    return Collections.unmodifiableList(elts);
}

副本:

代码语言:javascript
复制
public ArrayList<Character> getElts() { 
    return new ArrayList<(elts);
}
票数 0
EN

Stack Overflow用户

发布于 2013-11-18 17:36:18

调用List的add函数时,只需添加对现有对象的引用(字符a=新字符(‘X’);)。add函数不创建新的单独实例化。以下两个函数调用将列表中的两个引用添加到同一个实例化对象: s.insert(a);s.getElts().add(a);

在下面的代码中,我将x1和x2引用设置为null之后,仍然有三个对这两个对象的引用。此外,列表中的前两个引用指向同一个对象,而第三个引用没有。以下输出为:3真假

代码语言:javascript
复制
    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)); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20053600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档