Java List数据结构与常用方法
1.1 数据结构概述
Java的集合框架其实就是对数据结构的封装,在学习集合框架之前,有必要先了解下数据结构。
1.1.1 什么是数据结构
所谓数据结构,其实就是计算机存储、组织数据的方式。
数据结构是用来分析研究数据存储操作的,其实就是对数据做增删改查操作。
增:把某个数据存储到某个容器中
删:从容器中把某个数据删除掉
改:把容器中某个数据替换成另一个数据
查:把容器中的数据查询出来
开发意识
只要提到容器,那核心操作一定是增删改查。
不同的数据结构,底层采用不同的存储方式(算法),在具体操作的时候效率是不一样的,比如有的查 询速度很快,有的插入速度很快,有的操作头和尾速度很快等。
1.1.2 为什么要熟悉数据结构
常见的数据结构:
. 数组(Array)
链表(Linked List)
哈希表(Hash)
栈(Stack)
队列(Queue)
树(Tree)
图(Graph)
堆(Heap)
在未来具体业务场景时,我们需要分析具体的需求场景,是查询的操作多,还是添加的操作多?如果是 查询操作多,我们就要选择适合查询性能高的集合,如果添加操作多,我们就需要选择添加性能高的集 合。
一句话:根据具体业务场景,选择合适的集合类。
1.2 数据结构
1.2.1 数组的性能分析
在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用大。符号来表 述。
时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法 分析的目的在于选择合适算法和改进算法。
我们在这里针对数组存储数据的增删改查(CRUD)做性能分析:
添加操作:
如果保存在数组的最后一个位置,至少需要操作一次。
如果保存在数组的第一个位置,如果存在N个元素,此时需要操作N次(后面的元素要整体后移)。
平均: (N+1) /2 次。 N表示数组中元素的个数。 如果要扩容,更慢,性能更低。
删除操作:
如果删除最后一个元素,操作一次。
如果删除第一个元素,操作N次。
平均:(N+1) / 2次.
修改操作: 给定索引时,操作1次.
查询操作:根据索引查询元素需要操作1次;根据内容查询需要N次;
结论:基于数组的数据结构做查询是和修改是非常快的,添加和删除操作比较慢了。
那如果想保证保存和删除操作的性能,此时就得提提链表这种数据结构了。
1.2.2 其他线性数据结构
1.2.1. 链表(了解)
链表结构(火车和火车车厢):
1):单向链表,只能从头遍历到尾/只能从尾遍历到头。
2):双向链表,既可以从头遍历到尾,又可以从尾遍历到头。
通过引用来表示上一个节点和下一个节点的关系。
单向链表:
双向链表:
对链表操作的性能分析:
双向链表可以直接获取自己的第一个和最后一个节点。
添加操作
如果新增的元素在第一个或最后一个位置,那么操作只有1次。
删除操作
如果删除第一个元素 :操作一次
如果删除最后一个元素:操作一次
如果删除中间的元素:
① 找到元素节点平均操作: (1+N ) / 2次
② 找到节点之后做删除操作: 1次
修改操作
平均:(N+1)/2次
查询操作:
平均:(N+1)/2次
结论:
数组: 查询、更改较快,新增和删除较慢。
链表: 查询、更改较慢,新增和删除较快。
1.2.2. 队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端 (rear)进行插入操作,队列是一种操作受限制的线性表。
进行添加操作的端称为队尾,进行删除操作的端称为队头。
单向队列(Queue):先进先出(FIFO),只能从队列尾插入数据,只能从队列头删除数据。
双向队列(Deque):可以从队列尾/头插入数据,只能从队列头/尾删除数据。
结论:最擅长操作头和尾。
1.2.3. 栈(了解)
栈(stack)又名堆栈,它是一种运算受限的线性表,后进先出(LIFO),和手枪弹夹类似。
栈结构仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈中插入新元素又称作入栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。从一 个栈中删除元素又称作出栈,表示把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素(LIFO)。
1.3 非线性数据结构
1.3.1. 哈希表
一般的,数组中元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的对 应关系。因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较。
此时的查询效率依赖于查找过程中所进行的比较次数,如果比较次数较多,查询效率还是不高。
如果元素的值(value)和在数组中的索引位置(index)有一个确定的对应关系,我们把这种关系 称之为哈希(hash)。则元素值和索引对应的公式为: index = hash(value)。也就是说,通过给定元素 值,只要调用hash(value)方法,就能找到数组中取值为value的元素的位置。
比如,图中的hash算法公式为: index = value / 10 - 1。
在往哈希表中存储对象时,该hash算法就是对象的hashCode方法。
注:这里仅仅是假设算法公式是这样的,真实的算法公式我们可以不关心。
1.3.4. 树和二叉树
前面我们介绍的数据结构数组、栈、队列,链表都是线性数据结构,除此之外还有一种比较复杂的 数据结构——树。
计算机中的树,是根据生活中的树抽象而来的,表示N个有父子关系的节点的集合。
N为0的时候,该节点集合为空,这棵树就是空树
任何非空树中,有且只有一个根节点(root)
N>1时,一颗树由根和若干棵子树组成,每棵子树由更小的若干子树组成
树中的节点根据有没有子节点,分成两种:
普通节点:拥有子节点的节点。
叶子节点:没有字节点的节点。
二叉树:一种特殊的,遵循某种规则的树。
树的结构因为存在多种子节点情况,真的太复杂了,如果我们对普通的树加上一些约束,比如让每 一棵树的节点最多只能包含两个子节点,而且严格区分左子节点和右子节点(左右位置不能交换),此 时就形成了二叉树。
排序二叉树,有顺序的树:
若左子树不为空,则左子树所有节点的值小于根节点的值。
若右子树不为空,则右子树所有节点的值大于根节点的值。
左右子树也分别是排序二叉树。
红黑树:更高查询效率的的排序二叉树。
排序二叉树可以快速查找,但是如果只有左节点或者左右右节点的时候,此时二叉树就变成了普通 的链表结构,查询效率比较低。为此一种更高效的二叉树出现了——红黑树。
每个节点要么是红色的,要么是黑色的。
根节点永远是黑色的。
. 所有叶子节点都是空节点(null),是黑色的。
每个红色节点的两个子节点都是黑色的。
从任何一个节点到其子树每个叶子节点的路径都包含相同数量的黑色节点。
1.3 集合框架体系
1.3.1 集合框架概述
集合是Java中提供的一种容器,可以用来存储多个数据,根据不同存储方式形成的体系结构,就叫做集 合框架体系。集合也时常被称为容器。
每一种容器类底层拥有不同的底层算法(数据结构)。
既然数组可以存储多个数据,为什么要出现集合?
数组的长度是固定的,集合的长度是可变的。
使用Java类封装出一个个容器类,开发者只需要直接调用即可,不用再手动创建容器类。
集合中存储的数据,叫做元素(element),元素只能是对象(引用类型)。
在Java中,集合操作都被设计成接口,被不同底层数据结构的实现类所实现。
1.3.2 集合的分类
根据容器的存储特点的不同,可以分成三种情况:
. List(列表):允许记录元素的添加顺序,允许元素重复。
. Set(数据集):不记录元素的添加顺序,不允许元素重复。
. Map(映射):容器中每一个元素都包含一对key和value , key不允许重复, value可以重复。严格上 说,并不是容器(集合),是两个容器中元素映射关系。
注意: List和Set接口继承于Collection接口, Map接口不继承Collection接口。
Collection接口:泛指广义上集合,主要表示List和Set两种存储方式。
List接口:表示列表,规定了允许记录添加顺序,允许元素重复的规范。
Set接口:表示狭义上集合,规定了不记录添加顺序,不允许元素重复的规范。
Map接口:表示映射关系,规定了两个集合映射关系的规范。
注意:我们使用的容器接口或类都处于java.util包中。
1.4 List接口
List接口是Collection接口子接口, List接口定义了一种规范,要求该容器允许记录元素的添加顺 序,也允许元素重复。那么List接口的实现类都会遵循这一种规范。
List集合存储特点:
允许元素重复
允许记录元素的添加先后顺序
该接口常用的实现类有:
ArrayList类:数组列表,表示数组结构,底层采用数组实现,开发中使用最多的实现类,重点。
LinkedList类:链表,表示双向列表和双向队列结构,采用链表实现,使用不多。
Stack类:栈,表示栈结构,采用数组实现,使用不多。
Vector类:向量,其实就是古老的ArrayList,采用数组实现,使用不多。
一般来说,集合接口的实现类命名规则:(底层数据结构 + 接口名)例如: ArrayList
1.4.1. List常用API方法
添加操作
. boolean add(object e):将元素添加到列表的末尾
. void add(int index, object element):在列表的指定位置插入指定的元素
. boolean addAll(Collection c):把c列表中的所有元素添加到当前列表中
删除操作
. object remove(int index):从列表中删除指定索引位置的元素,并返回被删除的元素
. boolean removeAll(Collection c):从此列表中移除c列表中的所有元素
修改操作
. object set(int index, object ele):修改列表中指定索引位置的元素,返回被替换的旧元素
查询操作
. int size():返回当前列表中元素个数
. boolean isEmpty():判断当前列表中元素个数是否为0
. object get(int index):查询列表中指定索引位置对应的元素
object[] toArray():把列表对象转换为object数组
. boolean contains(object o):判断列表是否存在指定对象
注意,标红的是经常使用的方法。
1.4.2.ArrayList类
ArrayList类,基于数组算法的列表,通过查看源代码会发现底层其实就是一个object数组。
需求1:操作List接口常用方法
public class ArrayListDemo { public static void main(String[] args) { // 创建一个默认长度的列表对象 List list = new ArrayList(); // 打印集合中元素的个数 System.out.println("元素数量:"+list.size());//0 // 添加操作:向列表中添加4个元素 list.add("Will"); list.add(100); list.add(true); list.add("Lucy"); // 查询操作: System.out.println("列表中所有元素:"+list);//输出 :[Will, 100, true, Lucy] System.out.println("元素数量:"+list.size());//4 System.out.println("第一个元素:"+list.get(0));//Will // 修改操作:把索引为2的元素,替换为wolfcode list.set(2, "wolfcode"); System.out.println("修改后:"+list);//输出 :[Will, 100, wolfcode, Lucy] // 删除操作:删除索引为1的元素 list.remove(1); System.out.println("删除后:"+list);//输出 :[Will, wolfcode, Lucy] } } |
需求2:创建四个User对象,存储在List中,分析内存图。
public class User { private String name; private int age; //省略两个参数构造器 // getter/setter方法 // 需要重写toString方法 } |
public class ArrayListDemo2 { public static void main(String[] args) { List girls = new ArrayList(); User u1 = new User("西施", 18); girls.add(u1); girls.add(new User("王昭君",19)); girls.add(new User("貂蝉",20)); girls.add(new User("杨玉环",21)); System.out.println(girls); //修改u1对象的名字和年龄 u1.setName("小施"); u1.setAge(17); System.out.println(girls); } } |
运行结果(观察变化):
[User [name=西施 , age=18], User [name=王昭君 , age=19], User [name=貂蝉 , age=20], User [name=杨玉环 , age=21]] [User [name=小施 , age=17], User [name=王昭君 , age=19], User [name=貂蝉 , age=20], User [name=杨玉环 , age=21]] |
内存分析,解释原因:
结论:集合类中存储的对象,都存储的是对象的引用,而不是对象本身。
1.4.3.LinkedList类
ArrayList类,基于数组算法的列表,通过查看源代码会发现底层其实就是一个object数组。
LinkedList类,底层采用链表算法,实现了链表,队列,栈的数据结构。无论是链表还是队列主要 操作的都是头和尾的元素,因此在LinkedList类中除了List接口的方法,还有很多操作头尾的方法。
. void addFirst(object e) 将指定元素插入此列表的开头。
. void addLast(object e) 将指定元素添加到此列表的结尾。
object getFirst() 返回此列表的第一个元素。
object getLast() 返回此列表的最后一个元素。
object removeFirst() 移除并返回此列表的第一个元素。
object removeLast() 移除并返回此列表的最后一个元素。
总结:以上API都是返回异常的。
. boolean offerFirst(object e) 在此列表的开头插入指定的元素。
. boolean offerLast(object e) 在此列表末尾插入指定的元素。
. object peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 . object peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 . object pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
. object pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
. void push(object e) 将元素推入此列表所表示的栈。
. object pop() 从此列表所表示的栈处弹出一个元素。
. object peek() 获取但不移除此列表的头(第一个元素)。
LinkedList之所以有这么多方法,是因为自身实现了多种数据结构,而不同的数据结构的操作方法 名称不同,在开发中LinkedList使用不是很多,知道存储特点就可以了。
public class LinkedListDemo { public static void main(String[] args) { LinkedList list = new LinkedList(); //添加元素 list.addFirst("A"); list.addFirst("B"); System.out.println(list); list.addFirst("C"); System.out.println(list); list.addLast("D"); System.out.println(list); //获取元素 System.out.println("获取第一个元素:" + list.getFirst());//C System.out.println("获取最后一个元素:" + list.getLast());//D //删除元素 list.removeFirst(); System.out.println("删除第一个元素后:" + list);//[B, A, D] list.removeLast(); System.out.println("删除最后一个元素后:" + list);//[B, A] } } |
程序运行结果:
[B, A] [C, B, A] [C, B, A, D] 获取第一个元素:C 获取最后一个元素:D 删除第一个元素后: [B, A, D] 删除最后一个元素后: [B, A] |
1.4.4. Stack和Vector类
Vector类:基于数组算法实现的列表,其实就是ArrayList类的前身。和ArrayList的区别在于方法使用 synchronized修饰,所以相对于ArrayList来说,线程安全,但是效率就低了点。
Stack类:表示栈,是Vector类的子类,具有后进先出(LIFO)的特点,拥有push(入栈), pop(出栈) 方法。
1.5. 泛型
1.5.1. 什么是泛型
其实就是一种类型参数 ,主要用于某个类或接口中数据类型不确定时,可以使用一个标识符来表示 未知的数据类型 ,然后在使用该类或接口时指定该未知类型的真实类型。
泛型可用到的接口、类、方法中,将数据类型作为参数传递,其实更像是一个数据类型模板。
如果不使用泛型,从容器中获取出元素,需要做类型强转,也不能限制容器只能存储相同类型的元 素。
List list = new ArrayList(); list.add("A"); list.add("B"); String ele = (String) list.get(0); |
1.5.2. 自定义和使用泛型
定义泛型:使用一个标识符,比如T在类中表示一种未知的数据类型。
使用泛型: 一般在创建对象时,给未知的类型设置一个具体的类型,当没有指定泛型时,默认类型 为Object类型。
需求:定义一个类Point ,x和y表示横纵坐标,分别使用String、 Integer、 Double表示坐标类型。
如果没有泛型需要设计三个类,如下:
定义泛型:
//在类上声明使用符号T,表示未知的类型
//在类上声明使用符号T,表示未知的类型 public class Point<T> { private T x; private T y; //省略getter/setter } |
使用泛型:
// 没有使用泛型(未指明泛型),默认类型是object Point p1 = new Point(); object x1 = p1.getX(); //使用String作为泛型类型(指明泛型为String类型) Point<String> p2 = new Point<String>(); String x2 = p2.getX(); //使用Integer作为泛型类型(指明泛型为Double类型) Point<Integer> p3 = new Point<Integer>(); Integer x3 = p3.getX(); |
画图分析:
注意:这里仅仅是演示泛型类是怎么回事,并不是要求定义类都要使用泛型。
1.5.3. 在集合框架中使用泛型
拿List接口和ArrayList类举例。
class ArrayList<E>{ public boolean add(E e){ } public E get(int index){ } } |
此时的E也仅仅是一个占位符,表示元素(Element)的类型,那么当使用容器时给出泛型就表示该 容器只能存储某种类型的数据。
//只能存储String类型的集合 List<String> list1 = new ArrayList<String>(); list1.add("A"); list1.add("B"); //只能存储Integer类型的集合 List<Integer> list2 = new ArrayList<Integer>(); list2.add(11); list2.add(22); |
因为前后两个泛型类型相同(也必须相同),泛型类型推断:
List<String> list1 = new ArrayList<String>(); 可以简写为 List<String> list1 = new ArrayList<>(); |
通过反编译工具,会发现泛型其实是语法糖,也就是说编译之后,泛型就不存在了。
注意:泛型必须是引用类型,不能是基本数据类型(错误如下):
List<int> list = new ArrayList<int>();//编译错误 |
泛型不存在继承的关系(错误如下):
List<object> list = new ArrayList<String>(); //错误的 |
相关文章:

Java List数据结构与常用方法
1.1 数据结构概述 Java的集合框架其实就是对数据结构的封装,在学习集合框架之前,有必要先了解下数据结构。 1.1.1 什么是数据结构 所谓数据结构,其实就是计算机存储、组织数据的方式。 数据结构是用来分析研究数据存储操作的,其实…...

Docker搭建redis-cluster集群
1. 前期准备 1.1 拉redis镜像 docker search redis docker pull redis1. 2 创建网卡 docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡 docker network inspect myredisdocker network rm myredis #删除网卡命令 多个中间 空格隔开 docker network --h…...

实验室类管理平台LIMS系统的ui设计实例
实验室类管理平台LIMS系统的ui设计实例...
<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序
前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…...

Linux - 文件管理高级 find、grep
0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时,默认进行递归查找,会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …...
DOS编程入门:探索基础、深入技巧与实战应用
DOS编程入门:探索基础、深入技巧与实战应用 DOS编程,作为计算机编程的基石之一,对于初学者来说,既是一种挑战,也是一次深入了解计算机底层运作的绝佳机会。本文将从四个方面、五个方面、六个方面和七个方面࿰…...
创建线程的技术难点
在软件开发中,创建线程并正确地管理它们是一个复杂而关键的任务,涉及的技术难点主要有: 线程同步:当多个线程需要访问共享资源时,必须确保它们以某种方式同步,以避免数据不一致或其他并发问题。例如&#…...
Android ViewPager和ViewPager2的区别
一、实现方式 ViewPager内部是通过继承ViewGroup来实现的,ViewPager2内部是通过RecyclerView来实现的(效率更高) 二、支持方向 ViewPager只能横向滑动,ViewPager2可以横向以及竖向滑动 三、采用的适配器 ViewPager有两个适配…...
Oracle数据库面试题-3
41. 请解释Oracle数据库中的内存顾问(Memory Advisor)的作用。 Oracle 数据库中的内存顾问(Memory Advisor) Oracle 数据库中的内存顾问是一个功能,它可以分析数据库的内存使用情况,并提供优化建议&#…...
21.过拟合和欠拟合示例
1. 背景介绍 在机器学习和深度学习中,过拟合和欠拟合是两个非常重要的概念。过拟合指的是模型在训练数据上表现很好,但在新的测试数据上效果变差的情况。欠拟合则是指模型无法很好地拟合训练数据的情况。这两种情况都会导致模型无法很好地泛化ÿ…...

使用import语句导入模块
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 创建模块后,就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码,这可以使用import语句实现。im…...

一台FreeBSD笔记本突然鼠标乱动=>pf防火墙设置@FreeBSD
缘起 一台FreeBSD的笔记本,突然鼠标乱动 思考了下,可能原因有三: 1 无线鼠标干扰 正巧没带鼠标,但是插着无线鼠标usb,不知道是不是别人的鼠标跟这个usb串台了。 2 触摸板机械故障 也许是天热触摸板开始有故障了&…...
身份证OCR识别功能介绍
身份证OCR识别功能是一种基于光学字符识别(OCR)技术的解决方案,专门用于从身份证图像中快速、准确地提取和识别信息。以下是关于身份证OCR识别功能的详细介绍: 功能概述 身份证OCR识别功能通过高分辨率的摄像头或扫描仪获取身份证…...

一文看懂:MES定义和功能是什么,以及在数字化工厂的应用
MES应该是继ERP之后制造企业信息化最热门的管理软件,它适应产品个性化与敏捷化制造需求,满足生产过程精益管理而产生和发展起来的信息系统。 作为企业实现数字化与智能化的核心支撑技术与重要组成部分,MES在帮助制造企业走向数字化、智能化等…...

对 SQL 说“不”~
开发人员注意! 您在当前的应用程序架构中是否面临这些问题? 对 SQL 数据库的高吞吐量。SQL 数据库中的瓶颈。 内存数据存储将是解决问题的方案。Redis 是市场上最受欢迎的内存数据存储和缓存选项。Redis 拥有广泛的生态系统,因为主要科技巨…...

【爱空间_登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...

web前端三大主流框架
一、介绍 目前,前端开发领域的三大主流框架是: React:React是由Facebook开发并维护的开源JavaScript库,用于构建用户界面。它提供了一种声明式的组件化开发方式,能够高效地创建交互性的用户界面。React具有高性能、可…...

git获取的项目无法运行
一、Unsupported engine 问题:在使用命令npm install下载依赖项的时候就遇到了这个问题,有帖子说多试几次,其实这是提示node版本问题,版本的更新出现兼容性问题,多试几次也没用。 解决方案: 更新node.js的…...

java 原生http服务器 测试JS前端ajax访问实现跨域
后端 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.io.OutputStream; import java…...

捋一捋C++中的逻辑运算(一)——表达式逻辑运算
注意,今天要谈的逻辑运算是C语言编程中的“与或非”逻辑运算,不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算,本章介绍表达式逻辑运算,下一章介绍位逻辑运算。 目录 一、几个基本的概…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...