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

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