“足球论之java集合 list set map的区别”

一、list与Set、Map区别及适用场景
1.首先要知道list和set都是继承collection这个接口,而map不是
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
比如:足球队中分为前锋,中场,后卫三个主要部分,在足球比赛的过程中把前锋,中场,后卫看成元素,足球场上一般都会把这三个元素的位置划分出来,顾名思义,但两个球队都有前锋,中场,后卫,这样重复且可重复(list的原理)。
而set集合 可以这样理解 ,比如足球队中的前锋要大换血,这样找了郜林,于大宝等,就把郜林和于大宝当成两个set集合中的元素,前锋中只会有于大宝这一个人,世界上不会再有一个于大宝,这就是不可重复,而于大宝和郜林在主球场场上的位置没有先后顺序(元素的无放入顺序)。
3.Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

4.Map适合储存键值对的数据
比如:足球队中的每一个球号对应一个队员,当然如果队里换替补队员,如果连个个人是相同的球号,这样替换的人将对应这个球号(如果key相同,value值会被覆盖)但一个队中比如8号这个球号只会有一个,换的只是队员(map中只有唯一的key)
5.线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
二、ArrayList与LinkedList的区别和适用场景
Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
比如:足球对的成员并排站成一排,让你去点人数,这样一目了然,而且也便于数数目,但如果你想往他们中间插一个人,必须后面的人全部让后挪动一个位置,才能插入,删除同样的道理(ArrayList就是这样,查询非常快,但插入和删除慢)
ArrayList底层使用数组实现
该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。
LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
适用场景分析:
当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。
比如:足球队成员正在足球场上比赛,因为分布部均匀,这样让你去从里面数一下人数,非常的难,但如果你想往里面插入一个人,直接插就好了,不会影响其他队友的比赛(linkedList插入快,查询慢)
LinkedList底层的数据结构是基于双向链表的,该数据结构我们称为节点
三、HashSet与Treeset的适用场景
1.TreeSet 是二差树(红黑树的树据结构)实现的,Treeset中的数据是自动排好序的,不允许放入null值
2.HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束
3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
比如:球队的前锋的成员,必须是唯一的,但在球场上的位置是无序的,HashSet的唯一优点是可以有一个Null值,当然null值也只能有一个。
适用场景分析:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。
LinkHashSet和HashSet的区别
HashSet由哈希表(实际上是一个HashMap实例)支持,不保证set的迭代顺序,并允许使用null元素
对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同。
四、 HashMap与TreeMap、HashTable的区别及适用场景
HashMap 非线程安全
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
适用场景分析:
HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。
HashMap:适用于Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
主要记住:Hashmap可以有一个key为Null,多个value为空,而HashTable不容许有key为空,value也不为空。HashTable的contains方法,HashMap的containsValue()和containsKey()方法。
HashMap底层使用数组实现,数组中每一项是个链表,即数组和链表的结合体
HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。HashMap底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值