java集合解析一

1.collection集合

数组弊端,一但创建无法动态扩容

集合中的泛型必须是引用类型,不能使用基本类型

集合重写了他的toString方法,打印的不是地址

1.collection接口(单列集合)

共同方法:

clear :清除所有元素

contains :集合是否包含给定的对象

isEmpty :判断集合是否为空

toArray :转化为数组

list集合的特点(接口)

1.有序,元素存储和取出的顺序一致

2.可重复,存储的元素可以相同

3.有索引,可以使用简单的for循环进行遍历

set集合的特点(接口)

1.不可重复,存储的元素不能相同

2.没有索引,不能使用for遍历

3.TreeSet和HashSet集合存取的顺序不一致,LinkedHashSet (有序的集合)

 

1.Iterator迭代器(接口)

他的获取实在collection中有一个iterator的方法

通用取出集合中元素

方法:

hasNext()

next()

remove()

while循环

实现原理:

1.使用collection集合中的iterator方法获取iterator对象
2.将指针(索引)指向集合中的-1(集合是0开头)
3.hasNext方法判断指针的下一个位置是否有元素(0是否有元素)
4.如果有元素使用next方法取出元素,指针下移

2.增强for循环

底层使用的是迭代器,简化了迭代器的书写

 

3.案例:斗地主

1.准备牌54张,放在集合
2.洗牌  shuffle collections中的方法
3.发牌
4.看牌
​
1.存储54张牌的集合
    ArrayList<String> poker = new ArrayList<>();
  String[] coller = {"♠","♣","♦","♥"};
  String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}
​
    poker.add("大王");
    poker.add("小王");
    //组装牌
    for(String nums:num){
        for(String col:coller){
            poker.add(col+nums);
        }
    }
2.洗牌
  collections.shuffle(poker);
​
3.发牌
  //定义四个集合,存放3个玩家的牌和底牌
    ArrayList<String> one = new ArrayList<>();
    ArrayList<String> two = new ArrayList<>();
    ArrayList<String> three = new ArrayList<>();
    ArrayList<String> dipai = new ArrayList<>();
​
//遍历poker ,
  for(int i=0;i<poker.size();i++){
      String p = poker.get(i);
      if(i>51){
          dipai.add(p);
      }else if(i%3==0){
          one.add(p);
      }else if(i%3==1){
          two.add(p);
      }else if(i%3==2){
          three.add(p);
      }
  }
4.看牌    
  

2.数据结构

1.栈

先进后出

2.队列

先进先出

3.数组

查询块,增删慢

因为数组的地址是连续的,通过数组的索引可以快速查找某一个元素

数组的长度是固定的,想要增删,就需要重新创建一个数组,复制原数组,在堆内存中,创建销毁效率低下

4.链表

查询慢,增删块

链表中的数据不是连续的,每次查询都需要从头查询,

链表在增加和删除的时候,只修改指针指向的地址

单向链表:链表中只有一条链子,不能保证元素顺序

5.红黑树

二叉树:叉子不能超过两个 ,左子树,右子树

排序树(查找树):在二叉树基础上,元素有大小,左边小,右边大

红黑树:趋近与平衡树,查询叶子节点最大次数和最小次数不能超过两倍

3.List集合

1.有序,元素存储和取出的顺序一致

2.可重复,存储的元素可以相同

3.有索引,可以使用简单的for循环进行遍历

方法:

add :添加

remove:移除

set:替换 list.set(4,"A");

get:获取

1.ArrayList(数组)

直接打印出来的不是地址,而是[ ]

ArrayList<String>  list = new ArrayList<>()

方法:

添加 : add list.add

获取:get list.get 从0开始

删除:remove list.remove

长度:size list.size

2.LinkedList(链表)

不能使用多态

3.Vector(数组)

同步,单线程,安全,效率慢

4.Set集合

1.不可重复,存储的元素不能相同

2.没有索引,不能使用for遍历

3.TreeSet和HashSet集合存取的顺序不一致,LinkedHashSet (有序的集合)

1.HashSet

无序集合,存和取顺序不一致,底层是哈希表(查询速度快)

1.1 哈希表

哈希值:十进制整数 object.hashcode( )

toString的方法就是哈希值变成16进制 (对象的)

在1.8之前,哈希表=数组+链表

在1.8之后;哈希表=数组+红黑树

在存储的时候,先计算元素的哈希值,将元素的哈希值存入数组,元素的值存在链表中,如果链表的长度超过8位,转化位红黑树,加快查找速度

为什么不能重复?

set集合在存储数据的时候,会通过hashcode和equals判断元素是否重复
1.先判断hashcode,如果没有,进行添加,存入set数组中的是hashcode的值,数据存储在链表中
2.如果存在hashcode,使用equals进行比较,返回true,连个元素相同,不存储

如果要存储自定义的类型,必须重写hashcode和equals方法

1.1.1 linkedHashSet

哈希表(数组+链表+红黑树)+链表 ;多出来的链表存储元素顺序

linkedHashSet有序,不可重复

2.TreeSet

 

5.collections方法

addAll(list,"","","","");

shuffle(list); 打乱集合

sort(list); 默认方式排序 只适用于list方法 默认升序

使用前提,被排序的集合里面存储的元素,必须实现Comparable接口,重写接口中的方法comparaTo定义排序的规则

 

2.Map集合

key-value形式

key不可重复,value只能映射一个,但是可以重复

key-value一一对应

方法:

添加: put

获取:get

移除:remove

判断:containsKey

遍历:keySet,entrySet

 

1.HashMap

底层是哈希表 (查询速度块)

数组+链表+红黑树(链表长度超过8)

无序

 

 

2.LinkedHashMap

哈希表+链表(保证了顺序)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值