Java集合框架

目录

    • 集合框架是什么?
    • Collection(单列)接口
      • List集合
      • Set集合
        • HashSet如何检查重复
    • Map(双列)接口
      • HashMap在JDK1.7和JDK1.8中有哪些不同

集合框架是什么?

集合框架是Java编程语言提供的一组接口和类,用于存储和操作对象的集合。它提供了一种方便且高效的方式来处理数据集合,包括列表、集合、队列、映射等。

集合框架的核心接口包括List、Set、Queue和Map,每个接口都有不同的实现类,以满足不同的需求。例如,List接口的常见实现类有ArrayList和LinkedList,Set接口的常见实现类有HashSet和TreeSet,Queue接口的常见实现类有LinkedList和PriorityQueue,而Map接口的常见实现类有HashMap和TreeMap。

使用集合框架可以轻松地对数据进行添加、删除、查找和排序等操作,同时还提供了迭代器和算法等功能。这些功能使得开发人员能够更加灵活和高效地处理数据集合,提高了代码的可读性和可维护性。

Collection(单列)接口

Collection是Java集合框架的根接口之一,Collection一次存一个元素,是单列集合;
Collection集合主要有List和Set两大接口:

  • List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
  • Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。

List集合

List的主要实现:ArrayList, LinkedList, Vector。

  • ArrayList
    ArrayList是一个动态数组,也是我们最常用的集合,
    它允许任何符合规则的元素插入甚至包括null,每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。
    随着容器中的元素不断增加,容器的大小也会随着增加,在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
    所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
    ArrayList擅长于随机访问,同时ArrayList是非同步的。
  • Vector
    与ArrayList相似,但是Vector是同步的
  • LinkedList
    LinkedList是采用双向循环链表实现,LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。

Set集合

Set集合元素无序(存入和取出的顺序不一定一致),并且没有重复对象。
Set的主要实现类:HashSet, TreeSet、LinkedHashSet。

  • HashSet
    HashSet底层数据结构采用HashMap(哈希表)实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
  • LinkedHashSet
    底层数据结构采用LinkedHashMap(链表和哈希表)共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。
  • TreeSet
    底层数据结构采用二叉树(红黑树)来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
    排序分两种:自然排序(存储元素实现Comparable接口)和定制排序(创建TreeSet时,传递一个自己实现的Comparator对象)

HashSet如何检查重复

当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。

Map(双列)接口

Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap

  • HashMap
    Map接口基于数组+链表+红黑树的实现,
    它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,特点是访问速度快,遍历顺序不确定,线程不安全,最多允许一个key为null,允许多个value为null。
    可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap类。
    扩容:两倍,且哈希桶的下标使用 &运算代替了取模

  • Hashtable
    Hashtable和HashMap从存储结构和实现来讲有很多相似之处,不同的是它承自Dictionary类,而且是线程安全的,另外Hashtable不允许key和value为null,并发性不如ConcurrentHashMap。
    它是遗留类,不应该去使用它。不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换, ConcurrentHashMap 引入了分段锁。
    扩容:2倍+1,取哈希桶下标是直接用模运算

  • LinkedHashMap
    LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

  • TreeMap
    TreeMap实现SortMap接口,底层红黑树,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

HashMap在JDK1.7和JDK1.8中有哪些不同

  • 存储结构
    JDK 1.7数组 + 链表 ,JDK 1.8数组 + 链表+红黑树
  • 存放数据的规则
    • 1.7:无冲突时,存放数组;冲突时,存放链表
    • 1.8:无冲突时,存放数组;冲突 & 链表长度 < 8:存放单链表;冲突 & 链表长度 > 8:树化并存放红黑树
  • 插入数据方式
    • 1.7:头插法(先讲原位置的数据移到后1位,再插入数据到该位置)
    • 1.8:尾插法(直接插入到链表尾部/红黑树)

你可能感兴趣的:(java,开发语言)