zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    程序的版式
    文件结构
    LIB和DLL的区别与使用
    静态链接库
    C++ Vector
    C++ Map
    C++ List
    快速实现十进制向二进制转换
    Fail2ban 运维管理 服务控制
    Fail2ban 配置详解 动作配置
  • 原文地址:https://www.cnblogs.com/wrrr/p/14867324.html
Copyright © 2011-2022 走看看