AiRui 7.04 Java Day12

一. 集合容器:

1.数组(Array)有什么缺点

  1.在创建数组的时候,就需要定死长度,在运行过程中需要判断剩余长度,并动态扩容

  2.在中间插入的时候,需要将后面的元素进行后移

  3.在中间删除的时候,需要将后面的元素进行前移

 2.数组的封装 - 列表(ArrayList)

ArrayList常用方法:

方法名参数说明返回值说明方法功能说明
add(Object element)elemeng成功执行后,此方法返回True,否则返回False向列表的尾部添加指定的元素
size()int返回列表中的元素个数
get(int index)indexint返回列表中指定位置的元素,index从0开始
add(int index, Object element)indexint在列表的指定位置插入指定元素
set(int i, Object element)elementint将索引i位置元素替换为元素element并返回被替换的元素
clear()从列表中移除所有元素
isEmpty()Boolean 值判断列表是否包含元素,不包含元素则返回 true,否则返回false
contains(Object o)o返回结果为true, 若不包含该元素,返回结果为false如果列表包含指定的元素,则返回 true
remove(int index)indexint移除列表中指定位置的元素,并返回被删元素
remove(Object o)oboolean移除集合中第一次出现的指定元素,移除成功返回true,否则返回false
iterator()返回一个迭代器来循环遍历数组列表元素 返回按适当顺序在列表的元素上进行迭代的迭代器

数组的特点:有序的,不唯一的

    构造方法  先研究如何构造对象

      ArrayList()

     ArrayList(int)

    成员变量   研究构造出来的对象中有什么

      elementDate--Object[]类型

      size--int类型

    成员方法   研究如何操作对象中的成员

       add(int)--在数组尾部的第一个不为空的位置添加

       add(int,E)--在数组中的指定位置插入

       set(int,E)--修改数组指定位置

       remove(int)--根据索引号移除

      remove(Object)--根据指针移除,如果存在多个,只会移除第一个

      get(int)--根据指定的索引号找到某个元素并返回

      ArrayList类中的那个"E"到底是什么?

      泛型:

        用泛型来实现类中用到的数据类型的未知

          --作者在编写的时候未知数据类型

         --调用者在使用的时候,可以给出E的具体类型,也可以不给出,不给的话E=Object

               如果给出E的类型,是在声明指针的时候给出

               例如:E=String, E=Car,E=Dog

               不给的话 =E=Object

                给出E的数据类型的语法:

                  ArrayList<String>al1=new ArrayList(); ==>单态的ArrayList()

                  ArrayList<Car>al2=new ArrayList();

      可以是参数类型,可以是返回值类型,可以是任意变量的类型可以是向下转型的类型

      用泛型的好处是:被调用方可以帮调用方写向下转型的代码

          E 指定了就是单态,未指定就是多态

 //{}-->不是null

带参构造方法的源码:

//此时是否需要扩容  是->扩容  否->不扩容  已经完成了

//Array工具类的静态方法 copyOf() ,将原数组中的数据拷贝到新数组中,并返回新数组

 //1.扩容的问题  2.不需要遍历数组,找第一个不为null的位置

//[size++] :官方在对象中维护了一个size变量

删除:

根据索引/下标进行删除源代码:

根据指针进行删除源代码:

修改: 

修改源代码:

 查询:

源代码:

3. 双向链表封装-LinkedList:

LinkedList常用方法整理:

方法名参数说明返回值说明方法功能说明
add()indexboolean(添加成功,返回1;添加失败,返回0)在集合的末尾添加元素
add(int index, E e)

index

e

void在集合的指定索引处添加元素,索引处后面的元素会下移
size()int获取元素的个数(集合的长度)
get(int index)indexE获取指定索引处的元素
contains(E e)eboolean(有,返回1;没有,返回0)判断集合里是否存在指定元素
remove(E e)eboolean(删除成功,返回1;删除失败,返回0)删除指定的元素
remove(int index)indexE删除指定索引处的元素
clear()void清空集合中所有元素
isEmpty()boolean(集合为空,返回true;集合不为空,返回false)判断是否为空
addFirst()void在集合的首部添加元素
addLast()在集合的尾部添加元素void
getFirst()E获取集合中的第一个元素
getLast()E获取集合中的最后一个元素
removeFirst()E删除并返回集合中的第一个元素
removeLast()E删除并返回集合中的最后一个元素

  无参构造构造方法源码:

       

   成员变量:

       

 构造方法:

  

 LinkedList的内部类:

     

 LinkedList类中的一个静态内部类:

Node-类(用于创建双向链表中的节点对象)

     Node<E的类型>node=new Node();

     item=子项

     next指针下一个

    prev指针上一个

   没有无参构造方法,只有一个全参构造方法

   

增:

1.addFirst(E):在头部添加

2.addLast(E):在尾部添加

3.add(E):在尾部追加

4.add(int):在指定位置添加

链表在中间插入的速度要优于数组,只需要找到插入位置的节点,创建新节点,然后修改指针即可

数组在尾部插入新快,但是在首部插入,比较慢,因为需要后移

数组:遍历数组,指定位置后面的元素要后移

链表:遍历链表,指定位置的节点修改指针

  在头部添加源代码:

  在尾部添加源代码:

在尾部追加:

在指定位置插入源代码:

 尾部追加:

 首部追加:

删:

1. removeFirst() 删除头部

2.removeLast() 删除尾部

3.remove[int] 根据指定位置删除

4.remove(Object)根据指定元素删除

删首部:

link--链接

unlink--拆链接

 

删尾部:

删指定的指针:

删指定的索引号:

 改:

set()源代码:

 查:

get(int)链表并没有索引的机制,底层通过遍历链表然后通过二分查找法找到指定位置的节点,并返回节点中的item

从查询角度来看,数组的性能远远优于链表

中间插入和删除,链表优于数组

查询和修改,数组优于链表

源代码:

4. 遍历ArrayList和LinkedList的几种方式:

 1.普通for循环

2.增强型for循环

3.forEach循环

4.迭代器

5. Array和ArrayList的区别是什么?

Array是数组,ArrayList是类
Array是定长的(需要手动扩容),ArrayList长度可变(使用过程中自动扩容)

ArrayList的底层是Array


6. ArrayList和LinkedList的区别是什么?

1.底层数据结构实现︰ArrayList底层数据结构是动态数组,而 LinkedList的底层数据结构是双向链表

2.随机访问(即读)效率∶ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层是数组,可以通过索引号快速访问,LinkedList是通过二分查找法逼历链表节点进行查找的

3.增加和删除效率∶在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。

4.内存空间占用:LinkedList 比 ArrayList更占内存,因为 LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

5.综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值