集合 ArrayList , LinkedList和Vector,Set(HashSet,TreeSet)

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) //构造一个树集,并使用指定的构造器对其进行排序。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值