ArrayList和LinkedList
两者的数据结构
ArrayList:动态数组
优点:查询性能更高
LinkedList:双向循环链表
优点:插入和删除元素性能更高
List集合和数组的转换问题:
1. List -->Array
a) toArray() - Object[]
b) toArray(T[]) - T[]
2. Array-->List
a) Arrays.asList(List<T>) - T[]
b) 注意点:
i. 不能对得到的集合进行增删操作
ii. 可以对集合的元素进行修改,而原数组会随之变化
List集合排序:
Collections.sort(List),调用此方法的前提条件,list集合中的元素所属的类必须实现Comparable接口重写其compareTo(..)方法(定义比较规则)
如果一个集合中的元素所属类的比较逻辑已经确定(此类已经实现Comparable接口并重写其方法),现对此集合进行排序,想采用临时的比较规则/自定义的比较规则,此时需要写一个类实现Comparator接口并重写其中的compare(o1,o2),在此方法中定义新的比较规则,之后调用Collections.sort(List,Comparator)来排序,注意点,Comparator的实现类可以采用内部类的方式定义。
HashMap
HashCode():返回的整数有范围
作用:返回一个和地址相关的整数值
注意点:
1. 两个不同对象的hashCode()值可能是相同的
2. 如果两个对象equals结果为true,那么在程序中多次生成的hashcode值一定是相同的
HashMap数据结构的实现:
key—>hashcode()àcode-à散列算法àint(这个值为元素保存在数组中的位置)
1.HashMap内部由数组实现,是当今查询速度最快的数据结构。HashMap根据key元素决定这组键值对应当存放在数组的位置,并且也是根据key元素得到位置来检索数组中的该组键值对以此省去了遍历数组的过程.
2.但是使用HashMap时应当尽量避免出现链表的情况.
HashMap中链表的产生原因:
HashMap是根据key元素的hashcode方法返回的数字经过散列计算得到该组键值对应当存放在数组的哪个位置,而根据key元素equals比较查看当前key是否已经存在于Map中,若存在则直接替换该位置这个key所对应的value,但是若数组该位置已经存在键值对,并且key与当前准备存放的键值对中的key的equals比较不同时,则会在数组当前位置产生链表.这样在将来根据key检索时会出现遍历链表的情况,这样就会降低HashMap查询性能.
总结:当key元素hashcode值相同,但是equals比较不同时就会在HashMap中产生链表,影响查询性能.
如何尽可能的避免出现链表?
重写hashCode和equals方法
保证两个对象equals结果为true,那么此时他们的hashcode值是一样的。
HashSet:HashMap的key的那一列
Map接口的常用实现类:
HashMap
TreeMap:红黑数算法-会自动排序的
Set:TreeSet
有序的Map -- LinkedHashMap
• 使用Map接口的哈希表和链表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于:
LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。
HashMap中元素取出顺序和Put的顺序不一定一样
LinkedHashMap中元素取出顺序和put的顺序一致