Java的集合

Java的集合

开发工具与关键技术:工具:myeclipse  技术: List、Set、Queue、Map
作者:吴东梅
撰写时间:2019-05-21

Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等。除此之外,Java集合还可用于保存具有映射关系的关联数组。Java集合大致可分为List、Set、Queue和Map四种体系,其中List代表有序、重复的集合;Set代表无序、不可重复的集合;而Map则代表具有映射关系的集合,Java5又增加了Queue体系集合,代表一种队列集合实现。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
Java的集合类主要由两个接口派生而出: Collection和Map, Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。如下所示是 Java集合简单结构图:
在这里插入图片描述
List集合
首先我们先来了解一下List集合:
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。Lst集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1… List集合有许多常用的方法,下面我们来一一了解一下吧。
以ArrayList为例:
1、 add(E e) 向列表的尾部添加指定的元素。
2、 add(int index, E element) 在列表的指定位置插入指定元素。
如下图所示,用上面方法执行成功之后的应用效果图:
在这里插入图片描述
3、set(int index, E element) 用指定元素替换列表中指定位置的元素。
4、remove(int index) 移除列表中指定位置的元素。
在这里插入图片描述
当然,除了可以一个个的添加进去和删除,当然也可以同时添加多个和删除多个啦!如下图所示:
5、addAll(Collection c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定collection 的迭代器返回这些元素的顺序。
6、removeAll(Collectionc) 从列表中移除指定 collection 中包含的其所有元素。
在这里插入图片描述
接下来就是用遍历方法或者迭代器的方法把List集合里面的元素一一取出来,这是List取出元素的特有方法之一。
如下图所示,是用for循环和foreach循环遍历出List集合中的元素。
在这里插入图片描述
如下图所示,是用迭代器取出List集合里面的元素:
在这里插入图片描述
还有一些关于List集合的查找相关方法。如下所示:
1、indexOf(指定元素) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
2、 lastIndexOf(指定元素) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
3、contains(指定元素) 如果列表包含指定的元素,则返回 true。
4、containsAll(collection) 如果列表包含指定 collection 的所有元素,则返回 true,否则返回false。
上面方法应用的过程,执行的结果如下图所示:
在这里插入图片描述
5、subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
6、isEmpty() 如果列表不包含元素,则返回 true,否则返回false。
如下图所示:
在这里插入图片描述
Set集合
Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回 false,且新元素不会被加入。
一、HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。 HashSet类按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet类具有以下特点: 1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2、HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
3、集合元素值可以是null,但只能放入一个null。
当向 HashSet集合中存入一个元素时, HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过 equals方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet将会把它们存储在不同的位置,依然可以添加成功。
HashSet判断元素是否相等的依据:对象的equals()比较返回false;且hashCode值不
相等,判断两个元素不相等;
HashSet的常用方法跟List的常用方法差不多是一样的,这里就不再重新写一遍了。
只是在声明的时候不一样,如下图所示:
在这里插入图片描述
二、LinkedHashSet类
HashSet类还有一个子类 LinkedHashSet, LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历 LinkedhashSet集合里的元素时, LinkedHashSet将会按元素的添加顺序来访问集合里的元素。LinkedHashSet需要维护元素的插入顺序,因此性能略低于 HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。
常用方法如下图所示:
在这里插入图片描述
在这里插入图片描述
三、TreeSet类
TreeSet是 SortedSet接口的实现类,正如 SortedSet名字所暗示的, TreeSet可以确保集合元素处于排序状态。与 Set集合相比,TreeSet还提供了如下几个额外的方法。

  1. first() 返回此 set 中当前第一个(最低)元素。
  2. last() 返回此 set 中当前最后一个(最高)元素。
  3. floor(给定元素) 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。
  4. lower(给定元素) 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。
  5. higher(给定元素) 返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。
  6. ceiling(给定元素) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
  7. headSet(给定元素) 返回此 set 的部分视图,其元素严格小于给定元素。就是把小于给定元素的所有元素都显示出来。
  8. tailSet(给定元素) 返回此 set 的部分视图,其元素大于等于 给定元素。就是把大于等于给定元素的所有元素都显示出来。
  9. subSet(E fromElement, E toElement) 返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
    在Java中如何应用在操作中,写法应用如下图所示:
    在这里插入图片描述
    执行上面代码的结果:
    在这里插入图片描述
    Queue 队列
    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构。
    Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。
    Queue队列有如下几种常用方法,如下所示:
  10. element() 获取,但是不移除此队列的头。
    2)peek() 获取但不移除此队列的头;如果此队列为空,则返回 null。
    3)poll() 获取并移除此队列的头,如果此队列为空,则返回 null。
    写的操作方法如下图所示:
    在这里插入图片描述
    执行之后的结果图如下所示:
    在这里插入图片描述
    Map集合
    Map接口中键和值一一映射. 可以通过键来获取值。
    1、给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。 2、当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常。
    3、当对象的类型和Map里元素类型不兼容的时候,就会抛出一个ClassCastException异常。
    4、当在不允许使用Null对象的Map中使用Null对象,会抛出一个NullPointerException 异常。
    5、当尝试修改一个只读的Map时,会抛出一个UnsupportedOperationException异常。
    Map集合的常用方法和List集合和Set集合有些许的不同,因为List和Set都是直接操作值的,而Map是键和值一起操作的。
    但是如何应用操作常用方法都是差不多的。
    要注意的是:不管添加进去的顺序是怎样的,Key值都会自动按照自然顺序从小到大排序。Value值是可以修改的,但是Key值是不可以修改的。
    如下图所示:
    在这里插入图片描述
    二、TreeMap类
    与 TreeSet类似的是,TreeMap中也提供了一系列根据key顺序访问key-value对的方法:
  11. firstKey() 返回此映射中当前第一个(最低)键。
  12. firstEntry() 返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
  13. lastKey() 返回映射中当前最后一个(最高)键。
  14. lastEntry() 返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
  15. higherKey(K key) 返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。
  16. higherEntry(K key) 返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。
  17. lowerKey(K key) 返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。
  18. lowerEntry(K key) 返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。
  19. headMap(K toKey) 返回此映射的部分视图,其键值严格小于 toKey。
  20. tailMap(K fromKey) 返回此映射的部分视图,其键大于等于 fromKey。
  21. subMap(K fromKey, K toKey) 返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。[fromKey,toKey)
    应用的操作方法如下图所示:
    在这里插入图片描述
    执行后的效果图如下:
    在这里插入图片描述
    到此为止,基本了解了Java集合的常用方法的基本操作,现在总结一下吧。
    Java集合总结
    1、 List,Set,Map是集合体系中最主要的三个接口。
    其中list和set是继承自collection接口。
    Map也属于集合系统但是与collection接口不同。
    2、 list是有序且允许元素重复,允许元素为null,ArrayList、LinkedList和Vector是三个主要的实现类。
    1)ctor、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链
    表的形式进行存储。
    2)Vector线程安全的(同步),ArrayList、LinkedList线程不安全的(不同步)。
    3)ArrayList、Vector适合查找,不适合指定位置的插入、删除操作;LinkedList适合指定位置插入、删除操作,不适合查找。
    4)ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是
    100%,因此ArrayList更节省空间。
    3、set是无序,不允许元素重复;HashSet和TreeSet是两个实现类
    (1)、HashSet 基于HashMap实现,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的。
    (2)、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。

ps:为了线程安全而提出,线程安全的就是同步的,不安全的就是不同步的。不同步的运行速度要比同步的快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值