Java之HashSet,Linkedset常用功能以及介绍

之前的博客也谈过 类似的
不过本篇将更为详细的讲述其功能以及使用

HashSet

Set的子类
固然 其有无序 不会有重复值的功能
说到这 为什么HashSet中不会有重复的元素呢?
首先对于java自带的数据类型而言(像String Integer 等) java自身就已经重写了里面的叛变方法
然而对于 自定义的数据类型(也就是自定义的类而言呢)如果不关心其底层方法如何实现的话
那么将会丧失HashSet中独有的排除重复值的功能
那么怎么样去解决自定义类排除重复值的功能 其实很简单
重写自定义类中的hashCode 和euqals方法就行

由于都明白 HashSet的底层是由哈希算法实现的 通过哈希算法每个对象将会返回一个int值
至于怎么算我就不说了。 通过这个int值 就相当于给每个创建的对象一个编号 如果不重写这个int值的话 那么每个对象都会获得不同的编号 而不会比较其内容 所以自然而然 HashSet的去重方法也就没有了 因此需要更改这个int值 然后当对象创建出来的时候(如果是相同的对象就是同一个int值 那么再去比较equals方法 来判断其属性(内容))
当然友好的eclipse为我们提供了重写HashCode和equals的方法(快捷键操作 ctrl+alt+s+h) 这样方便许多
尽管这样 但是对于其原理的理解依然要熟记于心

LinkedHashSet 是HashSet的子类
底层链表实现 功能就是 怎么存怎么取(FIFO) 按照存储的顺序 去取元素
存a,b,c,d 取 a,b,c,d 因此效率比HashSet低一些

实现自定义类去重功能的代码

import java.util.HashSet;

import com.heiam.bean.Person;

public class Demo1_HashSet {

	/**
	 * @param args
	 * Set集合,无索引,不可以重复,无序(存取不一致)
	 */
	public static void main(String[] args) {
		//demo1();
		HashSet<Person> hs = new HashSet<>();
		hs.add(new Person("张三", 23));
		hs.add(new Person("张三", 23));
		hs.add(new Person("李四", 24));
		hs.add(new Person("李四", 24));
		hs.add(new Person("李四", 24));
		hs.add(new Person("李四", 24));
		
		//System.out.println(hs.size());
		System.out.println(hs);
	}

	public static void demo1() {
		HashSet<String> hs = new HashSet<>();					//创建HashSet对象
		boolean b1 = hs.add("a");
		boolean b2 = hs.add("a");								//当向set集合中存储重复元素的时候返回为false
		hs.add("b");
		hs.add("c");
		hs.add("d");
		System.out.println(hs);									//HashSet的继承体系中有重写toString方法
		System.out.println(b1);
		System.out.println(b2);
		
		for (String string : hs) {								//只要能用迭代器迭代的,就可以使用增强for循环遍历
			System.out.println(string);
		}
	}

}

LinkedHashSet使用1 删除集合中的重复元素
其核心思想是
不论是集合还是数组中的元素都是通过添加到LinkedHashSet中来实现重复删除
对于本demo中来说 要对ArrayList去重 那么先将里面的数据添加到LinkedHashSet中
然后在清空旧的ArrayList中的数据 最后在把LinkedHashSet的数据添加到ArrayList中
这样就删除了重复元素
同理对于含重复的数组而言 利用fore 循环把数据快速添加到LinkedHashSet中 然后在
跟之前同样的理论

利用LinkedHashSet去重代码

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

public class Main{
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
		list.add("a");
		list.add("a");
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("b");
		list.add("b");
		getSingle(list);
		for (String string : list) {
			System.out.print(string);
		}
	}

	public static void getSingle(List<String> list) {
			//1,创建一个LinkedHashSet集合
			LinkedHashSet<String> lhs = new LinkedHashSet<>();
			//2,将List集合中所有的元素添加到LinkedHashSet集合
			lhs.addAll(list);
			//3,将list集合中的元素清除
			list.clear();
			//4,将LinkedHashSet集合中的元素添加回List集合中
			list.addAll(lhs);
		}
	
}

LinkedHashSet使用2 删除集合中的重复元素
比较麻烦也就是利用 集合和数组之间的互相转换

关键技术剖析:

实现List、Set和数组之间转换的关键技术点如下:

List转换成数组可以使用List的toArray方法,返回一个Object数组。

Set转换成数组可以使用Set的toArray方法,返回一个Object数组。

如果List或Set中元素的类型都为A,那么可以使用带参数的toArray方法,得到类型为A的数组,具体语句是“(A[])set.toArray(new A[0])”。

数组转换成List可以使用Arrays的asList静态方法,得到一个List。

数组转化成Set时,需要先将数组转化成List再用List构造Set。

博主封装成了一些静态方法 可以直接去用啦

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;

public class Main{
	public static void main(String[] args) {
		String arr[] = {"a","b","c","a","b","c"};
		List<Object> list = arrToList(arr);
		System.out.println(list);
		
		LinkedHashSet<Object> set = arrToSet(arr);
		System.out.println(set);
		
		Object arro1 = listToArr(list);
		for (Object object : list) {
			System.out.print(object);
		}
		System.out.println();
		Object arro2 = setToArr(set);
		for (Object object : set) {
			System.out.print(object);
		}
	}
	
	//数组转list集合
	public static List<Object> arrToList(Object[] arr) {
		List<Object> list = new ArrayList<>();  //父类引用指向子类对象
		list = Arrays.asList(arr);
		return list;
	}
	//数组转set集合
	public static LinkedHashSet<Object> arrToSet(Object[] arr) {
		List<Object> list = new ArrayList<>();  //父类引用指向子类对象
		list = Arrays.asList(arr);
		LinkedHashSet<Object> lhs = new LinkedHashSet<>();
		lhs.addAll(list);     //将list数据全部添加到lhs中
		return lhs;
	}
	//list集合转数组
	public static Object[] listToArr(List<Object> list) {
		Object[] arr = list.toArray();
		return arr;
	}
	//LinkedHashSet集合转数组
	public static Object[] setToArr(LinkedHashSet<Object> list) {
		Object[] arr = list.toArray();
		return arr;
	}
	
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑瞳丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值