java 集合是用来存储数量不等的多个对象,并可以实现常用的栈,队列等,还可以保存具有映射关系的关联数组,集合下面分为,set ,list,map
首先set 集合就像一个罐子,多个对象丢进去没有明显的关系,但是有一点set集合不允许重复,set 下面有这么几个实现类 hashSet ,LinkSet ,treeSet,enumSet.
一.hashSet:
特点:
(1)底层使用数据结构的hash算法实现的,因此具有很好的存取,查找的性能。
(2)hashSet是线程不安全,所以它相对于线程安全的更快一些。
(3)hashSet值可以为null。
(4) 不存在顺序
添加值:
重写equals 和 hashcode equals相同时,hashcode一定相同,equals不同时,hashcode不一定不同 存在以下几种情况:
(1)当equals 和 hashcode相同时候,set就会认为这是一个重复的对象,不会被add进去;
(2)当equals 相同 hashcode不同的时候,就会在链表分别不同两个bocket;
(3) 当equals 不同 hashcode相同的时候,就会在链表中的一个位置上面保存了两个对象,这样获取其中一个值性能就会降低了;
所以在add对一个对象的添加要重写equals和hashcode,保证对象不重复性。
取值:
set集合取值类似于数组中索引,数组是根据索引来取值,而set集合是根据hashcode来取值,利用Iterator对象的迭代来进行取值操作,在Iterator 对象迭代的时候,不能进行修改对象里面的值操作,因为iterator只是存储对象,而不是存储值例如:
二,TreeSet:
特点:
(1) 底层使用数据结构红黑树算法进行维护的,因此它的性能相对hashset来说,更差一些,因为它内部会自动进行排序操作。
(2)TreeSet也是线程不安全
(3)排序分为自然排序和定制排序,自然排序是treeset内部会对add进来的值进行自动排序,定制排序可以对排序的条件进行限制。
自然排序:
集合会调用compareTo(Object obj) 来进行大小的比较,可以对值的大小比较,也可以对对象是否相同来进行比较。如果返回0的时候是相等,非0的时候是不相等。
只会对同种类型来进行比较,如果是不同种类型就会报ClassCastException,因为字比较的时候obj就会被强制转换成相同类型,如果不是相同类型就会报错。
实现方式:
实现了Compareable 并重写了int compareTo(Object obj) 要保证eaquals 方法返回true的时候compareTo 也要返回0;这样才能保证,是相同的对象。
注意为了保证程序茁壮性,要保证的添加的对象是不可变的,否侧treeset对里面的值进行修改以后会造成无序状态,和重复状态。
定制排序:
TreeSet内部默认是以升序进行排序,而如果要以降序进行排序的时候可以通过comparator来进行实现,可以通过该接口下面的compare(Object o1,Object o2)来进行比较
实现方式:
可以通过comparator来进行实现,可以通过该接口下面的compare(Object o1,Object o2)来进行比较 例如:
class m{
int count;
public m(int count){
this.count=count;
}
}
public class treesetTest{
public static void main(String[] args){
TreeSet set=new TreeSet(new comparator(){
public int compare(Object o1,Object o2){
M m1=(M)o1;
M m2= (M)o2 ;
return m1.count>m2.count ? 1 :
m1.count<m2.count ? -1 : 0;
}
});
}
}
三、 LinkedHashset
特点:
(1) 底层使用链表来进行维护的;
(2) LinkedHashSet 里面的顺序是值插入的顺序;
(3) 不能有重复的对象;
(4) 插入的时候性能不如hashSet而查询的时候性能会比hashSet更好;
添加值和取值跟hashset一样;
四、 enumset
枚举类型集合
特点:
枚举里面的元素必须全部为枚举元素否侧会报异常,内部是已位向量的形式进行存储,这种形式占用内存小,性能高,对于批量处理来说这种集合会很快;
总结:
如果要插入一个有序的集合建议使用treeSet,因为TreeSet是使用红黑树算法来进行维护,相对性能会比hashSet会慢,而hashSet下面的一个子类linkedhashset对于,删除,插入来说,他的性能会低于hashset,因为,他要保证插入的顺序,而又因为他的底层使用链表来存储的,所以它相对查找来说就更快了。
而enumSet这里面性能最好的一个。
hashset,enumset,treeset都是线程不安全的,所以要保证线程安全,要使用collections下面的syschronizedSet来进行同步操作。