再来看看这个set。集,或者叫集合。
这个集呢它实际上呢指的是它里面的元素呢是不能重复的。但是呢它不关注这个顺序关系。
所以这个set是个接口,这个接口呢有两个重要的实现,
一个是hashset,一个是treeset。其中呢这个hashset呢它靠的是ha- sh码。
来进行判断的。那么treeset呢它的底层呢是用treemap来实现的, 也就是说,它是用数
这种结构呢来实现的。
其中呢set当中的对象不重复。但这个不重复呢具体来讲呢是这样一个含义。
hashcode要不等。
那么如果hashcode相等了,那么它就会再看equals
或者是双等号是不是为false。所以呢也就是说这个不重复呢
它实际上判断hashcode还判断equals甚至呢用到了双等号,
所以我们在写的时候呢要注意这个hashcode和这个equals呢要 进行匹配。也就是最好是
这两个含义是一样的,就是hashcode相等呢,equals也相等。
啊。我们看看用set的一个例子。
这里set呢我们是String的这个set。等于new了一个hashset。
所以这个set呢是个接口,这个呢我们可以后面 用一个hashset是一个类的名字,用
new 这个对象。当然我们也可以用treeset,
他们是有差别的。不过在这里面呢我们不去关注这个差别。
同样的我们可以往这里集里面呢添加一些对象,比如说巴西,俄罗斯,印度,
中国。啊,南非。然后我们可以用contains来判断 它是true还是false是否是
在这里面。另外呢我们也可以用遍历, 用foreach语句来进行遍历每一个对象。
当然如果我们把一个比如说, 把china这样一个对象来往里加两遍,它实际上呢
最后得到的只有一遍。所以这就是集呀要是重复的元素
往里加的话,它只有得到一个。所以这个是我们说的
这个集的应用。其中呢注意的是我们经常说hash这个问题,比如说
我们用hashtable,啊我们用hashset,后面呢我们还有hashmap等等。
那么这里面都用到了hash,hash呢实际上呢是把我们的一个对象计算出一个整数,
那这个整数呢这里hash那个整数那个算法呢比如说字符串,
他就是把第一个元素,啊,乘以31的n-1次方,
然后呢第二个是31的n-2次方,
一直到最后一个呢是乘31的0次方。所以这样的话我们
把每一个字符然后都参与运算最后得到的那个数呢
那么它很可能呢不一样的,也就不同的字符串就不一样。
所以这样的话我们可以呢根据这样得到一个hash值,
然后呢,比如说往hashtable里面放的时候我们就可以放到不同的位置, 啊,当然如果有重复的呢我们要做一些处理。比如说
用一个列表把它重复的把它放起来。
这就是hash它的一个应用。
hashcode呢我们在用的时候这个hashcode是相当重要的。
另外对于map,map呢它是键值对的一种集合。
所以它里面呢有键有值,还有键值对, 对于它里面我们可以取到hash,
可以得到一个entryset,就是它的相,就是它的键值对,就叫entry一个像,
然后可以得到一个keyset,就是专门是这个 key,就是它的key,那值,键。然后还有
values呢得到它的值。其中呢map.entry是一个嵌套的结构, 是在这个结构里面又定义了一个值接口,又定义了一个接口。
map类的重要实现呢也有两类,一个是hashmap, 一个是treemap。treemap呢它是用树,
用这个红黑树的算法来实现的。
那我们下面看看map的一个应用例子。请看这里。
我们这个map呢它有一个两个stream,也是key的类型。
value的类型呢,也是string,所以它也用到了两个类型参数。
等于 new map。啊。可以用hashmap
也可以用treemap,然后我们可以往里面放key和value的一个关系,比如说这- 个key呢,
是b,然后对应的value是巴西。啊。等等,这个c呢对应的是中国。
等等。如果我们放重复的元素呢 它最后呢就会把原来那个元素给替换掉。如果这个key相同的话。
这种value呢它就会替换原来的。
我们可以用get,用一个key,那我们可以用一个get方法 来得到它的value,我们用keyset呢可以得到一个
所有键值的一个集合,然后呢我们用循环的
取得到它每一个值。那我们也可以直接用value,
value值,当然我们也可以用map.entry,就每一项可以得到它里面。
等等吧。所以这些方法呢都是可以我们甚至可以用iterator这种方法来用。
我们运行一下。