集合的学习(一)

集合:
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)

Collection

(1)List(I):
  1)特点:
      a.List是有顺序的接口,所以是有序列表,并且可以使用index定位
      b.List允许有重复值
      c.List中允许有null

  2)常用API(只要带有index,都是List新增的方法):
      void add(int index, E element)
      boolean addAll(int index, Collection<? extends E> c)
      E get(int index) 
      int lastIndexOf(Object o) 
      E remove(int index) 
      E set(int index, E element) 
      List<E> subList(int fromIndex, int toIndex) - 截取子集合

  3)常见实现类:
      (1)ArrayList(C):
        a.底层数据结构:顺序结构
        b.底层实现:数组
        c.特点:
            ①.按照顺序排列,每个元素都带有标号
          ②.除了有标号是连续的,内存中的物理空间也是连续的
        d.优缺点:
            优点: 查询速度快(因为有连续的下标,可以根据下标进行查询)
          缺点: 
            a.插入/删除速度慢(插入/删除都是要移动元素的,所以元素一多就会执行效率慢)
            b.内存的物理空间是连续的,利用不到碎片空间

用list实现斗地主洗牌和发牌:

ArrayList<String> porkes=new ArrayList<>();
ArrayList<String> colors=new ArrayList();
colors.add("黑桃");
colors.add("红心");
colors.add("红桃");
colors.add("梅花");
ArrayList<String> numbers=new ArrayList<>();
for (int i = 2; i <=10; i++) {
    numbers.add(i+"");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
numbers.add("A");

for (String color:colors) {
    for (String number:numbers) {
        String card=color+number;
        porkes.add(card);
    }
}
porkes.add("大王");
porkes.add("小王");
Collections.shuffle(porkes);
ArrayList<String> player1=new ArrayList<>();
ArrayList<String> player2=new ArrayList<>();
ArrayList<String> player3=new ArrayList<>();
ArrayList<String> dipai=new ArrayList<>();
for (int i = 0; i < porkes.size(); i++) {
    String card = porkes.get(i);
    if (i >= 51) {
        dipai.add(card);
    } else {
        if (i % 3 == 0) {
            player1.add(card);
        } else if (i % 3 == 1) {
            player2.add(card);
        } else {
            player3.add(card);
        }
    }
}
System.out.println(player1);
System.out.println(player2);
System.out.println(player3);
System.out.println(dipai);

 (2)Vector(C)
      a.底层数据结构:顺序结构
      b.底层实现:数组
      c.特点:
          ①.全部和ArrayList一样
          ②.Vector上带有线程同步锁(synchronized),所以是线程安全的,效率低
      d.优缺点:
          全部和ArrayList一样

(3)LinkedList(C)
      a.底层数据结构:链式结构
      b.底层实现:Node节点(data[数据] + next[下一个节点的引用])
      c.特点:
          ①.LinkedList是双向链表
          ①.链表是内存中固定顺序,但是他的物理空间不连续
          ②.没有下标
          ③.所有节点的访问,都必须通过头节点(next)/尾节点(pre)
          ④.head(头节点): 只存next,不存data
            last(尾节点): 只存pre,不存data
          ⑤.head.next = null -> 空链表
            last.pre = null -> 空链表

      d.优缺点:
          优点: 
            a.插入/删除效率高
            b.不需要连续的内存物理空间,所以空间利用率高
          缺点:
          查询效率低,只能从头节点出发开始查询

        e.LinkedList独有的API:
           

Set(I) - 和Collection中的API完全一致
 1.特点:
     a.Set集合截取Map(映射表)
     b.Set集合的物理空间是不连续的,添加没有顺序(不是随机)
     c.Set集合不允许有重复值,值是唯一的
     d.使用equals()判断元素是否重复

 2.实现类
     1).HashSet(C)
       (1).存储过程 
           a.调用自身的hashCode()计算存储位置
           b.如果该位置上没有元素,则直接存入
           c.如果该位置上有元素,则调用equals()和该位置上所有元素进行比较
           d.如果相同,则不存入
           e.如果不相同,则存入该链表的末尾

JDK1.8之后

 


       (2)结论:
           a. hashCode() 和 equals() 必须一起重写
           b. equals() 判断两个相同的对象,hashCode()必须一致
           c. equals判断两个不相等的对象, hashCode值尽量不等
           d. 在同一个类中,基本可以忽略hashCode值尽量不等的情况.

 

Queue(I) - 队列
  1.底层实现:基于数组或者链表实现
  2.特点:
      a.先进先出(后进后出)
      b.队列也是线性结构,有顺序的,但是本身没有标号
  3.常用API:
      offer() - 向队列尾部追加元素
      poll() - 向队列头部取出元素(出队列)
      peek() - 向队列头部获取元素(队列不变)

  4.Deque(I) - 可以作为双端队列/栈
      1).底层实现:基于数组或者链表实现
      2).特点:
          a.作为双端队列 - 先进先出
            作为栈 - 先进后出
          b.只能通过方法区分是队列/栈
      3).常用API:
          作为双端队列:
             带有First()/Last()的方法
          作为栈:
              push() - 压栈
              pop() - 弹栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值