Java_集合


Java集合

ArrayList与LinkedList

  • ArrayList:能够自动增长容量的数组,搜索,读取数据的时候效率较高。
  • LinkedList:是一个双向的链表,添加,和删除数据的时候效率较高。

List

  • ArrayList
    • 底层数据结构是数组,线程不安全。
    • ArrayList是基于动态数组实现的,在增删的时候,需要数组的拷贝复制。
    • ArrayList的默认初始化容量是10,每次扩充的时候增加原先容量的一半,也就是原来的1.5倍。
    • 删除元素的时候,不会减少容量,若希望减少容量,则需要调用trimToSize()。
    • 它不是线程安全的,它能存放null值。
  • LinkedList
    • 底层数据结构是链表,线程不安全。
  • Vector
    • 底层数据结构是数组,现场安全。

Map

  • HashMap
    • 在JDK8中,HashMap的底层是:数组+链表(散列表)+红黑树。
    • 在散列表中有装载因子这个属性,当 装载因子*初始化容量 小于散列表元素的时候,该散列表会在散列,扩容2倍。
    • 装载因子默认是0.75。
    • 装载因子过大,可以减少散列表的在散列(扩展),但同时会导致散列表冲突的可能性变大(散列冲突也是耗性能的一个操作,要得操作链表(红黑树))
    • 装载因子过小,可以减少散列冲突的可能,但同时扩容的次数就会变的很大多。
    • 初始容量的默认值是16。
    • 初始量过大,那么遍历的速度就会被影响。
    • 初始量过小,散列在散列(扩容)次数就会变多,扩容也是一件非常耗费性能的一件事。
    • HashMap并不是直接拿key的哈希值来用的,它会将key的哈希值的高16为进行异或操作,这样就使得将元素放入哈希表的时候增加了一定的随机性。
    • 注意:并不是桶上有8位元素的时候它就变成了红黑树,它的同时满足散列表的容量大于64才可以。
  • LinkedHashMap
    • LinkedHashMap底层是散列表和双向链表。
  • TreeMap
    • TreeMap的底层是红黑树。

Set

  • Set
    • 底层就是Map。
  • HashSet
    • 无序,允许为null,底层是HashMap(散列表+红黑树),非线性同步。
  • TreeSet
    • 有序,不允许为null,底层是TreeMap(红黑树),非线性同步。
  • LinkedHashSet
    • 迭代有序,允许为null,底层是HashMap+双向链表,非线性同步。

面试题目

  • Java中HashMap的key值要是为类对象则该类需要满足什么条件?
    • 需要同时重写该类的hashCode()方法和它的equals()方法。
    • 在插入元素的时候是先算出该对象的hashCode。如果hashcode相等话的。那么表明该对象是存储在同一个位置上的。
    • 如果调用equals()方法,两个key相同,则替换元素。
    • 如果调用equals()方法,两个key不相同,则说明该hashCode仅仅是碰巧相同,此时是散列冲突,将新增的元素放在桶子上。
    • 只要两个对象的成员变量的值是相等的,那么我们就认为这两个对象是相等的。
    • 重写了equals()方法,就要重写hashCode()的方法。因为equals()认定了这两个对象相同,而同一个对象调用hashCode()方法时,是应该返回相同的值的!

文章作者: L Q
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 L Q !
  目录