天天看点

《疯狂的JAVA讲义》笔记-第8章集合《疯狂的JAVA讲义》笔记-第8章集合

《疯狂的JAVA讲义》笔记-第8章集合

  • Iterator

    ListIterator

    接口
    • Iterator

      迭代时是将元素的值返回,并不是将元素本身返回,所以迭代时无法更改元素的值。但是可以删除
    • ListIterator

      则拥有增删改查以及向前迭代的功能
  • HashSet

    HashMap

    • 通过Hash算法来确保key 或者元素不能重复的类,一般不要进行更改。因为更改了内容可能会导致错误,如

      equals()

      返回相等以及

      hashCode()

      相同, 取出或删除的时候无法定位。
    • 如果两个元素

      hashCode()

      相等但是

      equals()

      返回

      false

      则需要在一个“桶”里装多个元素,会导致性能的下降。听说JDK8通过红黑树解决了这个麻烦
  • LinkedHashSet

    TreeSet

    • LinkedHashSet

      在使用

      hasCode()

      定位元素的同时,使用链表来维护集合顺序(以插入顺序为序),所以迭代遍历很快,插入稍慢,可满足要求有一定顺序的集合需求
    • TreeSet

      也是有序的,但是是按元素的实际值大小进行排序。
  • EnumSet

    • 占用内存小 ,性能好
    • 要求同一个

      EnumSet

      里都是统一的枚举类。
  • ArrayList

    • 变长的数组,自动扩容
    • 最好在添加大量数据前,使用

      ensureCapacity(int minCapacity)

      方法来避免多次重分配内存。

      initCapacity = 10

  • Map

    性能
    • 尽量不要用

      TreeMap

      ,如果要用,可通过使用

      LinkedHashMap

      并确保插入key-value对时有序即可
    • 一般情况下,使用

      HashMap

      ,小范围内可以使用

      EnumMap

      ,要严格使用

      ==

      的可以使用

      IdentityHashMap

      ,内存吃紧的时候可以使用

      WeakHashMap

    如何保证

    HashMap

    不因扩容而浪费性能,可参照如何保证HashMap不重建Hash表
  • Collecitons

    工具类
    • 返回不可变类的三个方法
      • emptyXxx()

        : 返回一个空的Xxx对象
      • SingletonXxx(Xxx)

        : 返回只有一个对象的不可变对象
      • unmodifiable(xxx)

        : 返回对象的不可变对象
  • 综合
    • 线程不安全的集合,可以通过

      Xxx x = Collections.synchronizedXxx(new Xxx())

      List l = Collections.synchronizedList(new ArrayList())

      来获取线程安全的集合,当然性能会降低。
    • 如果要使用集合,则推荐使用

      HashSet

      ,除非需要根据 元素实际值进行排序才使用

      TreeSet

  • 各种集合的性能对比
    • 底层使用数组为实现的,随机访问性能最好。底层使用链表为实现的,插入删除性能最佳。
    • 迭代则使用链表更快
    • 应用场景
      • 当遍历时,

        LinkedList

        使用迭代器,其他使用随机访问的方式
      • 如果经常需要插入删除,则使用

        LinkedList

        ;如果
        《疯狂的JAVA讲义》笔记-第8章集合《疯狂的JAVA讲义》笔记-第8章集合

END

继续阅读