Collection中的List接口和Set接口
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来决定
