栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

集合容器 2022.7.4(chapter12)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

集合容器 2022.7.4(chapter12)

Array和ArrayList的区别是什么?

Array是数组,ArrayList是类

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

ArrayList的底层是Array

数组(Array)有什么缺点

(Array)不是类 没有类

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

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

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

4.数组中所有的元素都是同一种类型

数组的封装类 - 列表(ArrayList)!!!      - 构造方法   先研究如何构造对象 (双击shift查看)

ArrayList()

ArrayList(int)

  三个构造方法

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

elementData -- Object [ ] 类型

size -- int类型

两个成员变量

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

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

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

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

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

remove(Object)--根据指针移除

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

添加

ArrayList的扩容策略

 在参数传递的时候,自动向上转型

 

 

删除

 

修改

1.

 

 2.

 

 

查询

做向下转型

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

泛型

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

 -- 作者在编写的时候用E来表达 数据类型的位置

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

如果给出E的具体类型,是在构造ArrayList对象的时候给出

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

        不给的话 E = Object

        给出E的具体数据类型的语法

        ArrayListal1 = new ArrayList();  =  底层数据全是String

        ArrayListal2 = new ArrayList();

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

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

双向链表封装类 - LinkedList

底层:Node 对象

- 构造方法 

  LinkedList ()

 - 成员变量

size -- int类型

first -- Node类型

last -- Node类型

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

- 成员方法

增

1.addFirst(E)在头部添加

2.addLast(E)在尾部添加

3.add(E)在尾部追加

4.add(int,E)在指定位置插入

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

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

删

1.removeFirst(E)删除头部

2.removeLast(E)删除尾部

3.remove(int)根据指定位置删除

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

改

1.set(int,E)

查

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

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

中间插入和删除, 链表优于数组 ,是因为链表不需要大量的前移和后移 查询和修改, 数组优于链表,是因为数组有索引 链表不存在扩容和转移,数组需要

ArrayList和LinkedList的区别是什么?

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

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

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

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

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

遍历ArrayList和LinkedList的几种方式 ArrayList
package chapter12;

import java.util.ArrayList;
import java.util.Iterator;

public class Demo04 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        list.add("张飞");
        list.add("关羽");
        list.add("马超");
        list.add("刘备");
        list.add("黄忠");

        System.out.println("*****遍历方式一:普通for循环*****");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) +" ");
        }
        System.out.println();



        System.out.println("*****遍历方式二:增强型for循环*****");
        for (String item:list){//冒号的左边是一个临时变量String item,这个临时变量的数据类型与list的泛型必须保持一致
            //每循环一次就会自动从list中取出一个元素付给item直到没有下一个元素,循环自动退出
            //1.增强型for循环中不需要写循环四要素
            //2.不需要手动执行list.get()操作了
            System.out.print(item + " ");//不需要手动执行list.get()操作
        }
        System.out.println();



        System.out.println("*****遍历方式三:forEach循环*****");
        //用list调用forEach函数
        //forEach函数的参数是一个箭头函数
        //箭头函数的语法(参数名)-> {}
        //隐式循环,在forEach函数中循环
        //forEach函数会遍历list,取出每一个值后,他会回调你的箭头函数,并把值传给箭头函数的参数
        list.forEach((item)->{
            System.out.print(item +" ");
        });
        System.out.println();



        System.out.println("*****遍历方式四:迭代器*****");
        //调用iterator()方法,返回一个迭代器对象
        //使用Iterator类声明一个迭代器指针,迭代器的泛型必须和list的泛型保存一样
        Iteratoriterator = list.iterator();
        //迭代器的hasNext()方法可以判断是否还有下一个元素
        while (iterator.hasNext()){
            //迭代器next()方法可以取出下一个元素
            String item = iterator.next();
            System.out.print(item + " ");
        }
    }
}

1.普通for循环

2.增强型for循环

3.forEach循环

4.迭代器

LinkedList

package chapter12;

import java.util.Iterator;
import java.util.LinkedList;

public class Demo05 {
    public static void main(String[] args) {
        LinkedListlist = new LinkedList<>();

        list.add("狗");
        list.add("猫");
        list.add("鸡");
        list.add("鱼");
        list.add("鸟");

        System.out.println("*****遍历方式一:普通for循环*****");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();

        System.out.println("*****遍历方式二:增强型for循环*****");
        for (String item:list){
            System.out.print(item +" ");
        }
        System.out.println();

        System.out.println("*****遍历方式三:forEach循环*****");
        list.forEach((item)->{
            System.out.print(item+" ");
        });
        System.out.println();

        System.out.println("*****遍历方式四:迭代器*****");
        Iteratoriterator = list.iterator();
        while (iterator.hasNext()){
            String item = iterator.next();
            System.out.print(item +" ");
        }
        System.out.println();

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006389.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号