集合的其他内容2

旧的集合类

  • Vector

    • 实现原理和ArrayList相同,功能相同,都是长度可变的数组结构,很多情况下可以互用。
    • 两者的主要区别如下:
      1.Vector是早期JDK接口,ArrayList是替代Vector的新接口。
      2.Vector线程安全,效率低下;ArrayList重速度轻安全,线程非安全。
      3.长度需要增长时,Vector默认增长一倍,ArrayList增长50%。
  • HashTable类

    • 实现原理和HashMap相同,功能相同,底层都是哈希表结构,查询速度快,很多情况下可以互用。
    • 两者的区别主要如下:
      1.HashTable是早期JDK提供,HashMap是新版JDK提供 。
      2.HashTable继承Dictionary类,HashMap实现Map接口。
      3.HashTable线程安全,HashMap线程非安全。
      4.HashTable不允许null值,HashMap允许null值。

示例 :使用Vector类进行集合操作

package com.bjsxt.other;

import java.util.Enumeration;
import java.util.Vector;

public class TestVector {
    
    
    public static void main(String[] args) {
    
    
        Vector v = new Vector();
        v.addElement(123);
        v.addElement(345);
        v.addElement(123);
        System.out.println(v.size());
        Enumeration en = v.elements();
        while (en.hasMoreElements()) {
    
    
            int elem= (int) en.nextElement();
            System.out.println(elem);
        }
    }
}
/*
output:
3
123
345
123

 */

新一代并发集合类

  • 早期集合类Vector、HashTable通过使用syncronized关键字修饰方法来保证线程安全。

  • 为了提高性能,使用ArrayList、HashMap 替换,但不能保证线程安全,那么需要线程安全该怎么办呢?
    答:使用Collections.synchronizedList(list)Collections.synchronizedMap(m)解决,底层使用synchronized代码块锁。虽然也是锁住了所有的代码,但是锁在方法里面,比锁在方法外边性能可以理解为稍有提高吧。毕竟方法本身就要分配资源的。

  • 在大量并发的情况下如何提高集合的效率和安全呢?
    提供了新的线程同步集合类,位于java.util.concurrent包下,使用Lock锁。

    • ConcurrentHashMap
    • CopyOnWriteArrayList
    • CopyOnWriteArraySet

集合常用概念辨析

  • 集合和数组的比较
    数组不是面向对象的,存在明显缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类。
    可适用于不同场合,具体如下
    1.数组容量固定且无法动态改变,集合类容量可以动态改变。
    2.数组中能存放基本数据类型和引用数据类型的数据,而集合中只能存放引用数据类型的数据。
    3.数组无法判断其中实际存有多少元素,length只告诉了数组的容量;集合可以判断实际存有多少元素,而对总的容量不关心。
    4.集合有多种数据结构(顺序表、链表、哈希表、树等)、多种特征(是否有序、是否唯一)、不同适应场合(查询快,便于删除、有序),而数组仅采用顺序表表示。
    5.集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
    - ArrayList和LinkedList的联系和区别
    联系:
    1.都实现了List接口
    2.有序、不唯一(可重复)
    ArrayList:
    特点:在内存中分配连续的地址空间,实现了长度可变的数组。
    优点:遍历元素和随机访问元素的效率比较高。
    缺点:添加和删除需要移动大量的元素,效率低,按内容查找效率低。
    LinkedList:
    特点:采用链表存储方式,底层是双向链表。
    缺点:遍历和随机访问效率低下。
    优点:插入删除元素效率较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)。
    哈希表的原理(HashMap的底层原理)

  • 哈希表的特征
    快:添加快、删除快、查询快。

  • 哈希表的结构
    1.最常用、最容易理解的结构(JDK1.7):数组+链表。
    2.JDK1.8:数组+链表/红黑树(链表长度>=8)
    在这里插入图片描述

  • 哈希表的添加原理
    1.计算哈希码(hashCode());
    2.计算存储位置(存储位置就是数组的索引);
    3.存入指定位置(要处理冲突,可能重复。需借助equals()进行比较)

  • 哈希表的查询原理
    同哈希表的添加原理。

  • 其他:
    1.hashCode()和equals()的作用。
    2.如何减少冲突。
    3.如何生产不同数据类型的哈希码。

TreeMap的底层原理(红黑树的底层原理)

  • 基本特征:
    二叉树、二叉查找树、二叉平衡树、红黑树。
    在这里插入图片描述
    每个节点的结构:

在这里插入图片描述

  • 添加原理

1.从根节点开始比较
2.添加过程就是构造二叉平衡树的过程,会自动平衡
3.平衡离不开比较:外部比较器优先,然后是内部比较器,否则出错

  • 查询原理基本同添加

Collection和Collections的区别

  • Collection是Java提供的集合接口,存储一组不唯一、无序的对象。他有两个接口List和Set。
  • Java中还有一个Collections类,专门用来操作集合类,他提供一系列的静态方法来实现对各种集合的搜索、排序、线程安全化等操作。

猜你喜欢

转载自blog.csdn.net/qq_40836864/article/details/114422371