集合框架(ArrayList去重复)和 (Hashset和Treeset的结构特点)

集合框架

集合框架ArrayList中的重复元素去重及其底层原理
判断list 集合中元素是否相同,原理是arrayList调用Contains()的方法,当调用Contains()方法时会自动调用它的底层equals()的方法,我们要将原有的集合遍历,再将遍历后的元素存放到新的集合中,存放前做一个判断,再重写equals()的方法。

package com.wangshoyang.collection;

import java.util.ArrayList;
import java.util.Iterator;

import sun.net.www.content.text.plain;

public class ListDemo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>(70);

	list.add(new Person("lll",17));
	list.add(new Person("xxxx",19));
	list.add(new Person("dddd",45));
	list.add(new Person("wsy",21));
	list.add(new Person("lll",17));

// System.out.println(list.size());

	ArrayList singleList=singleList(list);
	Iterator it=singleList.iterator();
	while(it.hasNext()) {
		System.out.println(it.next());
	}
}

public String toString() {
	return super.toString();
}

/**
 * 思路
 * 将原有的集合遍历
 *遍历后元素放到新的集合中
 *存放前做一个字符串的判断
 *
 *java.lang.String是不是被重写过?
 * @param list
 * @return
 */

private static ArrayList singleList(ArrayList list) {
	ArrayList newAl=new ArrayList<>();
	Iterator it=list.iterator();
	while(it.hasNext()) {
		Object obj=it.next();
		if(!newAl.contains(obj)) {
			newAl.add(obj);
		}
	}
	return newAl;
}

}
class Person {
private String name;
private int age;

public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}
public Person() {
	super();
}
public boolean equals(Object obj) {
	if(obj instanceof Person) {
		Person p=(Person) obj;
		System.out.println(this.getName()+"equlas" +p.getName());
		return this.getName().equals(p.getName())&&this.getAge()==p.getAge();
	}
	return false;
}
public String toString() {
	return "Person [name="+name+",age="+age+"]";
}

}
这样我们可以看到加入的两个lll只有一个出来了
在这里插入图片描述
Set集合
set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法)。

1、HashSet
HashSet的特点:数据结构是哈希表、元素是无序(存入和取出的顺序不一定一致),字符串元素不可以重复;

探究HashSet判断元素重复问题
原理:利用HashSet调用add方法的同时底层会自动调用HashCode()和equals()方法,重写两个方法,HashCode()比较的是内存地址,equals()比较的是元素内容

package com.wangshoyang.collection.set;
import java.util.HashSet;
import java.util.Iterator;

/**

  • hashset本身具备去重复的功能 那么需要奥探究HashSet为什么能够去重复 它依靠的是啥?
  • @author wsy

*/

public class HashSetDemo {
public static void main(String[] args) {
HashSet hs = new HashSet();

	hs.add(new Person("QAQA",123));
	hs.add(new Person("AAA",13));
	hs.add(new Person("BBB",15));
	hs.add(new Person("QQWQ",88));
	hs.add(new Person("QAQA",123));
	
	Iterator it = hs.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}

}

class Person {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	/**
	 * 返回值代表容器中具体的位置的坐标
	 */
	public int hashCode() {
		return this.getName().hashCode() + this.age;
	}

	public Person() {
		super();
	}

	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			Person p = (Person) obj;
			System.out.println(this.getName() + "equlas" + p.getName());
			return this.getName().equals(p.getName()) && this.getAge() == p.getAge();
		}
		return false;
	}

	public String toString() {
		return "Person1 [name=" + name + ",age=" + age + "]";
}
	public int compareTo(Person o) {
		int num=this.getAge() - o.getAge();
		if(num==0) {
			return this.getName().compareTo(o.getName());
		}
		return num;
	}

}
这样我们就可以得出只有一个QAQA了
在这里插入图片描述
2、集合框架TreeSet
2.1、TreeSet自然排序
TreeSet可以对set集合中元素进行排序,String实现了Comparable接口,所以可以直接进行排序,引用数据类型想要排序,必须实现Comparable接口,其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。注意:排序时,当主要条件相同时,一定要判断次要条件。

TreeSet是SortedSet接口的实现类,TreeSet可以保证了集合元素处于排序状态(所谓排序状态,就是元素按照一定的规则排序,比如升序排列,降序排列)。
与HashSet集合相比。
Comparator comparator():如果TreeSet采用了定制排序,则该方法返回定制排序所使用的Comparator,如果采用了自然排序,则返回null。
Object first(): 返回集合中的第一个元素。
Object last():返回集合中的最后一个元素。
Object lower(Object e):返回集合中位于指定元素e之前的元素(即小于指定元素的最大元素,参考元素e不必是集合中的元素)。
Object higher(Object e): 返回集合中位于指定元素e之后的元素(即大于指定元素的最小元素,参考元素e不必是集合中的元素)。
SortedSet subSet(Object fromElement, Object toElement): 返回集合中所有在fromElemt和toElement之间的元素(包含fromElent本身,不包含toElement本身)。
SortedSet headSet(Object toElement): 返回此set的子集,由小于toElement的元素组成。
SortedSet tailSet(Object fromElement):返回此set的子集,由大于或等于fromElement的元素组成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

听晚风续过晚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值