Set和其常用实现类

Java集合框架详解
本文深入解析Java集合框架中的Set接口及其实现类,包括HashSet、LinkedHashSet和TreeSet的存储特点、排重机制与排序方式,同时探讨了自定义类型在集合中的排重策略。

一Set接口

1Set接口的常用方法:和Collceion一样

2存储特点:相对无序存储,不可以存储相同的元素(排重),不能通过下标访问

 

二Set常用实现类HashSet(HashSet实现了HashMap键的维护)

HashSet特点:相对无序存储,不可以存储相同元素(排重),通过哈希表实现的集合

hashCode()是Object中的方法,每个对象的hashCode值是唯一的,所以可以理解成hashCode值表示这个对象在内存中的位置。

equals()方法是Object类中的方法,表示比较两个对象是否相等,若不重写相当于比较对象的地址,

HashSet中元素排重的原理:在创建一个HashSet集合往里面添加元素时,该集合会自动调用该元素的hashCode()方法,自动比较集合内是否有相同的哈希码(可以理解为地址),如果哈希码相同,集合会自动调用该类的equals()方法,如果equals()判断相等了才确定该元素是重复元素,它会将新添加的元素覆盖掉之前相同的元素。在使用基本类型包装器的时候,hashCode()和equals()已经被重写好了,不用再自己重写。

1在HashSet中添加自定义类型的属性相同元素,会被认为是不同的(hashCode不同,即地址不同),

package afternoon;

import java.util.*;

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

	public static void main(String[] args) {
		HashSet<Person> hash=new HashSet<>();
		Person p1=new Person("AAA",1);
		Person p2=new Person("AAA",1);
		hash.add(p1);
		hash.add(p2);
		for(Person p:hash)
		{
			System.out.println(p.name+" "+p.age);
		}
	}

}

输出:
AAA 1
AAA 1

 

但是一般情况下,我们希望在元素属性相同的情况下认为这是同一个元素(排重),这就要在该类中重写hashCode()方法和equals()方法【两个必须全重写,缺一不可】

其中hashCode返回一个int型变量,一般返回对属性进行运算操作的值,格式为:public int hashCode()

equals相等返回true 不相等返回false,格式为:public boolean  equals(Object o) 参数表必须是Object

package afternoon;

import java.util.*;

class Person
{
	String name;
	int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
/*hashCode方法返回值是int类型,所以重写时需要找到int类型的数据返回,还要保证此方法的返回值与对象的所有属性都相关,所以返回姓名属性的字符串的长度*/
    public int hashCode()
	{
		return name.length()+age;
	}
	
	 public boolean  equals(Object o)
	{
		if(o instanceof Person)//先判断传入的参数对象是否是Person对象,若不是直接返回false
		{
			Person p=(Person)o;//若是,强转成Student对象,并比较属性的值
			if(this.name.equals(p.name)&&this.age==p.age)//若属性的值相同,则返回true
			  return true;
		}
		return false;
	}
}
public class Test {

	public static void main(String[] args) {
		HashSet<Person> hash=new HashSet<Person>();
		Person p1=new Person("AAA",1);
		Person p2=new Person("AAA",1);
		hash.add(p1);
		hash.add(p2);
		for(Person p:hash)
		{
			System.out.println(p.name+" "+p.age);
		}
	}

}

输出:AAA 1

 

注:

obj.instanceof(class)

判断obj这个对象是不是class这种类型,

1.一个对象是本身类的一个对象

2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象

3.所有对象都是Object

4.凡是null有关的都是false  null.instanceof(class)

 

三LinkedHashSet

LinkedHashSet类是具有可预知迭代顺序(相对有序)的Set接口的哈希表和链接列表实现。是HashSet的子类。

存储特点:
    相对有序存储,不可以存储相同元素(排重),通过链表实现的集合(注定相对有序)

LinkedHashSet集合的元素排重与HashSet集合排重方法一致。

 

四TreeSet(排序)集合:TreeSet是TreeMap的键的维护

public class TestA {

	public static void main(String[] args) {
		TreeSet<Integer> t=new TreeSet();
		t.add(3);
		t.add(1);
		t.add(2);
		System.out.println(t);
	}

}

输出:[1, 2, 3]

class MyComparator implements Comparator<Integer>{

	public int compare(Integer o1, Integer o2) {
		return -(o1-o2);
	}
	
}
public class TestA {

	public static void main(String[] args) {
		TreeSet<Integer> t=new TreeSet<Integer>(new MyComparator());
		t.add(3);
		t.add(1);
		t.add(2);
		System.out.println(t);
	}

}

输出:
[3, 2, 1]

五SortedSet接口

TreeSet除了实现了Set接口外,还实现了SortedSet接口

SortedSet接口中常用的方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值