Effective Java(Third Edition) item52:慎用重载

冷不防 2022-03-20 10:16 305阅读 0赞
  1. public class SetList {
  2. public static void main(String[] args) {
  3. Set<Integer> set = new TreeSet<>();
  4. List<Integer> list = new ArrayList<>();
  5. for (int i = -3; i < 3; i++) {
  6. set.add(i);
  7. list.add(i);
  8. }
  9. for (int i = 0; i < 3; i++) {
  10. set.remove(i);
  11. list.remove(i);
  12. }
  13. System.out.println(set + " " + list);
  14. }
  15. }

你预期的结果是不是 [-3, -2, -1] [-3, -2, -1] ,但结果却是 [-3, -2, -1] [-2, 0, 2]

道理很简单,set调用的remove方法是

  1. boolean remove(Object o);

而list调用的remove方法为

  1. E remove(int index);

List类中还有一个重载的方法

  1. boolean remove(Object o);

也就是说,调用add的时候是一个对象,而调用remove的时候变为了另一个对象(一个新的对象),所以list的remove操作是这样的:原数组为 [-3, -2, -1, 0, 1, 2],第一次调用remove(0)后变为[-2, -1, 0, 1, 2],第二次会在一个新对象上操作,也就是在[-2, -1, 0, 1, 2]上操作remove(1),结果为[-2, 0, 1, 2],最后一次调用remove(2)同样会在一个新对象([-2, 0, 1, 2])上操作,最后结果为[-2, 0, 2],因为int与Integer调用的是不同的重载的remove方法,导致结果与我们的预期不一致,所以重载要慎用。

tips:上面的代码要想正常运行也很简单,把第二个for循环中的int改为Integer,或者把

  1. list.remove(i);

改为

  1. list.remove((Integer) i);

进而调用正确的重载remove方法,这样,运行结果就是我们预期的那样了。

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读

    相关 方法——重载

    前言: 何为重载,类中两个方法同名,但是参数列表不同,称为重载。注意,是参数列表,不是返回值,实际上同名方法同参数列表,但不同返回值是不允许的。 // 重载示例,重载

    相关 CreateParms重载窗体属性

    窗体和控件的属性CreateParams(这真的是一个属性)很神奇,因为通过它你能够很方便的控制窗体或控件诸如边框、最大化最小化关闭按钮的隐藏、窗体的模式化弹窗模式等的一些特性