集合collection 下List接口和Set接口

List 和Set 都是属于collection下的子接口。


List 下面有ArrayList ,linkList,vector。实现类

List 不仅实现了collection中的方法还有自己方法。

而Set也只是实现了collection中的方法。


Set 下面有  hashSet,linkHashSet,treeSet


set 是无序的 ,list是有序的,这点只能从存储上来说。

List 中存储 是按数组来存的。所以可以按数组的思维

而Set 存储方法  是用哈希算法的思维设计的。是不能添加重复的。

就是首先按照 所存储的对象(obj)的哈西编码,也就是hashCode();是不是一样,一样的话说明已经添加过了。

不一样的话再按照 equals()方法。比较对象是否相同。相同则不添加。

上述2个添加条件 是并列的,需要都满足!!才能进行添加。

所以如果要添加自定义类的话,需要满足自定义类重写 equals()和hashCode();用jvm自动生成就好。别乱写!特别是hashCode()不然会出事。



而linkList 是链表 list存储的时候是有用指针的。利用指针的话  可以实现添加高效率!只要改变指针指向就行了。


vector 这个实现类 是1.0版本出的。而List是1.2版本出的额。。。 所以说这个实现类太古老了。。弃用!!

hashSet 存储当然也是无序的,遍历的话也是按某种规则遍历的。就像linkHashSet一样遍历是按照指针指向来遍历的。

但需要注意的事后者遍历的事维护了添加顺序的。也就是说先添加先输出。(排除中间插入的情况)。

而hashSet没有先插入先输出这样子。


呐。。treeSet就比较难了。首先他添加的对象必须是同一类型的。!!!不然会报错。

然后他添加的对象类型必须是实现了comparable接口的。

所以要添加自定义类的注意了。必须实现comparable接口,重写compareTo()方法。

举个例子 String 类型他已经是重写了compareTo方法的。这个方法导致了他输出时 是按照字母顺序来输出的。ABCD。。。。这样子。

所以自定义类时 你重写的东西一般是按照某种字段来排列。比如name。这时候name就是String类型的。你还是可以按照String的compareTo来写

比如:return this.name.compareTo(p.name);//p添加的对象。但是要注意到的是 只按一个字段顺序来排列会导致 此字段相同 其他字段不同的数据  添加不进来。被当做重复数据了。所以这里应该要严谨。应该做多重排序。这样才能避免错误。

总的来说:treeSet 要保持 comparable,equals,hashCode  3个方法一致,才能正常添加。。




心得体会。。。



猜你喜欢

转载自blog.csdn.net/alai_programmer/article/details/77727258