试图理解什么是表象曝光。你能解释一下吗?
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)都会做同样的事情。
发布于 2013-11-18 17:12:48
不是的。
使用s.getElts().add(a);,ArrayList中将有两个a实例。所以当你移除它的时候,它还有一秒钟。
他们做同样的事情,只是以不同的方式。
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 -> 1CharSet2中的方法有助于封装ArrayList。它们不提供直接访问,但可以修改控制。虽然在直接添加它和通过表示添加它之间没有进行任何更改,但仍有更改的余地。
如果您想要以特定索引的哈希代码为基础添加元素,这将是什么时候有用的例子。然后,在CharSet#insert(Character)方法中,您可以控制这种行为。
发布于 2013-11-18 17:23:42
是的,它们是一样的。您可以将a添加两次,并将其添加一次,因此列表中保留了一个删除,因此s.member将返回true!
如果不想公开内部列表,则必须返回列表的只读视图或其副本。
使用Collections.html#unmodifiableList的只读视图(试图更改返回的列表将导致UnsupportedOperationException)
public ArrayList<Character> getElts() {
return Collections.unmodifiableList(elts);
}副本:
public ArrayList<Character> getElts() {
return new ArrayList<(elts);
}发布于 2013-11-18 17:36:18
调用List的add函数时,只需添加对现有对象的引用(字符a=新字符(‘X’);)。add函数不创建新的单独实例化。以下两个函数调用将列表中的两个引用添加到同一个实例化对象: s.insert(a);s.getElts().add(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)); https://stackoverflow.com/questions/20053600
复制相似问题