黑马程序员技术交流社区

标题: 关于集合的使用总结,求高手,指导,可以这么理解么? [打印本页]

作者: 朝花夕拾    时间: 2012-11-25 18:58
标题: 关于集合的使用总结,求高手,指导,可以这么理解么?
如果你使用的集合要保证元素唯一:Set
  你想排序吗?
   不想:HashSet
   想:TreeSet
  
  不懂:HashSet
如果你使用的集合不用保证元素唯一:List
  你是用于查询吗?ArrayList
  你是用经常改变吗?LinkedList
  有多线程安全问题吗?Vector
  真的不懂:ArrayList
小技巧:
Array:说明底层数据结构是数组,查询快,增删慢
Link:说明底层数据结构是链表,查询慢,增删快
Hash:说明底层数据结构是哈希表,保证元素唯一,要依赖hashCode和equals。
Tree:说明底层数据结构是二叉树,有两种方案保证唯一和排序:
  A:Comparable -- compareTo
  B:Comparator -- compare

作者: 潘天功    时间: 2012-11-25 19:28
List的子实现类
        List
                |--ArrayList
                        底层数据结构是数组,而且是线程不安全的。
                        增删慢,查询快
                |--Vector
                        底层数据结构是数组,而且是线程安全的。
                        增删慢,查询快。但是,又由于线程安全,所以,它是都慢。一般不选择。
                |--LinkedList
                        底层数据结构是链表,而且是线程不安全的。
                        增删快,查询慢

        一般情况下,使用哪种List接口下的实现类呢?
        如果要求增删快,考虑使用LinkedList
        如果要求查询快,考虑使用ArrayList
        如果要求线程安全,考虑使用Vector。

        如果考虑不到任何问题,就使用ArrayList。

Set 元素无序(存储顺序和取出顺序不一致),不可重复。
                |--HashSet
                        底层数据结构是哈希表。线程不安全。
                        如果保证元素的唯一性呢?
                        A:首先根据hashCode值判断。
                        B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
                          如果hashCode值相同,那么,会继续根据equals方法进行判断,
                          根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。

                        一般,用HashSet的时候,要重写hashCode和equals方法。
                        |--LinkedHashSet
                                底层数据结构是链表和哈希表。
                                链表用于保证元素有序,哈希表用于保证元素唯一。
                |--TreeSet
                        底层数据结构是二叉树,线程不安全。
                        如何保证元素的排序呢?两种方式
                        A:让元素本身具备比较性
                                实现Compareable接口中的compareTo方法。
                        B:让集合具备比较性
                                实现Comparator接口中的compare方法。

        以后到底用哪个集合呢?
                 A:如果要元素唯一,就用Set。否则,用List。
                 B:如果元素唯一并且要排序用TreeSet,否则,用HashSet。
                 C:如果元素可重复,且考虑线程问题,用Vector。
                        否则,用ArrayList或者LinkedList。
                        如果要求,增删快,那么,考虑LinkedList。
                        如果要求,查询快,那么,考虑ArrayList。
                 D:当你什么都不清楚的时候,就使用ArrayList。

                  Array:想到数组,就应该想到数组的索引。
                  Link:想到链表,就应该想到增删快。最好能想到addFirst。
                  Hash:想到哈希表,就应该想到元素的hashCode和equals方法。
                  Tree:想到二叉树,就应该想到排序。最好能想到两个接口Compareable和Comparator

这是我上课时我们老师讲的、挺详细的,希望对你有用
作者: 朝花夕拾    时间: 2012-11-25 22:24
潘天功 发表于 2012-11-25 19:28
List的子实现类
        List
                |--ArrayList

谢谢你,跟我理解的差不多!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2