集合的学习(二)

集合:
Collection(I) + Map(I)

Collection(I)
    | - List(I)
        | - ArrayList(C) - 数组
        | - LinkedList(C) - 双向链表
        | - Vector(C) - 数组
            |- Stack - 作为栈实现
    | - Set(I)
        | - HashSet(C) - 散列表
        | - SortedSet(I)
            | - TreeSet(C) - 二叉树
    | - Queue(I) - 队列
        | - Deque(I) - 双端队列(栈)
            | - LinkedList(C)

Map(I)
        |- HashMap(C)
            |- LinkedHashMap(C)
        |- HashTable(C)
        |- ConcurrentHashMap(C)
        |- SortedMap(I)
            |- TreeMap(C)

Map的特点:
    1).Map集合是一个双列集合,是以key-value的形式表示.
    2)key和value都可以使用泛型,也就意味着可以使用引用数据类型(自定义类)
    3).key值都不允许有重复值
    4).value值允许有多个重复值
    5).如果key值完全一致,则value值会被覆盖
    6).因为key是唯一的,可以通过key找到value值

HashMap(C):
  1.底层实现: 哈希表(散列表)
  2.底层数据结构:
      JDK1.7: 数组 + 双向链表
      JDK1.8: 数组 + 双向链表 + 红黑树
  3.特点:
      就是Map接口的特点

  4.HashMap的存储过程:
      a.计算key的hashCode值,确定位置
      b.如果位置上有元素,则使用equals()和该位置上的所有元素比较
      c.如果元素一致,会进行覆盖
    d.如果元素不一致,则直接存入链表末尾
  
  5.初始空间大小
      a.默认初始容量:16
      b.加载因子: 0.75 -> 容量达到百分之75的时候进行扩容
      b.如果元素太少就进行扩容,会造成空间的浪费
      c.如果元素太多进行扩容,则会造成效率低下
 

遍历方式:

1)获取所有的key,并且得到对应的Set集合类型
          map.keySet()
      2)获取所有的value,并且得到对应的List集合类型
          map.values()
      3)获取所有的键值对entry,并且得到对应的Set集合类型


          注意:
              a.在set集合中只能存放一种泛型,所以键值对(entry)也是一个整体泛型类型
              b.Entry是属于Map的内部接口,内部接口的使用方式和内部类一样
              c.Entry的结构
                  获取键:
                      getKey()
                  获取值:
                      geyValue()

 

LinkedHashMap(C)
    1)底层数据结构:数组+链表+双向链表
    2)特点:
        a.按照插入顺序进行排列

TreeMap(C)
    1)底层数据结构:红黑树
    2)作用:
        a.对Map集合进行排序

Hashtable(C)
    1)底层数据结构: 数组 + 链表
    2)和HashMap的区别
        a.父类的不同
        b.线程安全
        c.版本问题
        d.扩容问题
        e.是否可以存在null值

ConcurrentHashMap(C)
    1)底层数据结构:
        JDK1.7: 数组 + 链表
                Segment数组 + hashEntry数组 + hashEntry链表
        JDK1.8: 数组 + 链表|红黑树
               CAS + synchronized(同步锁)

            CAS全称: Compare And Swap - 比较并交换

                三个数据值:
                    内存值V  当前值A  修改的新值B

                    情况1:
                        内存值V 和 当前值A 比较结果相同,将修改的新值B替换内存值V的值

                    情况2:
                        内存值V 和 当前值A 比较结果不相同,要么重试,要么就放弃更新

            CAS的目的: 把内存值V 和 当前值A进行比较

            synchronized锁: 每一次会让一个线程操作共享的数据,而CAS相当于是没有加锁,多个线程就都可以操作共享的数据.
            在实际去修改的时候才会去判断能否修改成功.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值