试图了解表示暴露是什么。 你能解释一下吗?
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)会做同样的事情。
答案 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));