Java学习笔记 第八章 容器

JAVA学习笔记 第八章

8.容器

8.1数据结构和算法

image-20210521151651977

image-20210521182248188

image-20210521182343697

8.2集合

image-20210521182550208

image-20210521182736086

8.3Collection

image-20210521183346622

image-20210521183456206

image-20210521183658830

image-20210521183744218

image-20210521183840781

image-20210521183905077

访问集合中的元素

image-20210521184104238

image-20210521184122754

image-20210521184206579

迭代器:

image-20210521184333807

8.4List

image-20210602113602058

image-20210602113641551

List接口的常用遍历方式

image-20210602113842626

8.5ArrayList

image-20210602114530785

image-20210602114604778

image-20210602114703719

image-20210602114806749

image-20210602114849520

image-20210602115032406

image-20210602115133233

只有底层数组不够用才会进入扩容的方法,扩容的大小为原来的1.5倍,扩容时将旧数组拷贝到新数组中,然后原来地址指向新数组

image-20210602115333409

image-20210602232843097

image-20210602232958872

image-20210602233056111

image-20210602233157402

小结:

image-20210602233256207

8.6Vector

image-20210602233443827

image-20210602233454358

image-20210602233543190

image-20210602233613704

和ArrayList区别和联系

  • 联系:底层都是数组的扩容,都具有数组的优点:查询效率高,缺点:增加删除元素效率低
  • 区别:ArrayList扩容是原来数组的1.5倍、线程不安全、效率高,Vector底层扩容的长度为原数组的两倍、线程安全、效率低

8.7泛型

在JDK1.5之后开始使用泛型

8.7.1泛型的使用

image-20210602234234051

image-20210602234413569

如果不使用泛型,有缺点:一般存入集合的数组都是同一类型的,现在什么数据类型都能存入,不方便。

image-20210602234905507

可以直接用Integer进行遍历

image-20210602234959699

image-20210602235134758

image-20210602235235548

<>也称为钻石运算符

image-20210602235509011

image-20210602235526546

image-20210602235619983

image-20210602235656544

继承相关:

(1)父类指定泛型:

image-20210602235818230

image-20210602235918181

image-20210603131029077

image-20210603131414071

image-20210603131541015

image-20210603131748110

8.7.2泛型方法

image-20210603132251285

image-20210603132342166

image-20210603132309354

image-20210603132516735

8.7.3泛型参数存在继承关系

image-20210603132921070

8.7.4通配符

image-20210603133302878

image-20210603133321523

image-20210603133504874

image-20210603133426143

image-20210603133519645

image-20210603133558404

image-20210603133802023

8.7.5泛型继承受限

Object -> Person -> Student

image-20210603134022242

image-20210603134105266

image-20210603134214257

8.8LinkedList

image-20210603134711223

image-20210603135159514

为什么有相同的方法:

在JDK版本更新后,为了增加程序的健壮性,将一些报错的问题解决了

遍历方式:

image-20210603135504696

image-20210603135606300

image-20210603135711115

底层源码实现

image-20210603141631552

image-20210603141837018

image-20210603141959114

8.9Iterable

8.9.1Iterable/Iterator()/Iterator

image-20210603143339300

image-20210603143842976

8.9.2ListIterator

image-20210603144111567

image-20210603144129902

并发修改异常,迭代器和list同时操作不可取

image-20210603144447922

迭代和添加都是通过ListIterator操作的

且可以通过it.previous从后往前遍历

image-20210603144652044

8.10Set

特点:唯一、无序(相对于List来说的,无序不等于随机)、没有跟索引相关的方法、遍历方法(迭代器、增强for循环)

8.10.1HashSet

【1】放入Integer数据

image-20210608112811074

image-20210608120009201

【2】放入String类型数据

image-20210608115950222

image-20210608120025628

【3】add方法返回值

返回的是true表示放入,返回false表示放入失败

【4】放入自定义数据类型的数据

image-20210608120805414

image-20210608120819379

不满足唯一无序的特点

image-20210608121654749

重写HashCode和equals方法后

image-20210608121817832

再运行之前的方法,发现结果没有重复的

image-20210608121853547

image-20210608122052000

image-20210609002705060

8.10.2LinkedHashSet

image-20210608131901663

8.10.3比较器

【1】int类型比较

int a = 1;
int b = 1;
System.out.println(a - b);  //差值=0则相等 >0 <0

