Java整理笔记12

Array和ArrayList的区别是什么?


Array是数组,ArrayList是类

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

ArrayList和LinkedList的区别是什么?

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

2.随机访问(即读)效率: ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层 是数组,

可以通过索引号快速访问,LinkedList是通过二 分查找法遍历链表节点进行查找的

3.增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比ArrayList 效率要高,因为ArrayList

增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。4.内存空间占用: LinkedList比ArrayList 更占内存,因为LinkedList

的节点除了存储数据,还存储了两个引用,一个指向前一-个元素,一个指向后一个元素。

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



你知道几种遍历ArrayList的方式

  1. 普通for循环

list.size().for

  1. 增强型for循环

增强型for循环中不需要写循环四要素,不需要手动执行list.get()操作了

  1. forEach循环

list.forEach------>隐式循环

循环存在,在forEach函数中

forEach函数会遍历list

取出每一个值后,他会回调你的

箭头函数,并把值传给箭头函数

的参数

  1. 迭代器

调用iterator()方法,返回一个迭代器对象,使用iterator类声明一个迭代器指针,迭代器的泛型必须和list的泛型保持一致


整理ArrayList和LinkedList的常用方法

数组的封装类 - 列表(ArrayList)

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

数组的封装类 - 列表

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

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

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的具体类型,也可以不给出,

如果给出E的具体类型,是在构造ArrayList对象(声明指针)的时候给出

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

--不给的话E=Object

给出E的具体类型的语法

ArrayList<String> al1 = new ArrayList( );

ArrayList<Car> al2 = new ArrayList( );

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

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

双向链表封装类 - LinkedList

底层:Node对象

构造方法

成员变量

成员方法

LinkedList类中的一个静态内部类    Node  - 节点

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

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

一个Node(节点)对象有三个属性:prve   item   next

成员方法

  1. addFirst 在头部添加
  2. addLast  在尾部添加
  3. add(E)   在尾部追加
  4. add(int,E) 在指定位置插入

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

数组在尾部插入较快,在首部或者中间插入,比较慢,因为要后移

  1. removeFirst( ) 删除头部
  2. removeLast( ) 删除尾部
  3. remove( E) 删除
  4. remove(int,E ) 删除

set( int,E)

get(int)

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

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

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

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

链表不存在扩容和转移,数组需要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值