java中的容器

java中的容器

  • 数组
  • collection接口
    • list接口
      • ArrayList
      • LinkedList
      • Vector
        • stack
    • list接口实现类的区别
      • ArrayList和Vector是基于数组实现的,但是ArrayList是不同步的,即线程不安全,所以效率低,而Vector是同步的,线程安全的,所以效率高
      • LinkedList基于链表实现
    • set接口
      • HashSet
        • HashSet基层就是一个hashMap,其中值为Map的key,Map的value是一个Obejct对象,所以Set是不能重复的。
      • SortedSet接口
        • TreeSet
          • TreeSet底层基于TreeMap实现,内部维持了一个简化版的TreeMap,通过key来存储Set的元素,TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
    • list和set的区别:
      • list基于数组,所以是有序可重复的
      • set基于map,且值为map的key,所以是无序不可重复的
  • map接口
    • HashMap
      • 底层是hash表,基于数组+链表的形式实现的,基本组成单位是Entry

        java中的容器

      • 通过对key的hash值取余,得到数组的索引,然后通过对值的equals方法得到的结果进行比较,如果结果相同,那么新的结果取代旧的结果,如果结果不同,依次向后比较,一致没有重复,那么就会把当前的Entry挂在链表的最后。其中jdk1.8之后,当一个链表长度大于8后,底层基于红黑树实现。结构如图:

        java中的容器

    • SoredMap接口
      • TreeMap
        • 是一个有序的集合,按照自然序或者指定的比较器排序(重写compactor方法),底层基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序。不允许使用null键或者null值
    • HashTable
      • HashTable的原理和HashMap相似,但是是线程安全的
      • Properties
    • 三者之间的区别
      • HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样,或者可以使用Collections的synchronizedMap方法使HashMap具有同步的能力。
      • HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。
      • HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
      • HashTable使用Enumeration,HashMap使用Iterator。
      • HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
      • 哈希值的使用不同,HashTable直接使用对象的hashCode。
      • TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
  • 容器相关
    • Iterator接口
      •  iterator是一个迭代器,有三个方法 hasnext,next,iterator方法,通过iterator方法能够获得一个迭代器对象,通过hasnext方法判断是否有下一个对象存在,通过next方法调整游标,指向下一个对象
      • collection接口实现了iterator接口,所以可以直接通过 iterator方法获取到迭代器对象 collection接口实现了iterator接口,所以可以直接通过 iterator方法获取到迭代器对象
      • 如果对于集合中的元素需要一边遍历一边删除的情况,考虑通过迭代器进行处理
      • 通过迭代器遍历map的时候,需要entryset得到set,然后遍历set或者通过keyset方法,获取到key的集合,通过遍历key。获得值
      • ListIterator接口
    • Collections工具类
      • java中的容器

    • Enumeration接口
    • java中的容器