【2】String类型比较

String中实现Comparable接口,这个接口需要实现的compareTo抽象方法,String类型重写此方法

image-20210608132329645

image-20210608132407089

【3】比较double数据

double a = 9.2;
double b = 9.1;
System.out.println(((Double) a).comparaTo((Double) b));

【4】比较自定义数据

自定义类型中implements Comparable接口,实现comparaTo抽象方法

内部比较器:

image-20210608133332295

外部比较器:

image-20210608133516684

image-20210608133531001

【5】内部比较器和外部比较器哪个好?

外部比较器,多态,扩展性好,

8.11TreeSet

【1】存入Integer数据

image-20210608192743550

image-20210608192803240

特点:数据是按照升序排序的,且唯一,(没有按照输入顺序排序)

【2】原理:底层结构是二叉树

image-20210608193152813

【3】存入String类型数据

image-20210608193215997

image-20210608193228604

特点:也是唯一的,并且按照开头的字母的大小进行升序,内部也是实现了比较器

【4】自定义数据类型存入

image-20210608193514205

image-20210608193615903

image-20210608193554251

使用外部比较器:

image-20210608193806871

image-20210608193724834

实际中利用外部比较器多,因为其扩展性好(多态)

image-20210608194007316

image-20210608194105595

【5】TreeSet底层的二叉树遍历是按照中序遍历进行的,结果是升序的

image-20210608194314957

TreeSet底层调用的是TreeMap

image-20210609155820941

8.12Map

【1】常用方法

image-20210608194800733

image-20210608194947432

image-20210608195002182

发现lili只存了一个:

image-20210608195115499

image-20210608195128154

image-20210608195327852

==比较地址是否相等,equals底层进行重写,具体的值比较属性值是否相等

keySet()获得Map中所有的key

image-20210608195727615

image-20210608195831380

image-20210608200811575

【2】Map的特点:唯一、无序

【3】HashMap

image-20210608201314015

【4】TreeMap

key的类型是String类型的:

image-20210608201514784

image-20210608201531796

key的类型是自定义数据类型:

需要自定义比较器

image-20210608201650580

image-20210608201704573

image-20210608201722726

设定比较器之后,如果后面的信息不一样,年龄一样也会当成是一样的,只会添加其中一个

外部比较器:

image-20210608202153678

8.13HashMap

image-20210608202532044

image-20210608202546524

原理:

image-20210608234557230

image-20210608235228145

构造器:

image-20210608235754636

image-20210609000108057

e!=null满足的话,发生哈希碰撞,先比较哈希值,后比较key是否是一个对象,key是一个对象的话,equals就不比较

如果不是同一个对象的话,会比较equals方法,

如果哈希值一样,equals方法比较的结果也一样,那么才会走这个if方法。

if方法内获取老的value,并返回,新的value替换旧的value,不替换key

如果放入的位置没有元素,直接走addEntry方法

计算哈希码

image-20210609000038800

image-20210609000221450

等价于h%length取余数,用&运算效率高

image-20210609000457585

当数组的元素>threshold且在当前位置上的元素不为空,则进行扩容,扩容的大小为两倍

createEntry创建一个哈希对象,首先将下标元素的对象给e,封装对象将对象给table[bucketIndex],后将size元素数量+1

image-20210609000602312

扩容:

image-20210609001612371

创建一个新数组,通过transfer方法将老数组里的东西重新放到新数组里,再将新数组放到table

经典面试题:

image-20210609002159907

image-20210609002147607

image-20210609002516888

8.14TreeMap

image-20210609154053574

【2】源码

image-20210609154310464

image-20210609154426937

image-20210609154652498

cmp返回的值是int类型的数据,根据这个值>0 <0继续往左找或者往右找,等于0则将新的value替换到旧的value,key不变

image-20210609154804988

image-20210609154843322

最后把节点放到对应的位置上,结点数量+1

image-20210609155356730

结点类

image-20210609154341397

8.15Collections工具类

image-20210609155955492

构造器私有化,不支持创建对象

image-20210609160121684

image-20210609160247992

sort提供一个排序的方法,从小到大进行排序

binarySearch是二分查找,必须在有序的集合

image-20210609160453013

image-20210609160526316

posted @ 2021-06-09 16:07  wrrr  阅读(84)  评论(0编辑  收藏  举报