Java学习笔记(九):容器

Java容器

一、容器概述

  • 为了保存不确定的数据,以及具有映射关系的数据,Java提供了集合类。集合类也被称为容器类,所有的集合类都位于java.util包下,集合里只能保存对象的引用变量

  • Java集合可分为CollectionMap两种体系

    • Collection接口:单列数据
      • List接口:有序、可重复的集合
      • Set接口:无序、不可重复的集合
    • Map接口:双列数据,保存具有映射关系的集合
  • Collection接口继承树:
    在这里插入图片描述

  • Map接口继承树:
    在这里插入图片描述

二、Collection接口

  • Collection接口是ListSetQueue接口的父接口,该接口里定义的方法既可以用于操作Set集合,又可以操作ListQueue集合

三、Iterator接口

  • Iterator对象被称为迭代器,主要用于遍历Collection集合中的元素,不具有盛装对象的能力
  • Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象
  • Collection继承了java.lang.Iterable接口,该接口有一个iterator()方法,所有实现了Cllection接口的集合类都有一个iterator()方法,用来返回一个Iterator接口的对象
  • Iterator接口里定义了四个方法:
    • boolean hasNext()
    • Object next()
    • void remove()
    • void forEachRemaining(Consumer action)

四、Set集合

  • Set是无序不可重复的集合
    • 无序:Set中的元素没有索引,只能遍历查找元素
    • 不可重复:Set中不能存在重复的元素,具体来说,同一个Set中不能同时存在两个通过equals()方法比较为true的方法

1.HashSet

  • HashSet使用Hash算法来存储集合中的元素,因此具有很好的存取、查找、删除性能
  • HashSet具有以下特点:
    • 不能保证元素的排列顺序
    • 不是线程安全的
    • 集合元素可以是null
  • HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置
    • 若两个对象通过equals()方法比较返回为true,但它们的hashCode值不相等,HashSet会将它们保存在Hash表的不同位置
    • 若两个对象通过equals()方法比较返回为false,但它们的hashCode值相等,HashSet会在Hash表的对应位置用链式结构来保存多个对象
    • 如果要把某个类的对象保存到HashSet集合中,应该重写这个类的equals()方法和hashCode()方法,且保证equals()方法返回true时,hashCode()方法返回值也相等

2.LinkedHashSet

  • LinkedHashSetHashSet的子类,也是根据元素的hashCode值来决定元素的存储位置,但它同时使用双向链表维护元素的插入次序,当遍历LinkedHashSet集合里的元素时,将会按元素的添加顺序来访问集合里的元素
  • LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将具有很好的性能

3.TreeSet

  • TreeSetSortedSet接口的实现类,TreeSet可以确保集合元素处于排序的状态
  • TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素的实际值大小来进行排序的。TreeSet支持两种排序算法,且TreeSet中只能添加同一种类型的对象
    • 自然排序:默认为自然排序,升序排序。集合元素必须实现Comparable接口,当把一个对象加入到TreeSet集合中时,TreeSet调用该对象的comparaTo(Object obj)方法于容器中的其他对象比较大小,然后根据红黑树找到它的存储位置,如果相等,新对象将无法添加到TreeSet集合中
    • 定制排序:在创建TreeSet集合对象时,需要将一个Comparator对象传递给TreeSet构造器,由该Comparator对象负责元素的排序逻辑,Comparator是一个函数式接口,可以使用Lambda表达式来代替Comparator对象
  • HashSetLinkedHashSet采用hash算法来存储集合中的元素,而TreeSet采用红黑树来存储集合中的元素

五、List集合

  • List是有序可重复的容器
    • 有序:List中的元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素
    • 可重复:List允许加入重复的元素,具体来说,List允许满足e1.equals(e2)的元素重复加入容器
    • List判断两个元素相等的方法是通过equals()方法比较返回true
    • Set只提供一个iterator方法不同,List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法:
      • boolean hasPrevious()
      • Object previous()
      • void add(Object o)

1.ArrayList

  • ArrayList是基于数组实现的List类,所以ArrayList封装了一个动态的、允许再分配的Object[]数组,ArrayList对象使用initialCapacity参数来设置数组的长度,当向ArrayList添加元素超出了该数组的长度时,它们的initialCapacity会自动增加,默认的数组长度为10

2.LinkedList

  • LinkedList时基于双向链表实现的List类,内部没有声明数组,而是定义了一个Node类型的firstlast用于记录首末元素,同时,定义内部类Node,作为LinkedList保存数据的基本结构。Node除了保存数据,还定义了两个变量:
    • prev:记录前一个元素的位置
    • next:记录下一个元素的位置

3.Vector

  • ArrayList类似,唯一的区别在于Vector是线程安全的
  • 默认情况下,选择使用ArrayList,当插入、删除操作频繁时,使用LinkedListVector总比ArrayList慢,应尽量避免使用

4.固定长度的List

  • 操作数组的工具类Arrays提供了asList(Object... a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。
  • ArrayList是一个固定长度的List集合,程序只能遍历访问集合里的元素,不能增加、删除集合里的元素

六、Map集合

  • Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key,另一组用于保存Map里的valuekeyvalue都可以是任何引用类型的数据
  • Map中的keySet来存放,不允许重复
  • keyvalue之间存在单向一对一的关系,即通过指定的key,总能找到唯一确定的value
  • Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时只考虑Entry封装的key。Java先实现了Map,然后通过包装一个所有value都为nullMap就实现了Set集合

1.HashMap与Hashtable

  • HashMapHashtable都是Map接口的实现类,它们十分类似,区别在于:
    • HashMap是线程不安全的,Hashtable是线程安全的,所以HashMapHashtable的性能高一点,不推荐使用Hashtable
    • Hashtable不允许使用null作为keyvalue,但HashMap允许使用null作为keyvalue
  • HashMapHashtable中,用作key的对象必须实现hashCode()equals()方法;HashMapHashtable判断两个key相等的标准是两个key通过equals()方法比较相等,并且它们的hashCode()方法返回值也相等;HashMapHashtable判断两个value相等的标准是通过equals()方法比较返回true;HashMapHashtable不能保证元素的顺序
  • HashSet类似的是,尽量不要使用可变对象作为HashMapHashtablekey,如果确实需要使用可变对象,则尽量不要在程序中修改作为key的可变对象

2.LinkedHashMap

  • LinkedHashMapHashMap的子类,LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序一致
  • LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有较好的性能

3.TreeMap

  • TreeMap也是一个红黑树数据结构,每个key-value对作为红黑树的一个节点,TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。TreeMap也有两种排序方式
    • 自然排序:TreeMap的所有key必须实现comparable接口,且所有的key应该是同一个类型的对象
    • 定制排序:创建TreeMap对象时传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序,采用定制排序时不要求Mapkey实现Comparable接口

4.Properties

  • PropertiesHashtable类的子类,用于处理属性文件
  • 由于属性文件里的keyvalue都是字符串类型,所以Properties里的keyvalue都是字符串类型

七、Collections

  • Collections是一个操作SetListMap等集合的工具类
  • Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值