对java set集合的理解与学习

来源:互联网 发布:windows latex 配置 编辑:程序博客网 时间:2024/05/22 13:49

    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来进行同步操作。

             

                   

                     

                          

                   

                

                  

        

      

       

1 0
原创粉丝点击