Java 集合(List与LinkedList)接口详解

2023-10-30

List接口

List接口的定义
List interface List extends Collection
通过观察List接口的定义发现其继承得是Collection接口
List、Set、Queue接口继承的都是Collection接口
Collection接口常用方法

1. public boolean add(E e);  //添加元素到集合
2. public boolean addAll(Collection<? extends E> c); //存放一个集合
3. public boolean contains(Object o);  //查找集合中的元素
4. public boolean isEmpty();  //判断一个集合是否为空
5. public boolean remove(Object 0);//删除一个集合中的元素
6. public int size();//返回集合的长度

List接口中的方法
List接口拓展了Collection接口中的方法

1. public E get(int index); //根据索引取得元素
2. public E set(int index,E element);//替换元素,index为要替换元素下标 element为要替换元素
3. public ListIterator<E> listIterator() List //List自己的迭代器

List 接口的特点是:可重读的,有序的

使用List list本身是一个接口,如果想要使用一个接口则可以使用该接口的实现类完成
重点实现类:ArrayList LinkedList Vector

package java8_7.Collection.List;

import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {
    public static void main(String[] args) {
        List<Integer> list =new ArrayList<>();
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(4);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

运行结果为

4
5
6
4

可见,ArrayList 的特点是可重复的,有序的,顺序就是储存添加时候的数据
通过一个add 添加到集合,通过get(index)取出集合中的元素 下标的位置从0开始

其他的一些方法

 package java8_7.Collection.List;

import java.util.ArrayList;
import java.util.List;

public class ListDemo2_function {
    public static void main(String[] args) {
        List<Integer> array = new ArrayList<>();
        System.out.println("array是否为空:"+array.isEmpty());
        array.add(4);
        array.add(5);
        array.add(5);
        System.out.println(array.remove(1));
        array.add(1);
        System.out.println(array.isEmpty());
        System.out.println(array);
    }
}

执行结果为

array链表是否为空:true
5
false
[4, 5, 1]

可见ArrayList是一个对象数组,每次增加的时候,会给数组扩容,数组长度是不能改变的,每次扩容数组内容拷贝工作,但是一个ArrayList如果频繁添加内容,效率不高。但是查询的时候由于底层是数组,所以查询效率很高。
并期添加数组都是从链表后方加,不会添加到链表中间位子

public class Person {
    private String name;
    private int age;
    public Person(String name ,int age){
        this.name=name;
        this.age=age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "name:"+name+"age"+age;
    }

    @Override
    public boolean equals(Object obj) {    // 传进来要比较的内容
        // TODO Auto-generated method stub

        Person per=null;   
        if(obj instanceof Person) {

            per=(Person)obj;  // Object 向下转型 为 Person类型
        }
        // this 当前的对象 Person  和 传进来的Person比较
        if(this==per) {  //内存地址 一样肯定是同样对象 

            return true;
        }

        if(this.age==per.age&&this.name.equals(per.name)) {

            return true;
        }

        return false;
    }
}

重写Object中的equals方法 判断两个对象是否相同的语句为per=(Person)obj
若相同再比较this==per this里面有两个属性,即name age
写一个测试类

import java.util.ArrayList;
import java.util.List;

public class TestPerson {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("和尚",20));
        list.add(new Person("jacky",30));
        list.add(new Person("Sanny",40));
        System.out.println(list.remove(new Person("Sanny",40)));
        System.out.println(list.contains(new Person("和尚",20)));
        for (Person per:list
             ) {
            System.*out*.println(per);
        }

    }
}

结果:

true
true
name:和尚,age20
name:jacky,age30

通过代码,发现自定义类的时候,必须覆写equals()方法才能完成集合中对对象查找和删除,主要是在于进行对象删除的时候,集合中会判断传入的元素和集合本身是否是内容相同的元素,只有相同才会删除或者查找


LinkedList接口

这个子类是基于链表的体现 指针节点的形式 指针-节点->>
LinkedList也是可重复的有序的,顺序是储存顺序
以下为LinkedList类的定义
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>,Cloneable,Serializable
接口定义:标准、能力、对外暴露方法
Cloneable 进行对象克隆的时候,必须实现接口,才有克隆的能力
Serializable:要实现序列化的类,必须实现接口才能能有序列化的的能力

特点: 插入方便,任意节点之间都可以插入,但是查询并不方便,效率不高
LinkedList的常用方法
1. public void addFirst(E e);
2. public void addList(E e);

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        LinkedList<String> list =new LinkedList<>() ;
        list.add("hello");
        list.add("world");
        list.add("java");
        list.addFirst("first");
        list.addLast("last");
        for (String str:list){
            System.*out*.println(str);
        }
    }

}

经过对比,ArrayList和LinkedList有什么区别?
1. ArrayList 是基于数组开发的,查询效率很高,但是修改数据效率会低一些
2. LinkedList 是基于链表开发的,两端插入的时候效率很高,但是查询效率会低一些

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 集合(List与LinkedList)接口详解 的相关文章

