List与Set的关系和区别

List和Set是用来存放集合的接口,并且二者都继承自接口Collection。

1、 在List中的元素存放是有序的,可以存放重复的元素,检索效率较高,插入删除效率较低。
ArrayList、LinkedList、Vector是List的两个实现类。
ArrayList:
底层的实现就是一个可变数组非同步实现,当数组长度不够用的时候就会重新开辟一个新的数组,然后将原来的数据拷贝到新的数组内。由于这一底层实现,所以ArrayList集合中元素存储的位置是连续的,查询起来效率比较高,插入删除效率较低。
LinkedList:
底层实现是双向循环链表数据结构非同步实现,数据结构如下代码

class Node 
{
  private Node privious;//引用前一个节点
  private Object value;//当前节点的value值
  private Node next;//引用下一个节点的值
}

LinkList中元素存储位置是不连续的,插入删除的执行效率高,查询效率低。
Vector:
Vector作为List的另外一个典型实现类,完全支持List的全部功能,Vector类也封装了一个动态的,允许在分配的Object[]数组,Vector是一个比较古老的集合,JDK1.0就已经存在,建议尽量不要使用这个集合,Vector与ArrayList的主要是区别是,Vector是线程安全的,但是性能比ArrayList要低。

2、 set没有存放顺序不能存放重复元素检索效率较低,插入删除效率较高,由于set集合储存位置是由他的HashCode码决定的,所以他的存储对象必须有equals()方法,而且set遍历只能用迭代,没有下标。
HashSet
底层由哈希表(实际上是一个HashMap实例)支持,不能保证元素的顺序,元素是无序的,可以有null,但是null只能有一个,不能有重复的元素。HashSet不是同步的,需要外部保持线程之间的同步问题。
TreeSet:
TreeSet实现了SortedSet接口,它是一个有序的集合类,TreeSet的底层是通过TreeMap实现的。TreeSet并不是根据插入的顺序来排序,而是根据实际的值的大小来排序。TreeSet也支持两种排序方式:自然排序和自定义排序。不能放入重复元素和null。

猜你喜欢

转载自blog.csdn.net/L_Mcode/article/details/82119083