集合

什么是集合

  JDK中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变。

集合有两大类:单列集合Collection和双列集合Map

  Collection:单列集合的根接口,它有两个重要的子接口List和Set。List的特点是元素有序元素可重复。Set的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。

  Map:双列集合类的跟接口,用于存储具有键(Key)、值(Value)映射关系的元素。Map接口的主要实现类有HashMap和TreeMap。

List接口:

  List接口继承自Collection接口,习惯性的会将实现了List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中通过索引来访问集合中指定的元素。集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

  List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法。

ArrayList集合:

  ArrayList是List接口的一个实现类,它是程序中最常见的一种集合,在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看做一个长度可变的数组。

  ArrayList集合中大部分方法都是从父类Collection和List中继承过来的,其中add()方法和get()方法用于实现元素的存取

  由于ArrayList集合的底层是使用一个数组来保存元素的,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。

LinkedList集合:

  ArrayList集合在查询元素时速度很快,但在增删元素时效率很低,为了克服这种局限性,可以使用List接口中的另一个实现类LinkedList。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可。删除一个节点也是如此。正是因为这样的存储结构所以LinkedList集合对于元素的增删操作具有很高的效率。

  所谓双向链表就是有两个指向的链表,将链表中的每个结点都设有两个指针域,一个指针指向其直接后继,另一个指针指向其直接前驱,用这种结点的链表称为双向链表。它可以从链表中任意一个结点开始向两个方向遍历整个链表。

Set接口:

  Set和List同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了,与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

  Set接口主要有两大实现类,HashSet和TreeSet。其中HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素的,它可以实现对集合中的元素进行排序。

HashSet集合:

  HashSet时set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后在调用对象的equals()方法来确定该位置没有重复的元素。

HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作,当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,根据对象的哈希值计算出一个存储位置,如果该位置上没有元素则直接将元素存入,如果该位置上有元素,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复的元素,就将该元素舍弃。

  当向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象时,重写该类中的hashCode()和equals()方法。

TreeSet集合:

  TreeSet是Set接口的一个实现类,它内部采用自平衡的排序二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。按照左子树小,右子树大的顺序排序当有重复的会舍弃。

  集合中的元素在进行比较时,都会调用comparaTo()方法,该方法时Comparable接口中定义的,因此要想对集合中的元素进行排序就必须实现ComparaTo()方法。JDK中大部分的类都实现了Comparable接口,拥有了接口中的ComparaTo()方法,如Integer,Double和String等。

Map接口:

  Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系--映射。Map接口提供了大量的实现类,最常用的有HashMap和TreeMap。

HashMap集合:

  HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键,若出现则:键相同,值覆盖。

如何遍历Map中所有的键值对?

  1、先遍历Map集合中的所有键,再根据键获取对应的值。

  2、先获取集合中的所有映射关系,然后从映射关系中取出键值。

  3、通过Collection的values()方法直接获取Map中存储所有值得Collection集合。

LinkedHashMap集合:

  HashMap集合迭代出来的元素顺序和存入的顺序是不一致的,LinkedHashMap是HashMap的子类,和LinkedList一样也使用双向链表来维护内部元素的关系使Map元素迭代的顺序与存入的顺序一致。

TreeMap集合:

  Map中还有一个常用的实现类TreeMap。TreeMap集合是存储键值映射关系的,不允许出现重复的键。它是通过二叉树的原理来保证键的唯一性,这与TreeSet集合的存储原理一样,因此TreeMap中所有的键是按照某种顺序排列的。

  在使用TreeMap集合时,也可以通过自定义比较器的方式对所有的键进行排序。

Properties集合:

  Map接口中还有一个实现类Hashtable,它和HashMap十分相似,区别在于Hashtable是线程安全的。Hashtable存取元素时速度很慢,但Hashtable类有一个子类Properties在实际应用中非常重要,Properties主要用来存储字符类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。

 

 

  

  

  

  

转载于:https://www.cnblogs.com/hcl695/p/9656539.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值