List和Set的区别:
List存放有序的,可重复的元素。List中元素的存放顺序是按元素的插入时间一次往后排列来的。
Set存放无序的,不可重复的元素(前提是如果添加的元素是早定义的类的话那必须得重写hashCode()和equals()方法)。Set中元素的存放顺序与元素的插入时间无关,是根据元素的hashCode值来排列的。如果hashcode值一样,则判断值是否相等,相等则不存,不相等则存进来。
如果不重写hashCode()和equals(),那会出现相同的元素可能都会存进来,例:
如果重写hashCode()和equals(),那就不会出现相同的元素存进来,例:
ArrayList和LinkList的区别:
ArrayList的内存结构是数组,这个数组的初始是10位的,插入的时候如果超过10位就将位数扩大到原来的2.5倍,依次类推。如果是add()的话会插入到最后一位,效率还是挺高的,但是如果这种add(i,b)方式将元素插入到特定的位置,那这个位置之后的元素将都会重新排序,效率低下。同样删除其中某一个元素时候,删除元素后面的元素也需要重新分组,效率低下。但是查询效率高,直接通过下角标找到对应的值即可。
LinkedList使用了循环双向链表数据结构,LinkedList链表由一系列表项连接而成,如图:
对于LinkedList而言,在插入元素到任何位置,以及删除都是一样的,只需要把这个元素已经这个元素的连接删除掉就可以。但是查询效率低,因为每次取一个值的时候会先判断这个值在前一半还是后一半,每次取值都会将这个值前面的所有值都查一遍。
总结:
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
HashSet与LinkedHashSet区别:
HashSet是按传入值的hashCode值由大到小的顺序去遍历的,与增加的顺序无关。
LinkedHashSet遍历的时候虽然是按增加的顺序依次遍历的,但是它存储的时候依然是按hashCode值去存储的。
总结:
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1. 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定