随机推荐

  • 查看linux主机多少位,linux怎么查看系统是32位还是64位的方法

    可以用命令 getconf LONG BIT 查看 如果返回的结果是32则说明是32位 返回的结果是64则说明是64位 此外还可以使用命令 uname a 查看 输出的结果中 如果有x86 64就是64位的 没有就是32位的 查看linux
  • Apache Shiro 英文摘抄

    1 Are you frustrated fr streitId懊丧 懊恼 沮丧 when you try to secure your applications 2 This article introduces Apache Shiro
  • 盲打+免费打字网站

    hello 大家好呀 这边说说盲打哦 距离我开始练习打字已经过了一年的时间啦 经过这一年断断续续的练习 慢慢形成了肌肉记忆 可以不看键盘并熟练的打字了 接下来就向大家介绍我学会盲打的方法 这里多嘴一句 网上有很多打字速成的方法 曾经的我也想
  • django框架链接mysql数据库,简单建立表格

    1 找到项目中settings py文件中DATABASES 字典 对内容进行修改 2 通过django建立表格 lt 1 gt 找到app项目中models py lt 2 gt 创建类 写入所需要的列 一个属性对应表中一列 3 表格类写
  • docker笔记-随笔

    构建dockerfile docker build t sul gateway v1 0 将本地主机文件copy到容器中 docker cp 文件 容器id 容器目录 docker cp sul gateway jar ce3a895f9a
  • 正常关闭电源失效,强行关闭虚拟机电源

    三种方法 可以任选一种执行操作 1 后台开启Troubleshooting options 使用Alt F1登录 或者使用SSH工具登录 查看进程 ps grep vmx more 如果知道虚拟机名可以直接grep vmname 杀死进程
  • Android中获取文件路径的方法总结及对照

    最近在写文件存贮 Android中获取文件路径的方法比较多 所以自己也很混乱 找了好几篇博客 发现了以下的路径归纳 记录一下 以备不时之需 Environment getDataDirectory data Environment getD
  • EasyX的下载与使用教程网址

    一 下载 下载网址 EasyX Graphics Library for C 1 点击右侧红色方框里的下载EasyX 2 下载成功后 进行点击 会出现以下界面 在点击下一步 点击安装就成功了 二 使用教程 EasyX 文档 使用教程 该网址
  • oneforall安装使用

    如遇到 安装出错 0x80070643 https www cnblogs com emanlee p 11422646 html 此软件需要python3环境 安python时 需要配置环境变量 此步在安装时即可勾选 在安装后 直接运行o
  • orbslam2段错误 (核心已转储)

    删除掉ORBSLAM的cmakelists中的 march native 以及 g2o 的cmakelists中的 march native 重新执行ORBSLAM目录下的 build sh 后就可以正常跑了
  • 第四届蓝桥杯(2013)-省赛题解_C/C++__大学A组

    目录 感悟总结 一 高斯日记 填空题 二 排它平方数 填空题 三 振兴中华 填空题 四 颠倒的价牌 填空题 五 前缀判断 代码补充 六 逆波兰表达式 代码补充 七 错误票据 八 买不到的数目 九 剪格子 十 大臣的旅费 感悟总结 蓝桥杯有大
  • cpu.h-栈的宏定义-满减栈

    常常两两相对的东西 整一起后有点记不住 就写下来 cpu h中有宏定义使用哪种栈 define OS STK GROWTH 1 Stack grows from HIGH to LOW memory on ARM 栈的四种 满栈 满 字表示
  • 错误解决:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]

    今天又是快乐改错误的经历 在做k means进行图片压缩的实战项目中 我遇到了这样一个pyplot显示图像报错问题 Clipping input data to the valid range for imshow with RGB dat
  • Python中的字典用法

    文章目录 一 字典的定义 二 字典的创建 2 1 一个简单的字典 2 2 字典的嵌套 三 字典的特性 3 1 字典不支持切片 3 2 成员操作符 3 3 for循环遍历 四 字典元素的增加 五 字典元素的删除 六 字典元素的查看 七 字典的
  • 制作最简单的Git Server

    网上看到的Git Server部署方法一大堆 一会儿搞什么SSH 还要弄私钥公钥 复杂无比 其实有一个办法非常简单 如果是在公司内网环境下 需要将某台机器部署为Git Server 我们称该机器为服务器 假设IP为192 168 0 111
  • uni-app前端用户登录实现

    从0开始开发SpringBoot vue前后端分离项目 后端 Springboot简单实现用户登录操作 文章目录 从0开始开发SpringBoot vue前后端分离项目 后端 1 HBuildX uni app创建项目 一 项目目录结构 二
  • LinearLayer

    线性层的作用 类似于这边荧光绿的两层 就是fully connected layer 将1 1 4096的向量 变成1 1 1000的向量 代码示例 import torch import torchvision from torch im
  • dwr 使用 callback 多个参数(间接方法)

    dwrInvokeDataClaimAction findSupplierByName payee callback function returnData bringOutSupplierCallback returnData arg1
  • 【Redis】List类型和底层原理

    文章目录 List类型 1 List介绍 1 1常用命令 2 List底层实现 3 ziplist剖析 3 1ziplist结构 3 2创建一个空的ziplist 3 3ziplist的元素节点结构 3 4ziplisqt的连锁更新 3 5
  • Java 集合(List与LinkedList)接口详解

    List接口 List接口的定义 List interface List extends Collection 通过观察List接口的定义发现其继承得是Collection接口 List Set Queue接口继承的都是Collection