看下面的代码:
public class test {
public static void main(String agrc[]){
List<String> a = new ArrayList<String>();
List<String> b = new ArrayList<String>();
a.add("1");
a.add("2");
a.add("3");
a.add("4");
b.add("1");
b.add("3");
a.removeAll(b);
System.out.println(a);
}
}
打印的结果为2,4
再看下面的代码:
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String agrc[]){
List<Student> s1 = new ArrayList<Student>();
List<Student> s2 = new ArrayList<Student>();
s1.add(new Student("张三"));
s1.add(new Student("李四"));
s1.add(new Student("王五"));
s1.add(new Student("许六"));
s2.add(new Student("张三"));
s2.add(new Student("王五"));
s1.removeAll(s2);
System.out.println(s1.size());
}
}
class Student{
String name;
/**
* @param string
*/
public Student(String name) {
this.name = name;
}
}
打印结果为4,为什么removeAll失效了呢?
为什么会这样?难道removeAll方法有问题?
因为在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相等(equals),所以没有执行移除。
为什么会出现不相等的情况,实体类属性明明相同,为什么会不相等?
因为实体类没有Override hashCode和equals方法 !而在执行removeAll方法时是通过equals方法来判断集合元素是否相等的,如果没有Override equals方法,其默认的仍是比较对象,所以会出现上述问题!
归根到底,还是基础没有掌握牢固,同时也给自己提了个醒,写实体类时尽量Override hashCode和equals方法,不这样说不定哪天就会出问题。
下面是重写EQUALS后的结果:
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String agrc[]){
List<Student> s1 = new ArrayList<Student>();
List<Student> s2 = new ArrayList<Student>();
s1.add(new Student("张三"));
s1.add(new Student("李四"));
s1.add(new Student("王五"));
s1.add(new Student("许六"));
s2.add(new Student("张三"));
s2.add(new Student("王五"));
s1.removeAll(s2);
System.out.println(s1.size());
}
}
class Student{
String name;
/**
* @param string
*/
public Student(String name) {
this.name = name;
}
public boolean equals( Object obj){
if (obj == null) return false ;
if (this == obj) {
return true;
}
if (obj instanceof Student){
Student s = (Student) obj;
if(this.name.equals(s.name)){
return true;
}
}
return false;
}
}
结果就为2了
分享到:
相关推荐
但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为它可能会导致性能问题。 1. ArrayList的removeAll方法的实现机制 ArrayList的removeAll方法的实现机制是通过循环遍历ArrayList中的每个元素,然后...
本文将深入探讨`removeAll()`方法的性能效率,以及如何在实际应用中优化其使用。 首先,`removeAll()`方法的实现基于迭代器,这意味着它会遍历列表,每次找到匹配的元素就通过迭代器将其移除。这种方法的优点在于,...
针对这种情况,"win10removeAll.zip"文件提供了一种方法来彻底关闭Windows Defender,以解决性能问题。 首先,我们来了解一下为什么Windows Defender会占用大量的系统资源。Windows Defender在后台运行时,会进行...
5. **使用List类的RemoveAll方法** List类提供了RemoveAll方法,可以删除所有匹配给定条件的元素。这种方法对数组进行操作更为便捷,但请注意,它不是原地修改数组,而是返回一个新的列表。 ```csharp List<int>...
可以使用Remove方法和RemoveAll方法来删除字典对象中的关键字项目对。例如: d.Remove "a" d.RemoveAll VBA字典用法提供了一种灵活和高效的数据存储和管理方法,能够帮助开发者快速地实现复杂的数据处理任务。
<button>Remove all p elements with class 'italic' $(document).ready(function(){ $("button").click(function(){ $("p").remove(".italic"); }); }); ``` 点击按钮后,所有带有"class=italic"的`<p>...
RemoveAll方法的使用: * RemoveAll方法用来从Dictionary对象中删除所有的关键字项目对。 * 语法:object.RemoveAll Keys方法的使用: * Keys方法用来返回Dictionary对象中的所有关键字。 * 语法:object.Keys * ...
remove_dir_all 描述 可靠和快速的目录删除功能。 remove_dir_all在非Windows系统上,这是std::fs::remove_dir_all的重新导出。对于Windows,该方法可处理在快速删除目录树时发生的目录锁定。 remove_dir_contents...
本文将详细讲解如何在jQuery中使用remove()方法来删除指定的子元素,尤其是那些具有特定class属性的元素。 ### jQuery remove()方法简介 remove()方法是jQuery中的一个重要方法,它可以从DOM中删除所有匹配的元素...
此外,C# 6.0引入了`RemoveAll()`方法,它可以一次性移除满足指定条件的所有元素,这样可以简化代码并提高性能: ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; numbers.RemoveAll(n => n % 2 =...
45. **RemoveAll方法** 46. **Show方法** 47. **Skip方法** 48. **SkipLine方法** 49. **WhatsThisMode方法** 50. **Write方法** 51. **WriteBlankLines方法** 52. **WriteLine方法** #### Add方法 **简介:** `Add...
### 解决wget无法使用的方法 在Linux环境中,`wget`是一个非常重要的工具,它用于从网络上下载文件。然而,在某些情况下,用户可能会遇到`wget`无法使用的问题。本文将详细探讨这一问题,并提供一系列解决方案。 #...
示例代码中还包含了初始化和属性获取的方法,如RemoveAll、Count、Capacity、InitialCapacity、CapacityIncrement、以及DefaultPropertyGetItem。这些方法和属性用于管理动态数组的状态和行为。例如,RemoveAll用于...
可以使用RemoveAll()或RemoveChild()方法删除XML文档中的节点,RemoveAll()方法可以删除所有子节点,而RemoveChild()方法可以删除指定的子节点。 更新节点 可以使用ReplaceChild()方法将新节点替换老节点,也可以...
SQL Server 2005 安装注意事项和常见问题解决方法 一、卸载 SQL Server 2005 的注意事项 在卸载 SQL Server 2005 之前,需要停止所有的 SQL 服务,否则可能会出现无法卸载的问题。停止服务的步骤是:Control Panel...
总结来说,本文介绍了Java集合操作中的一种重要方法——removeAll方法,并提供了一个简单的示例代码,演示如何使用removeAll方法从两个集合中提取相同和不同元素。希望本文能够对大家有所帮助。
在C#中,可以使用`Remove()`, `RemoveAt()`, `RemoveAll()`或`Clear()`等方法来删除列表中的元素。 1. `Remove(T item)`:根据指定的元素删除第一个匹配项。 2. `RemoveAt(int index)`:根据索引删除元素。 3. `...
RemoveAll 方法; Skip 方法; SkipLine 方法; Write 方法; WriteBlankLines 方法; WriteLine 方法; 脚本运行时对象; Dictionary 对象; Drive 对象; Drives 集合; File 对象; Files 集合; ...
Collection接口的主要方法包括add、addAll、remove、removeAll、retainAll等。 Iterator模式是Java集合类中的一种遍历模式,用于遍历集合的所有元素。Iterator模式可以把访问逻辑从不同的集合类中抽象出来,从而...