java基础—常用的集合类有哪些?比如List如何排序?

java基础—常用的集合类有哪些?比如List如何排序?

2017年12月04日 16:41:57 阅读数:2282 标签: java set list map 更多

个人分类: java

常用的集合类有哪些?比如List如何排序?

Set、List、Map.png

Java中常用的集合类


对于集合,大家都不陌生了,常见的集合接口Set、List、Map等,其中Set和List继承自Collection。


Collection是一组对象的集合,而Map存储的方式不一样,他是以键值对的形式存放多个对象的。


Set和List又有区别,Set中的元素无序且不重复,而List中的元素则是有序且允许重复的。


Set、List、Map都是接口类,定义的是规范,具体使用时,还是需要其实现类的实例。一般我们见得比较多的就是HashSet、TreeSet、ArrayList、LinkedList、HashMap等,另外还有Vector、HashTable什么的,这个涉及了多线程中的线程安全以及性能问题,现在出场率比较低了。


Set:HashSet、TreeSet


说实话,就个人经历而言,Set的使用比较少,仅在对Map使用Entry的方式进行遍历的时候,用到过Set的实现类。


关于去重:Set的中判断放入元素是否重复,都是基于对象的equals()方法的返回值来实现的。


关于顺序和排序:其实作为无序的Set,本身应该是不具备排序功能的,因为根本就没有顺序。
HashSet对于元素的存储位置是取决放入对象的HashCode,是散列形式的;另外,还有一个名叫LinkedHashSet的实现类,除了使用HashCode来决定元素位置之外,同时还是用了链表来维护元素的次序(Linked),因此对其插入元素时,看起来是有序的;
TreeSet,这个实现类没有接触过,以下资料为网络摘抄:


TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。
向TreeSet中加入的应该是同一个类的对象。TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0。
定制排序
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。
比较大小的2个接口.jpg
从上面的引文可以看出,对于集合的排序可以使用元素本身比较大小的方法(前提是实现了Comparable接口的对象);或者去实现Comparator接口的compare()方法来自定义一套比较大小的逻辑。


List:ArrayList、LinkedList


这2个应该是很常见的集合实现类了,一个是基于数组的原理存储元素,一个是使用链表的形式存储元素,具体的区别不在赘述。
总之,List是有顺序的,因此List肯定是可以排序的。考虑到这一点,Java创造者们早就给我们准备好了趁手的工具——Collections,长得有点像Set和List的お父さん(父亲),其实根本不是一个世界的人(类);


关于Collections
这是官方提供的一个处理集合的工具方法的集合,本人最熟悉的就是他的sort()方法,对,就是这个排序用的方法,下面我们就来仔细看看这个便利的方法吧。


sort()方法排序的本质其实也是借助Comparable接口和Comparator接口的实现,一般有2种用法:
1、直接将需要排序的list作为参数传入,此时list中的对象必须实现了Comparable接口,然后sort会按升序的形式对元素进行排序;
2、传入list作为第一个参数,同时追加一个Comparator的实现类作为第二个参数,然后sort方法会根据Comparator接口的实现类的逻辑,按升序进行排序;
这里可能有朋友会问,为什么都是升序没有降序。
其实所谓升或者降都是你自己规定的,sort()方法只是将比较结果为-1的放前面,0的放中间,1的放后面;如果你想实现降序排列,那就在Comparator方法的实现类中,逆转compare的返回结果就行了。


Map:HashMap


看到前面的Set和List的实现类里面前缀都有Array(数组实现),Hash(哈希),Linked(链表)这几种存储方式的实现,我脑洞了一下Map是不是也有ArrayMap呢?


没有直接百度,而是直接在IDE中去new ArrayMap<K,V>(),发现编译通不过,看来1.7的JDK是不支持了。


然后开启度娘模式发现,居然Android里面有提到,看来我也不算脑洞了。


HashMap算是开发中使用得最多的了,很方法的键值对形式(内在是一个一个散列分布的Entry<K,V>,因此可是使用Set<Entry<K,V>>的方式遍历);


本人对于HashMap基本上遍历多,排序少,从其前缀的Hash可以看出,其键值对的存放应该也是根据key的HashCode进行存放;因此,HashMap本身应该是无法排序的,所以跟Set一样,官方也没有提供对应的排序方法。


不过,我们可以进行DIY,譬如把HashMap中的key存入可排序的list,进行排序,然后遍历的时候,通过list或许到key之后,再从Map获取值这样就按照key进行排序了。
如果要按照value进行排序就复杂一点,可以把Entry对象放进list,然后自己实现比较器,根据value进行排序。
嗯,还有更多更快更优的方法,大家都可以发散思维。


另外提一嘴,Map中还有TreeMap和LinkedHashMap,其特点就跟Set中的那两位一样一样的。


写在文尾的体会


不管是Set、List还是Map,根据其不同的特性,有不同的应用场景。


对于排序的问题,根据各种实现类的前缀,了解实现中的元素存储方式,可以知道是有序还是无序。由此,可以知道排序是使用官方工具,还是需要自行实现对应的方法。


不论官方还是DIY,总之要继续排序的基本原理都是借助Comparable接口和Comparator接口的实现,那么不论待处理的集合是怎样的,我们都有办法应对了

转载于:https://my.oschina.net/u/1458864/blog/1942507

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值