黑马程序员-----------------集合框架-Set

android培训java培训、期待与您交流!

Set集合

Set集合的功能跟Collection功能是一直的。在Set集合中元素是无序的,存入和取出的顺序不一定一致,元素不可以有重复。

Set集合中主要的子类:HashSet、TreeSet

HashSet类

HashSet类是实现Set接口的类,它是利用哈希表算法来进行改进执行的效率,很有效的提升了增、删、改、查元素的操作速度。由于它里面的元素是无序的,因此在获取元素的时候得到得结果并不一定跟存入时候的顺序一致。另外,HashSet对象里面的元素是唯一存在的,若是另一个相同元素假如到HashSet对象时,该集合的元素个数不会增加。


package com.leo.blog;

import java.util.*;

public class HashSetDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建集合对象
		HashSet hs = new HashSet();
		//添加元素
		hs.add("Cat");
		hs.add("Dog");
		hs.add("Rabbit");
		hs.add("Dog");
		System.out.println(hs.size());//3
		System.out.println(hs.isEmpty());//false
		System.out.println(hs.contains("Dog"));//true
		hs.remove("Dog");//移出Dog元素
		System.out.println(hs);//[Cat, Rabbit]
		hs.clear();//清除所有元素
		System.out.println(hs);//[]
	}

}


要使用HashSet集合需要通过声明创建HashSet集合对象,来进行对数据的增删改查操作,从代码中可以看到,添加了四个元素其中两个是Dog打印集合长度的时候是3,这里就体现出了在HashSet集合中元素的唯一性。

HashSet如何保证其中值是否唯一的原理:判断元素的hashCod值是否相同,如果相同,继续判断元素的equals方法是否为true。

package com.leo.blog;

import java.util.HashSet;
class Animals
{
	private String name;
	private int age;
	Animals(String name,int age)
	{
		this.age = age;
		this.name  = name;
	}
	public int hashCode()
	{
		return name.hashCode()+age;
	}
	public boolean equals(Object obj)
	{
		if(obj instanceof Human)
				return false;
		Animals as = (Animals) obj;
		return this.name.equals(as.name)&&this.age==as.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 class HashSetDemo1 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建集合对象
		HashSet hs = new HashSet();
		//添加元素
		hs.add(new Animals("Dog",4));
		hs.add(new Animals("Rabbit",5));
		hs.add(new Animals("Cat",1));
		//hs.add(new Animals("Dog",2));
		
		System.out.println(hs.contains(new Animals("Dog",4)));//true
	}
}

如果把Animals类中的hashCode方法给去掉打印的结果是false,这里可以看出要比较HashSet中的元素是先获取哈希值判断是否相同,在进行元素比较。

TreeSet类:TreeSet并不是直接实现的Set接口而是实现的SortedSet接口,TreeSet集合里的每个元素类型必须是相同的,而且元素值会依照由小到大的规则排列。TreeSet底层采用的二叉树结构形式,保证元素唯一性的的是通过compareTo方法的返回值。

TreeSet集合中的一些特有的方法:

package com.leo.blog;
import java.util.*;
public class TreeSetDemo1 {

	public static void main(String[] args) {
		//创建集合对象
		TreeSet ts = new TreeSet();
		//添加元素
		ts.add(50);
		ts.add(25);
		ts.add(45);
		ts.add(30);
		//打印结果:集合是一个有序的集合
		System.out.println(ts);//[25, 30, 45, 50]
		System.out.println(ts.size());//获取集合长度:4
		
		System.out.println(ts.first());//获取集合中第一个元素:25
		System.out.println(ts.last());//获取最后一个元素:50
		System.out.println(ts.subSet(10, 30));//获取某个范围集合中的元素:25
		System.out.println(ts.tailSet(30));//获取大于等于30集合中元素:[30, 45, 50]
		System.out.println(ts.headSet(45));//获取小于等于45集合中的元素
	}
}

从执行的结果可以看出,不管元素添加到TreeSet集合中元素的次序是怎样的,在集合中元素的存储是按照由小到大的顺序自动存放的。

TreeSet集合存放自定义对象:

按照学生的年龄对集合元素进行排序。当向TreeSet集合中添加自定义对象元素时,添加第二个的时候会出现强制类型转换错误的提示,

这是因为TreeSet集合不能直接对自定义的对象进行排序,这时就需要实现Comparable接口覆盖其中的compareTo方法对自定义对象的

内容进行排序。

package com.leo.blog;

import java.util.*;

class Student implements Comparable
{
	private String name;
	private int age;
	Student(String name,int age)
	{	
		this.name = name;
		this.age = 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 int compareTo(Object obj)
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;
		if(this.age>s.age)
			return 1;
		if(this.age == s.age)
			return 0;
		return -1;
	}	
}
public class TreeSetDemo {

	
	public static void main(String[] args) {
		//创建集合对象
		TreeSet ts = new TreeSet();
		//添加元素
		ts.add(new Student("LEO",25));
		ts.add(new Student("LAY",24));
		ts.add(new Student("KOBE",35));
		ts.add(new Student("BOBO",23));
		//Student stu = (Student);
		//System.out.println();
		Iterator it = ts.iterator();
		//循环打印结果
		while(it.hasNext())
		{
			Student stu = (Student)it.next();
			System.out.println(stu.getName()+"-----"+stu.getAge());
		}
	}

}
结果:

BOBO-----23
LAY-----24
LEO-----25
KOBE-----35

从结果可以看出自定义对象按照年龄进行了排序,不够这样有一个弊端比较局限,假若需要在存入一个元素

ts.add(new Student("WU",23));
这个元素就不会进入到集合中,以为TreeSet集合中已经存在了一个年龄为23的元素,这时就需要增加另外一个排序方式,让集合自身具备比较性

if(this.age == s.age)
	return 0;
需要将此处修改一下

if(this.age == s.age)
	return this.name.compareTo(s.name);



小结:

1.Tree集合中的元素是不能重复出现,所有元素都具有唯一性。

2.HashSet类实现Set接口,采用的是哈希表的算法来改进了执行效率,有效地提升了增删改查的效率。

3.TreeSet排序的两种方式:

3.1.让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。

3.2.当元素自身不具备比较性时,或者具备比较性不满足需求是,这时就需要让集合自身具备比较性。在集合初始化的时候,就有比较方式。

当两种排序都存在时会以比较集合容器为主。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值