HashSet:HashSet是按hash算法来存储集合里的元素,因此有很好的存取和查找性能
当向HashSet插入元素时,HashSet会调用元素的hashCode()方法,得到hashcode值,然后根据hashcode值来确定元素的存储位置。
如果两个元素的equals比较为true,但是他们的hashCode方法返回值不相等,HashSet将会把他们存储在不相同的位置,依然可以添加成功。
如果两个元素的HashCode值相等,但是equals为false,这样他们存储的位置就相同了,则会把两个元素存储在链表中,而HashSet元素的定位是按照元素的hashcode值定位的,所以这样会导致性能下降
简单的是说HashSet判断两个元素是否相等的是equals相等,HashCode相等。
一般来说当equals()相等时,HashCode()也应该相等,要不就与Set集合的规则不符合了
特点:
1.元素可以是null
2.当多个线程同时访问HashSet的时,必须自己用代码去控制同步问题
LinkedHashSet:也是按hashcode的值来觉得存储位置的,但是他使用的链表来维护次序,所以在迭代时,会按照添加的顺序访问集合里的元素
TreeSet(线程不安全):与HashSet不同的时,他不是采用Hashcode确定存储位置,而是采用红黑树来存储集合的元素,他判断的元素是否相等是通过Compareable接口的compareTo返回值判断的,即使元素的equals返回true也没用。
其他的Set集合大家自己查阅
对于非线程安全的Set我可以使用Collections类的synchronizedSortedSet方法,例如:
SortedSet sort=Collection.synchronizedSortedSet(new TreeSet());
List集合是有序和可重复的
当删除时,判断两个元素是否相等的是通过equals()
ArrayList和Vector都是基于数组实现的List类,但是它们在内部维护的是动态,允许再分配的动态数组,内部使用initialCapacity设置数组的长度
当我们向ArrayList和Vector中添加大量的元素时可以考虑用ensureCapacity(int miniCapacity)一次性增加initialCapacity,减少分配的次数,提高性能,默认是10
工具类:Arrays, asList(Object ...a):可以把数组转化为一个List集合,但是这个集合的类型是Arrays.ArrayList,是固定长度的,不可增减
Queue接口集合(队尾进队头出)
|
---——PriorityQueue实现类(不是按照进入的顺序,按顺序出来的)
|
————Deque接口(队列和栈都可以)
|
------ArrayDeque实现类
|
------LinkedList实现类