java 核心技术卷1——关于集合的笔记
循环数组比链表更高效(做查询),所以多使用循环数组。
什么时候使用链表:循环数组是一个有界组合,如果程序中要收集的对象数量没有上限,就最好用链表来实现,链表擅长在中间删除或插入对象
------------------------------------------------------------------------------------------------------------------------------
ArrayList 和LinkedList区别
ArrayList实现了List接口,它是以数组的方式来实现的,数组的特性是可以使用索引的方式来快速定位对象的位置,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好.
LinkedList是采用链表的方式来实现List接口的,它本身有自己特定的方法,如: addFirst(),addLast(),getFirst(),removeFirst()等. 由于是采用链表实现的,因此在进行insert和remove动作时在效率上要比ArrayList要好得多!适合用来实现Stack(堆栈)与Queue(队列)。
Java类库中,存在了很多理论上存在一定争议的方法,链表不支持快速随机访问,但是LinkedList类还是提供了get方法:
List<Test> list = new LinkedList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
String l2 = list.get(2);
这种写法尽量不要用,因为要查找链表的第n个元素,必须从头开始,越过n-1个元素。效率是很低的。LinkedList对象根本不做任何缓存位置信息的操作。
get方法做了微小的变化,如果索引大于size/2,则从尾端开始搜索元素。
知识提示: LinkedList的特有方法(本身定义的方法)如:addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等
在删除可插入对象的动作时,为什么ArrayList的效率会比较低呢?
解析: 因为ArrayList是使用数组实现的,若要从数组中删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,所以速度上就会比LinkedList要慢许多. 相反,LinkedList是使用链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用即可!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java.util.Collection<E>
//集合中容易忽略的方法
//检查集合中是否包含指定对象:
boolean contains(Object obj) //如果集合包含了一个和obj相等的对象,返回true
//检查一个集合是否包含了另一个集合的所有元素:
boolean containsAll(Collection<?> other) //如果集合包含了这个集合中的所有元素,返回true
//获取一个集合中与另一个集合相同的元素
boolean retainAll(Collection<?> other) //留下与集合other中相同的元素(删除与other中不同的元素),如果有改动,返回true
---------------------------------------------------------
ArrayList和Vector
需要动态数组时,可以使用Vector。
Vector线程安全,所有的方法都是同步的。
但是我们一个线程访问用Vector的话,会花费很长时间在线程同步上。所以不需要同步时用ArrayList。
Set(HashSet 和TreeSet对比)
元素不重复,添加元素前,先进行判断元素是否存在,不存在则添加,存在则返回false不做操作。
HashSet散列,可快速查找,插入比TreeSet快。无序,对象进去会按照方法生成整数散列码,对顺序没有要求的搜索可以用他。
Java.Util.HashSet<E>
HashSet();
HashSet(Collection<? extends E> elements) 将集合添加到散列集中。
HashSet(int initialCapacity) 构造一个空的,具有指定容量的散列集
HashSet(int initialCapacity, float loadFactor) loadFactor 0.0~1.0, 当大于这个百分比时,散列集再散列
int hashCode(),返回这个对象的散列码
TreeSet树集,按照红黑树排序,可自定义一些排序规则。插入比HashSet慢一些,但与ArrayList和LinkedList比还是快一些。
之前对接支付接口,生成signiture的时候,对方接口给的方法就是将集合变为TreeSet(排序),加密生成signiture,然后对方也按照这个顺序来进行解密填充值。
java.util.TreeSet<E>
TreeSet(Comparator<? super E> c) //构造一个树集,并使用指定的构造器对其进行排序。