隐藏

集合(list接口)
2022年 02月 24 日

Calvin

List接口:存储有序、可重复数据。

  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

List接口特有常用方法:(由于继承了Collection接口,所以Collection接口下的方法他也可以使用)

*.get(index):根据下标获取元素值
*.indexOf(*):XX值在某个集合中首次出现某元素的位置
*.lastIndexOf(*):XX值从末尾开始往前遍历,首次出现的位置
*.remove(int index)移除指定index位置的元素,并返回此元素

示例:`Object remove = list.remove(1);`

*.set(int 下标, Object 替换值)设置指定index位置的元素为指定替换值
*. add(int index, Object *):在index位置插入指定的元素
*.subList(int fromIndex, int toIndex)返回从fromIndex到toIndex位置的左闭右开区间的子集合(前包含后不包含)

示例:`List zijihe = list.subList(1, 2);`

boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来,返回一个布尔值来表示是否操作成功


ArrayList:作为List主要实现类,底层是动态数组实现,线程不安全

ArrayList源码分析:
当:ArrayList list = new ArrayList();
第一步:底层创建Object[] elementData,默认{} ,没有指定长度。
第二步:当调用list.add("abc"); 创建长度为10的数组,并赋值
第三步:填入数据。。。。。。
第四步:当数据将此集合容量填满时,集合容量会扩大为原来的1.5倍

---

LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储

LinkedList list = new LinkedList(); 内部声明了Node类型的first和last属性,默认值为null

`list.add(123);`将123封装到Node中,创建了Node对象。其中,Node定义为:体现了LinkedList的双向链表的说法
  • 和Arraylist不同的是,其底层实现并不是数组,而是双向链表,所以自然也没有扩容什么的相关操作
  • 双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量: prev变量记录前一个元素的位置,next变量记录下一个元素的位置

Vector:(弃用)作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。

Vector扩容是原数组的两倍

  • 请问ArrayList/LinkedList/Vector的异同?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?

    • ArrayList和LinkedList的异同

      • 二者都线程不安全,相对线程安全的Vector,执行效率高。
      • ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于
        随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增
        和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
    • ArrayList和Vector的区别

      • Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于
        强同步类。访问要慢。
      • Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack

集合(list接口)

List接口:存储有序、可重复数据。

  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

List接口特有常用方法:(由于继承了Collection接口,所以Collection接口下的方法他也可以使用)

*.get(index):根据下标获取元素值
*.indexOf(*):XX值在某个集合中首次出现某元素的位置
*.lastIndexOf(*):XX值从末尾开始往前遍历,首次出现的位置
*.remove(int index)移除指定index位置的元素,并返回此元素

示例:`Object remove = list.remove(1);`

*.set(int 下标, Object 替换值)设置指定index位置的元素为指定替换值
*. add(int index, Object *):在index位置插入指定的元素
*.subList(int fromIndex, int toIndex)返回从fromIndex到toIndex位置的左闭右开区间的子集合(前包含后不包含)

示例:`List zijihe = list.subList(1, 2);`

boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来,返回一个布尔值来表示是否操作成功


ArrayList:作为List主要实现类,底层是动态数组实现,线程不安全

ArrayList源码分析:
当:ArrayList list = new ArrayList();
第一步:底层创建Object[] elementData,默认{} ,没有指定长度。
第二步:当调用list.add("abc"); 创建长度为10的数组,并赋值
第三步:填入数据。。。。。。
第四步:当数据将此集合容量填满时,集合容量会扩大为原来的1.5倍

---

LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储

LinkedList list = new LinkedList(); 内部声明了Node类型的first和last属性,默认值为null

`list.add(123);`将123封装到Node中,创建了Node对象。其中,Node定义为:体现了LinkedList的双向链表的说法
  • 和Arraylist不同的是,其底层实现并不是数组,而是双向链表,所以自然也没有扩容什么的相关操作
  • 双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量: prev变量记录前一个元素的位置,next变量记录下一个元素的位置

Vector:(弃用)作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。

Vector扩容是原数组的两倍

  • 请问ArrayList/LinkedList/Vector的异同?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?

    • ArrayList和LinkedList的异同

      • 二者都线程不安全,相对线程安全的Vector,执行效率高。
      • ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于
        随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增
        和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
    • ArrayList和Vector的区别

      • Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于
        强同步类。访问要慢。
      • Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论