zoukankan      html  css  js  c++  java
  • 关于集合的认识

    存储一组相同数据类型的集合===>数组!  Array   Arrays

    List  存储的是不唯一,无序的数据
      ArrayList   底层数据结构是数组,查询快,增删慢。
             线程不安全,效率高
      Vector    底层数据结构是数组,查询快,增删慢。
          线程安全,效率低
      LinkedList   底层数据结构是链表,查询慢,增删快
            线程不安全,效率高

    Set   存储的唯一,无序的数据
      HashSet的底层实现其实就是HashMap(哈希表)
      如何保证元素唯一性的呢?
        依赖两个方法:hashCode()和equals()
        开发中自动生成这两个方法即可
          LinkedHashSet 底层数据结构是链表和哈希表
          由 链表保证元素有序
          由 哈希表步骤元素唯一

      TreeSet    有序的数据
         底层数据结构是红黑树。
         如何步骤元素排序的呢?
            自然排序
              让元素所属的类实现Comparable接口
            比较器排序
              让集合构造方法接收Comparator的实现类对象,实现方式可以用匿名类来实现
         如何保证元素唯一性的呢?、
            根据比较的返回值是否是0来决定

        Set set=new HashSet();
            set.add("abc");
            set.add(new String("abc"));
            set.add(new String("abc"));
            System.out.println(set.size());

    步骤:
      01.CTRL+选中add       进入了set的底层
      02.再次点击add   进去HashSet的add()
        map.put(k,v)
      03.再次点击put()

      

    public V put(K key, V value) {
              return putVal(hash(key), key, value, false, true);
        }

           不同的字符串,有可能hashcode值一致
           相同的字符串,hashcode值绝对一致
           以空间换时间
      04.再次点击putVal
      05.观察代码    发现分为3个步骤
        p.hash == hash &&
        ((k = p.key) == key || (key != null && key.equals(k)))
            001.比较hash值 (简单int,如果hashcode不一致,不需要再比较了)
            002.比较内存地址
            003.比较具体的内容

    Map
      HashMap    hash+链表(数据结构)
            负载因子   0.75
            如果超过了负载因子,则会创建原来bucket数组的两倍数量
            线程不安全
          是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
          HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
           HashMap?实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

      HashTabel    同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
        Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
        Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

    HashTable和HashMap区别
      1、继承的父类不同
        Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
      2、线程安全性不同
        javadoc中关于hashmap的一段描述如下:此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。
      3、是否提供contains方法
        HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
        Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
      4、key和value是否允许null值
        其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。
      5、两个遍历方式的内部实现上不同
        Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
      6、hash值不同
        哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
      7、内部实现使用的数组初始化和扩容方式不同
        HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
        Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
        Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/fl72/p/9293460.html
Copyright © 2011-2022 走看看