美文网首页
9、java集合

9、java集合

作者: bigpeng个人博客 | 来源:发表于2019-01-13 20:48 被阅读7次

    1、什么是java集合

    java集合是用来存储多个数据引用的数据类型。

    2、java集合分类

    java集合类在java.util包下
    集合的顶层接口有Collection,Map,Iterator。
    其中Collection中有两个子接口List和Set。


    java集合结构.png java集合类图.png

    3、list

    list为有序可重复的集合。常见子类有:

    • ArrayList: 基于动态数组实现,支持下标访问。数据的修改和查询快。

    • Vector:与ArrayList类似,但是是线程安全的。

    • LinkedList:基于双向链表实现,只能顺序访问,数据的添加和删除效率较高。

    • CopyOnWriteArrayList:线程安全,读写分离的集合,读的性能较高,适用于读多写少的场景。缺点:内存占用高,读操作不能读取到实时数据。

    3.1 ArrayList的扩容:

    扩展:ArrayList动态数组初始默认大小为10,当不够存储时,会按旧容量1.5倍进行扩容。使用的是Arrays.copyOf()方法。

    3.2 ArrayList序列化:

    ArrayList的序列化时,因为动态数组中数据可能没有存满,所有不能直接对数组中的数据进行序列化,ArrayList将动态数组用transient,让其不被序列化,然后ArrayList 实现了 writeObject() 和 readObject() 来控制只序列化数组中有元素填充那部分内容。序列化时需要使用 ObjectOutputStream 的 writeObject() 将对象转换为字节流并输出。而 writeObject() 方法在传入的对象存在 writeObject() 的时候会去反射调用该对象的 writeObject() 来实现序列化

    3.3 Vector的替代方案:

    因为vector的效率不是很高,可以使用 Collections.synchronizedList(); 得到一个线程安全的 ArrayList。

    List<String> list = new ArrayList<>();
    List<String> synList = Collections.synchronizedList(list);
    

    4、set

    set为无序不可重复的集合。

    1、那我们怎么来判定元素是否重复呢?
    2、通过equals来比较的话,我们如果要插入一万条数据,
       那我们没插入一条数据都要跟已有的数据做equals比较吗?
    3、hashcode存在的价值??
    哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。用以快速定位寻址存储的对象。
    
    4、hashcode与equals 怎么联合起来工作的?
       整个处理流程是:
    
          1、判断两个对象的hashcode是否相等,
             若不等,则认为两个对象不等,完毕,
             若相等,则比较equals。
    
          2、若两个对象的equals不等,则可以认为两个对象不等,否则认为他们相等。
    5、hascode与equals的关系
    
          如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
    
          如果x.equals(y)返回“false”,
          那么x和y的hashCode()有可能相等,也有可能不等。
    

    set有三个常用的子类分别为 Hashset,LinkedHashSet,TreeSet

    • HashSet是使用哈希表(hash table)实现的,其中的元素是无序的。HashSet的add、remove、contains方法 的时间复杂度为常量O(1)。

    • TreeSet基于红黑树实现。TreeSet中的元素是可排序的,但add、remove和contains方法的时间复杂度为O(log(n))。TreeSet还提供了first()、last()、headSet()、tailSet()等方法来操作排序后的集合。

    • LinkedHashSet介于HashSet和TreeSet之间。它基于一个由链表实现的哈希表,保留了元素插入顺序。LinkedHashSet中基本方法的时间复杂度为O(1)。

    5.Map

    Map是以键值对的方式来存储数据。常见的子类有HashMap,HashTable,ConcurrentHashMap,LinkedHashMap。

    • hashMap 采用key-value形式存储数据,key唯一不可重复,且可以为null。
    • hashTable: 与HashMap类似,线程安全。
    • ConcurentHashMap:与HashMap类似,采用了分段锁(Segment),多个线程可以同时访问不同分段锁上数据,并发处理能力更高。
    • LinkedHashMap :内部通过双向链表实现,会保留Map的插入顺序
    • TreeMap :可以排序的Map
    • WeakHashMap :主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收

    6、java泛型

    泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

    相关文章

      网友评论

          本文标题:9、java集合

          本文链接:https://www.haomeiwen.com/subject/udhshqtx.html