ArrayList去重

                  一.为什么要去重?,去重原理

1.为什么要进行去重

在使用集合框架时,我们经常需要对一个集合中的元素进行去重操作。去重操作可以使集合中不同的元素呈现出来,去掉重复元素,从而降低程序开销和提高计算效率。在实际项目中,我们可能会遇到需要对一些大数据量的集合进行去重操作,如果不进行去重操作,可能会严重影响程序的性能和运行效率。

对于ArrayList集合来说,虽然其允许存储重复元素,但是在某些业务场景下,我们需要保证元素不重复。因此,当我们需要对ArrayList集合中的元素进行去重时,就需要进行底层的去重操作。

在底层去重操作中,我们可以使用集合框架提供的HashSet类对ArrayList中的元素进行去重。它的底层实现是基于哈希表的,当我们将ArrayList中的元素添加到HashSet中时,HashSet会自动去重元素,从而实现ArrayList集合的去重。使用HashSet对ArrayList进行底层去重操作不仅性能高效,而且代码简洁

在进行去重时我们还可以通过equals方法方法的返回值来进行操作,并且因此来去除集合中的重复元素,当然小编还是更推荐使用HashSet对ArrayList进行元素去重

除此之外,在集合中进行去重操作还可以帮助提高程序的质量和可维护性。当我们需要基于某个字段进行去重操作时,我们可以将该字段作为元素的属性,并在equals和hashCode方法中使用该属性进行比较,这样可以提高程序的可读性和可维护性。

2.去重原理

在ArrayList中,如果我们需要对元素进行去重,需要注意元素类型是否正确重写了hashCode和equals方法。根据集合框架中的规定,如果两个元素的equals方法返回true,则它们的hashCode值必须相等。因此,正确重写equals方法是确保元素能够正确去重的关键。

在Java中,equals方法是用来比较两个对象是否相等的方法。当我们需要比较自定义对象时,需要重写equals方法,以便让其能够正确地比较两个对象是否相等。通常我们只需要重写equals方法,而不需要重写hashCode方法,因为在使用集合框架时,hashCode方法一般会被自动调用。

在重写equals方法时,我们需要遵循以下几个原则:

1. 自反性:对于任何非空引用x,x.equals(x)应该返回true。
2. 对称性:对于任何非空引用x和y,如果x.equals(y)返回true,则y.equals(x)也应该返回true。
3. 传递性:对于任何非空引用x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,则x.equals(z)也应该返回true。
4. 一致性:对于任何非空引用x和y,连续多次调用x.equals(y)应该返回相同的结果。
5. 非空性:对于任何非空引用x,x.equals(null)应该返回false。

对于ArrayList来说,在去重时会先调用元素的equals方法判断两个元素是否相等,如果equals方法返回true,则判断这两个元素是重复的,只保留其中的一个副本。如果equals方法返回false,则认为这两个元素是不同的,不会进行去重操作。

需要注意的是,当我们使用ArrayList进行去重时,元素的equals方法的实现方式对去重结果有很大的影响。因此,在实现自定义对象的equals方法时,我们需要基于具体的业务场景来实现,以确保元素能够正确地去重。

                                 二.实例

1.字符串去重

1.1代码截屏:

 1.2代码效果图

 1.3源码:

package com.lz.list;

import java.util.ArrayList;
import java.util.List;

public class demo4 {
	public static void main(String[] args) {
		/**
		 * 字符串去重
		 */
		 List list = new ArrayList<>();
        list.add("q");
        list.add("f");
        list.add("h");
        System.out.println("当前原素:" + list);
        if (!list.contains("h")) {
            list.add("h");
        }
        System.out.println("现在原素:" + list);
}
}

2.对象去重

2.1代码截屏:

 

 

2.2代码效果图:

 2.3源码:

package com.lz.list;

import java.util.ArrayList;
import java.util.List;

public class demo7 {
	public static void main(String[] args) {	
	/**
	 * 对象去重
	 */
		List list = new ArrayList<>();
		list.add(new  stu("多久哦"));
		list.add(new  stu("山东积分"));
		list.add(new  stu("速度放缓"));
		System.out.println("当前原素:" + list);
		if (!list.contains(new  stu("多久哦"))) {
			list.add(new  stu("多久哦"));
		}
		System.out.println("现在原素:" + list);	
		
	}
}
//创建一个对象
class  stu{ 
	private   String  name;
public stu() {
	// TODO Auto-generated constructor stub
}
	
	/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
//调用get set方法
@Override
public String toString() {
	return "stu [name=" + name + "]";
}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public stu(String name) {
		super();
		this.name = name;
	}
	//创建    equals方法
	@Override
	public boolean equals(Object obj) {
		//为什么 会这样原因是    equals方法返回值相关
		System.out.println("送积分");
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		stu other = (stu) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默o。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值