14-数据结构-Set

大家好,我是被白菜拱的猪。

笔者的闲言碎语
“书读百遍其义自见”这话真不是忽悠人的,有些话有些事在我们亲身经历过后才会有更加深刻的理解。而平常听来也就“嗯,知道了”一笑代过。在学习第二遍的过程中,我深刻的意识到知识框架的搭建是何等的重要,在学习过程中,脑子中的知识体系能帮助我们更容易记住这节课学了啥,这节课里面包含哪些知识点。像一颗树一样记住枝干,而叶子长什么样我们其实没必要花太多时间。
就比如我们前面讲的List,List分出两个枝干ArrayList和LinkedList。他们的区别是什么,一个是数组线性表,一个是链式线性表。别看名字不一样,但是他们有共同的方法,下面我们记住的就是有哪些常用的方法,既然是存储功能,那就以增删改查为基础。添加add,删除也就是移除remove,修改(替换)set(位置,元素),查询那肯定是先获得元素get()。最后在加一个插入add(位置,元素)。
一个数据结构知识框架里面的List讲完了,那我们来看看集合Set.然后在接着往下分。

set

集合,顾名思义就是把东西放在一起,杂乱无章的,管的不严,连好好的排排队都不用。Set的特点就是无序,唯一,是对整体而言的。(并不是无序,其实里面的元素是按照哈希算法排序的,对于人来来说就是相当于无序,因为平常人并不知道哈希算法是啥)所以Set里面就没有获取某一元素.get()这一方法。要看就得把全部的元素都得输出来,此过程称为遍历
另外set有两个儿子hashset(散列集)和treeset(树列集)。
我们先讲怎么把元素拿出来呢?
1.要把元素装近迭代器Iterator 里面排好队一个一个输出来。迭代器里面有个hasNext方法就是看有没有下一个元素,有就输出来。

Set<String> set1 = new HashSet<String>();
Iterator<String> iter = set1.iterator();
		while (iter.hasNext()) {
			String element = iter.next();
			System.out.println(element);
		}

set1.iterator();是将set的元素装进迭代器里面。
2.元素唯一性
Set是根据元素的地址来判断是否唯一,但是假如是自定义类型的,这时候它就不知如何是好了。因为没创建的一个对象,地址都是不一样的,假如还按照Set自有的判别方法,显然是不行的。

		Student s1 = new Student(1001, "Jerry");
		Student s2 = new Student(1002, "Franklin");
		Student s3 = new Student(1003, "Tom");
		Student s4 = new Student(1001, "Jerry");

在学校中,我们根据学号来区别每一个学生,这里s1和s4学号一样都是1001,显然他们是相同的一个人,而每创建一个对象,计算机为每个对象都分配一个内存空间,不同的地址。Set认为他们是不同的元素,这显然不是我们想要的。
我们得告诉set如何判断元素唯一,假如有一个Student类,自定义类Student的对象是否重复了,由Student自己说的算。
怎么才能告诉Set我们是唯一的呢?
重写hashcode和equals方法
(1)hashCode()
首先先初步判断,也就是给每一个人一个编号。我们看电影有电影票,这是我们进去的凭证,有个这个我们能找到自己的座位,每一个人有属于自己的座位。在进去集合中也是一样。先看看自己的编号去跟已经进去的比一比。假如里面没有你这个编号,你就可以进去。然后里面存在了跟你一样的,这时候就要好好看看你们俩是不是一样的,我们就进入下一个判断方法。
(2)equals()
首先进入这个方法之前,hashCode都是相同的,hashCode只是初步判断。在这个方法里面, 你可以写你的判别方法,根据名字啦,买票是不是今天啦等等,反正你在这里面必须要搞清到底一不一样。返回一个布尔变量,return true 就是一样,这两个是重复的。false不一样,你可以进去。

//为了让对象在集合中有一个判定依据,需要给每一个对象一个编号(票)
	public int hashCode() {
		System.out.println("进入集合的时候自动被调用,当前票是:" + code);
		return code;
	}
	
	public boolean equals(Object obj) {
		//因为进入equals方法的object,已经是hashCode一致了
		Student stu = (Student)obj;
		return name.equals(stu.name);
		/*if (name.equals(stu.name)) {
			return true;
		} else {
			return false;	
		}*/
	}

注意:这两个方法内容都是自定义的,自己想写啥就写啥,总而言之要弄清元素是否唯一。

Set常用方法

(1)size()判断尺寸,也就是有多少个元素
(2)add()添加元素
(3)remove()移除元素
(4)因为是对整体而言,无法获得单一元素,所以没有get()
但可以用contains(元素)判断是否有这个元素
(5)要获得元素必须全部弄出来,这时候用迭代器,一一遍历。

总结

学完之后,要有总结,想一想讲了什么。记住有啥。
唯一:怎么唯一?自定义类型,hashCode和equals方法
无序:然后跟List区别,要拿到元素,必须跟上一个元素有联系,所以没有get()方法。
方法:从增删改查出发,展开联想。
儿子:hashSet和treeSet,日后再讲。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值