Java retainAll()不起作用?

JCh*_*ris 1 java arraylist

假设我有两个Arraylists.

    a.add("Isabella");
    a.add("Angelina");
    a.add("Pille");
    a.add("Hazem");

    b.add("Isabella");
    b.add("Angelina");
    b.add("Bianca");

    a.retainAll(b);
Run Code Online (Sandbox Code Playgroud)

这应该给我Arraylist a以下元素:Isabella, Angelina, Pille, Hazem.但是,当我尝试时,a.size()我得到0.为什么?

我的输出:

[DEBUG] The Karate Kid
[DEBUG] The Day the Earth Stood Still
[DEBUG] The Pursuit of Happyness
[DEBUG] Justin Bieber: Never Say Never
[DEBUG] After Earth

[DEBUG] Independence Day
[DEBUG] Men in Black
[DEBUG] Men in Black II
[DEBUG] Hancock
[DEBUG] Shark Tale
[DEBUG] Made in America
[DEBUG] Six Degrees of Separation
[DEBUG] Jersey Girl
[DEBUG] The Legend of Bagger Vance
[DEBUG] Men in Black 3
[DEBUG] Seven Pounds
[DEBUG] Bad Boys II
[DEBUG] Bad Boys 3
[DEBUG] Enemy of the State
[DEBUG] Wild Wild West
[DEBUG] Hitch
[DEBUG] Ali
[DEBUG] I, Robot
[DEBUG] Live 8
[DEBUG] Where The Day Takes You
[DEBUG] Independence Day 3
[DEBUG] I, Robot 2
[DEBUG] The Pursuit of Happyness
[DEBUG] I Am Legend
[DEBUG] Independence Day 2
[DEBUG] After Earth
[DEBUG] Bad Boys
[DEBUG] Partners in Time: The Making of MIB 3
[DEBUG] David Blaine: Real or Magic

[DEBUG] Size: 0
Run Code Online (Sandbox Code Playgroud)

第一部分是由杰登史密斯主演的电影,第二部分是由威尔史密斯主演的电影,我只想要同时拥有这两部影片的电影.是retainAll()这种工作的最佳方法是什么?

MAV*_*MAV 7

我怀疑你是在列表中存储自己类的实例,而不是字符串.

retainAll使用该equals方法比较内容.如果要存储自己类的实例,并且该类不重写equals,则会比较引用.由于两个列表中没有相同的实例(而是包含相同值的不同实例),因此它将从第一个列表中删除所有电影.

您可以通过equals在班级中实施来防止这种情况.要做到这一点,你可以看看这个答案.