JAVA语言基础系列之各集合类对比总结
小标 2019-01-09 来源 : 阅读 1480 评论 0

摘要:本文主要向大家介绍了JAVA语言基础系列之各集合类对比总结,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言基础系列之各集合类对比总结,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


各集合类对比总结


集(Set):集里的对象不按任何特定的方式排列,按索引值来操作数据,不能有重复的元素


列表(List):序列中的对象以线性方式存储,按索引值来操作数据,可以有重复的元素


映射(Map):映射的每一项为“名称—数值”对,名称不可以重复,值可以重复,一个名称对应一个唯一的值


迭代器Iterator


迭代器是按次序一个一个地获取集合中所有的对象,是访问集合中每个元素的标准机制。


迭代器的创建:Collection接口的iterator()方法返回一个Iterator


Iterator it=test.iterator(); //将test集合对象转为迭代器


迭代器的常用方法:


hasNext() //判断迭代器中是否有下一个元素


next() //返回迭代的下一个元素


Remove() //将迭代器新返回的元素删除


public interface Iterator {

    boolean hasNext();

 

    Object next();

 

    void remove(); // Optional

}

   


在调用remove()方法的时候, 必须调用一次next()方法.


remove()方法实际上是删除上一个返回的元素.


List常用方法


void add(int index, Object element) :添加对象element到位置index上


boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素


Object get(int index) :取出下标为index的位置的元素


int indexOf(Object element) :查找对象element 在List中第一次出现的位置


int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置


Object remove(int index) :删除index位置上的元素


ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex


List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素


ArrayList


可以将其看作是能够自动增长容量的数组。


利用ArrayList的toArray()返回一个数组。


Arrays.asList()返回一个列表。


迭代器(Iterator) 给我们提供了一种通用的方式来访问集合中的元素。


ArrayList可以自动扩展容量


ArrayList.ensureCapacity(int minCapacity)


首先得到当前elementData 属性的长度oldCapacity。


然后通过判断oldCapacity和minCapacity参数谁大来决定是否需要扩容, 如果minCapacity大于 oldCapacity,那么我们就对当前的List对象进行扩容。


扩容的的策略为:取(oldCapacity * 3)/2 + 1和minCapacity之间更大的那个。然后使用数组拷 贝的方法,把以前存放的数据转移到新的数组对象中如果minCapacity不大于oldCapacity那么就不进行扩容。


LinkedList


LinkedList是采用双向循环链表实现的。


利用LinkedList可以实现栈(stack)、队列(queue)、双向队列(double-ended queue )。


它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。


ArrayList和LinkedList的比较


1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。


2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。


3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。


尽量避免同时遍历和删除集合。因为这会改变集合的大小;


for( Iterator iter = ComList.iterator(); iter.hasNext();){


ComType com = iter.next();


if ( !com.getName().contains("abc")){


ComList.remove(com);}


}


推荐:


for( Iterator iter = ComList.iterator(); iter.hasNext();){


ComType com = iter.next();


if ( !com.getName().contains("abc")){


iter.remove(com); }


无限制的在lst中add element,势必会造成lst占用内存过高


Map常用方法


常用方法:


Object put(Object key,Object value):用来存放一个键-值对Map中


Object remove(Object key):根据key(键),移除键-值对,并将值返回


void putAll(Map mapping) :将另外一个Map中的元素存入当前的Map中


void clear() :清空当前Map中的元素


Object get(Object key) :根据key(键)取得对应的值


boolean containsKey(Object key) :判断Map中是否存在某键(key)


boolean containsValue(Object value):判断Map中是否存在某值(value)


public Set keySet() :返回所有的键(key),并使用Set容器存放


public Collection values() :返回所有的值(Value),并使用Collection存放


public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set


HashMap


Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许重复,但允许值重复。


HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。


HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;


HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap


使用HashMap ,当一个对象被当作键值需要对equals()和hashCode()同时覆写


LinkedHashMap和HashMap,TreeMap对比


Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。


Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。


LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。


TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,在Map 中插入、删除和定位元素,HashMap 是最好的选择。


TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。


LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。


Set的使用


不允许重复元素


对 add()、equals() 和 hashCode() 方法添加了限制


HashSet和TreeSet是Set的实现


Set—》HashSet LinkedHashSet


SortedSet —》 TreeSet


HashSet


public boolean contains(Object o) :如果set包含指定元素,返回true


public Iterator iterator()返回set中元素的迭代器


public Object[] toArray() :返回包含set中所有元素的数组public Object[] toArray(Object[] a) :返回包含set中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型


public boolean add(Object o) :如果set中不存在指定元素,则向set加入


public boolean remove(Object o) :如果set中存在指定元素,则从set中删除


public boolean removeAll(Collection c) :如果set包含指定集合,则从set中删除指定集合的所有元素


public boolean containsAll(Collection c) :如果set包含指定集合的所有元素,返回true。如果指定集合也是一个set,只有是当前set的子集时,方法返回true


实现Set接口的HashSet,依靠HashMap来实现的。


我们应该为要存放到散列表的各个对象定义hashCode()和equals()。


HashSet如何过滤重复元素


调用元素HashCode获得哈希码–》判断哈希码是否相等,不相等则录入—》相等则判断equals()后是否相等,不相等在进行hashcode录入,相等不录入


TreeSet


TreeSet是依靠TreeMap来实现的。


TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口,我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。


HashSet与TreeSet与LinkedHashSet对比


HashSet不能保证元素的排列顺序,顺序有可能发生变化,不是同步的,集合元素可以是null,但只能放入一个null


TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。


TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0


自然排序


自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。


定制排序


自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(To1,To2)方法


LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。


LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved