当前位置: 首页 > news >正文

14.集合、常见的数据结构

集合

概念

Java中的集合就是一个容器,用来存放Java对象。

集合在存放对象的时候,不同的容器,存放的方法实现是不一样的,

Java中将这些不同实现的容器,往上抽取就形成了Java的集合体系。

Java集合中的根接口:Collection 和 Map

Collection是一个单值集合,每次添加只能存放一个值进去

Map是一个双值集合,每次添加可以添加一对数据到Map

Collection介绍

1.由来

Java是一个面向对象语言,将来肯定会处理对象。

为了方便操作多个对象,就需要把这些对象存储起来,存储多个对象,就需要一个容器

Java之前提供了数组、StringBuffer这两个容器,但是他们用来存放对象不是很方便

所以,Java就提供了Collection集合。

2.数组和集合的区别

长度区别:

数组的长度是固定的

集合的长度可变的

内容不同:

数组存储的是同一种数据类型

集合可以存储不同类型的元素

元素的数据类型不同:

数组可以存放基本类型、引用类型

集合只能存放引用类型,如果存放int类型,默认会被提升为Integer

3.Collection的发展

集合可以存放多个元素,但是在存放的时候也会有不同的需求,

比如:多个元素不能重复、多个元素按照规则排序...

根据不同的需求,Java中提供了很多的集合类

每个集合根据需求,使用不同的数据结构,不管什么数据结构,他们都有一些共同的功能,

比如可以添加、删除、判断...

所以Collection其实就是把不同集合类的共同内容不断往上抽取,

最终,形成了集合的继承体系。

Collection中子接口、子类比较多,只需要掌握常用的一些集合类

Collection

--Set

--HashSet

--TreeSet

--LinkedHashSet

--List

--ArrayList

--LinkedList

4.Collection的功能

(1)添加

boolean add(E e)

确保此集合包含指定的元素(可选操作)。

boolean addAll(Collection<? extends E> c)

将指定集合中的所有元素添加到此集合(可选操作)。

(2)获取

Iterator<E> iterator()

返回此集合中的元素的迭代器。

(3)判断

boolean contains(Object o)

如果此集合包含指定的元素,则返回 true 。

boolean containsAll(Collection<?> c)

如果此集合包含指定 集合中的所有元素,则返回true。

boolean isEmpty()

如果此集合不包含元素,则返回 true 。

(4)大小

int size()

返回此集合中的元素数。

(5)移除

void clear()

从此集合中删除所有元素(可选操作)。

boolean remove(Object o)

从该集合中删除指定元素的单个实例(如果存在)(可选操作)。

boolean removeAll(Collection<?> c)

删除指定集合中包含的所有此集合的元素(可选操作)。

default boolean removeIf(Predicate<? super E> filter)

删除满足给定谓词的此集合的所有元素。

package com.day14.collet;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionDemo01 {public static void main(String[] args) {//多态的方式创建Collection对象Collection c = new ArrayList();//调用方法//添加c.add(123);c.add("hello");c.add(new Person("jack"));c.add(2.58);c.add(null);c.add("hello");System.out.println(c);//判断包含boolean b1 = c.contains("hello");System.out.println(b1);//判断是否为空boolean b2 = c.isEmpty();System.out.println(b2);//大小System.out.println(c.size());//        //移除//        c.remove("hello");//移除指定内容//        System.out.println(c);////        c.clear();//        System.out.println(c);//清除全部System.out.println("---------------------");//遍历 获取ArrayList arrayList =(ArrayList) c;for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}System.out.println("---------------------");//增强forfor (Object o : c){System.out.println(o);}System.out.println("---------------------");//iteratorIterator iterator = c.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}//创建一个指定存储类型的集合//指定之后,这个集合中只能存放StringCollection<String> c1 = new ArrayList();c1.add("hello");//c1.add(123);c1.add("world");c1.add("world");c1.add("java");System.out.println("---------------------");//遍历for (String s : c1) {System.out.println(s);}System.out.println("---------------------");//迭代器遍历Iterator<String> iterator1 = c1.iterator();while (iterator1.hasNext()){System.out.println(iterator1.next());}}
}

Collection中迭代器原理 iterator()

1,iterator() 方法,继承自Iterable接口,这个接口主要用来规定对于迭代获取的规则接口

2, Iterator<T> iterator(); 这个方法的返回值是一个 Iterator对象

Iterator也是一个接口,提供了两个抽象方法,分别是hasNext() 和 Next()方法

3,当我们使用多态创建Collection对象,

Collection<String> c1 = new ArrayList();

然后使用c1调用iterator()方法做迭代的时候,实际上调用的是ArrayList()中重写的iterator()方法

ArrayList的iterator()方法,重写之后,返回了 new Itr(); 也就Itr是一个类,并且这个类一定是Iterator接口的实现类

往下看,发现,在ArrayList内部声明了一个内部类,Itr 并且实现了Iterator接口,重写了 hasNext() 和 Next()方法

hasNext()方法是在判断,cursor是否移动最后了

next()方法,是在以数组下标的方式取出元素,并返回,同时给cursor做增加(往后移动)

常见的数据结构

将来,不同的集合

栈结构:先进后出,入口和出口在同一侧

队列结构:先进先出,入口和出口不在同一侧

数组结构:存放元素通过下标来存放,获取元素通过下标获取

查询快:数组中的元素存放是连续的,通过数组的下标快速找到指定的元素

增删慢:数组的长度是固定的,增删的时候,其实是在做数组复制

数组做增删操作:

1.先创建一个新数组,然后将老数组的内容复制到新数组中

2.再往新数组中添加内容

3.删除则是往新数组中复制指定的内容

链表结构:链表中的每个元素,称为一个节点,就是一个类 Node类

一个节点中,包含一个数据区,还有两个指针区,就是类的属性

特点:

查询慢:查询元素需要一个个往下遍历获取,需要遍历的次数比较多

增删快:增删元素的时候,只需要修改节点中的引用地址就行了

单向链表:节点中,只有一个地址,指向下个地址

双向链表:节点中,有两个地址,一个指向上一个节点,一个指向下一个节点,

LinkedList使用了双向链表

package com.day14.jiegou;public class Node {Node pri;Object data;Node next;public Node(Object data, Node addr) {this.data = data;this.next = addr;}public Node(Node pri, Object data, Node next) {this.pri = pri;this.data = data;this.next = next;}public void add(Object o){//第一次添加Node node = new Node(null,"hello",null );//第二次添加Node node1 = new Node(node,"java", null);node.next = node1;//第二次添加Node node2 = new Node(node1,"oracle", null);node1.next = node2;}}

树结构:有多个节点组成,具有层次关系的一种结构。

特点:

因为组成的结构,看起来像一棵倒挂的树,也就是根朝上,叶子朝下,称为树结构。

每个节点都有零个或多个子节点,没有父节点的节点成为根节点, 每个非根节点,有且仅有一个父节点,除了根节点之外,每个子结点都可以分为多个不相交的子树。将来应用中,主要使用的是二叉树。

二叉树特点:添加、删除元素都很快,查找也有很多算法优化,所以二叉树既有集合的好处,也有数组的好处,是两者的优化方案,处理大批量的动态数据应用很多。

二叉树扩展:平衡二叉树、红黑树、B+树..

B+树是MySQL底层索引结构

红黑树是HashMap的底层结构

红黑树特点:查询很快,查询叶子节点的最大次数和最小次数不超过2倍。节点是红色或者黑色,根节点是黑色,叶子节点是黑色,每个红色节点的子节点都是黑色,任何节点到每个叶子节点路径上的黑色节点数相同。

List接口

List集合的特点:有序(存取有序),可以重复的,可以有null,用户可以通过索引(类似于数组下标)精确地访问或者操作List中的元素

常用子类

ArrayList:底层数据结构是数组,线程不安全。

LinkedList:底层数据结构是双向链表,线程不安全

Vector:底层数据结构是数组,线程安全

ArrayList

构造方法

ArrayList()

构造一个初始容量为十的空列表。

ArrayList(Collection<? extends E> c)

构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。

ArrayList(int initialCapacity)

构造具有指定初始容量的空列表。

普通方法

boolean add(E e)

将指定的元素追加到此列表的末尾。

void add(int index, E element)

在此列表中的指定位置插入指定的元素。

E get(int index)

返回此列表中指定位置的元素。

int indexOf(Object o)

返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

Iterator<E> iterator()

以正确的顺序返回该列表中的元素的迭代器。

ListIterator<E> listIterator()

返回列表中的列表迭代器(按适当的顺序)。

E remove(int index)

删除该列表中指定位置的元素。

boolean remove(Object o)

从列表中删除指定元素的第一个出现(如果存在)。

int size()

返回此列表中的元素数。

E set(int index, E element)

用指定的元素替换此列表中指定位置的元素。


package com.day14.list;import com.day14.collet.Person;import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;public class ArrayListDemo {public static void main(String[] args) {//创建ArrayList对象ArrayList arrayList = new ArrayList();//调用方法//int size()//返回集合中的实际有几个元素。System.out.println(arrayList.size());//add()arrayList.add(123);arrayList.add("java");arrayList.add("hello");//arrayList.add(5,"oracle");//不能跳着添加arrayList.add(3,"oracle");arrayList.add(null);arrayList.add("java");System.out.println(arrayList);//get()System.out.println(arrayList.get(3));//set()arrayList.set(3,"spring");System.out.println(arrayList);//remove()arrayList.remove(2);System.out.println(arrayList);//通过iterator()方法遍历Iterator iterator = arrayList.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("-------------------");//从前向后遍历ListIterator listIterator = arrayList.listIterator();while (listIterator.hasNext()){System.out.println(listIterator.next());}System.out.println("-------------------");//从后向前遍历while (listIterator.hasPrevious()){System.out.println(listIterator.previous());}//从中ArrayList存入对象ArrayList<Person> list = new ArrayList<>();Person p1 = new Person("jack");Person p2 = new Person("Tom");Person p3 = new Person("Lucy");list.add(p1);list.add(p2);list.add(p3);System.out.println(list);}
}

ArrayList源码分析

属性

默认初始容量

private static final int DEFAULT_CAPACITY = 10;

空实例对象共享的一个空数组

private static final Object[] EMPTY_ELEMENTDATA = {};

默认大小的空示例共享的一个共数组

用来区分传入具体的空间参数值的,这样可以知道将来存放第一个元素

之后,需要创建多大的空间

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

表示当前的arrayList对象

transient Object[] elementData;

当前arrayList中的真实空间大小

private int size;

1,new ArrayList 新创建的ArrayList对象就是空数组,容量为0

2,添加元素

public boolean add(E e) {

ensureCapacityInternal(size + 1); // Increments modCount!!

elementData[size++] = e;

return true;

}

add方法中,

第一步先调用 ensureCapacityInternal(size + 1);

第二步将传递进来的元素赋值到数组中的索引上

第三步返回结果true

private void ensureCapacityInternal(int minCapacity) {

ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));

}

ensureCapacityInternal方法将传递过来的 size+1 在传入

calculateCapacity(elementData, minCapacity) 计算空间,计算完传入

ensureExplicitCapacity();

private static int calculateCapacity(Object[] elementData, int minCapacity) {

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

return Math.max(DEFAULT_CAPACITY, minCapacity);

}

return minCapacity;

}

calculateCapacity方法的判断是,将当前size+1之后,和默认的空间做比较

返回一个大的值,带入到ensureExplicitCapacity()方法中做计算

private void ensureExplicitCapacity(int minCapacity) {

modCount++;

// overflow-conscious code

if (minCapacity - elementData.length > 0)

grow(minCapacity);

}

ensureExplicitCapacity这个方法会将传递过来的空间值和当前数组的长度做比较

如果传递过来的空间值,比当前数组的长度大,就开始扩容

ArrayList的扩容方式:

如果默认创建无参构造ArrayList,开始是空数组,没有内容,空间为0,

当调用add方法加入第一个元素,通过计算空间方法,开始扩容,扩容到10,

当10个元素放满了,放入第11个元素,继续下次扩容,扩容为原来的1.5倍,

扩容的时候,其实是在使用数组复制功能。

ArrayList总结

ArrayList底层是一个可以动态扩容的数组,可以存放任意类型的元素,可以存放null元素,存取有序,元素可以重复,线程是不安全的。

创建无参构造ArrayList,默认初始空间为0,放入第一个元素,扩容为10,后续元素放满后,放入下一个元素会继续扩容,扩容1.5倍。

如果知道集合中存放的内容是多少,可以在初始化的时候,指定它的初始空间,可以提升效率。

效率上,非首尾元素增删慢,查询快,可以根据索引快速找到元素

ArrayList和Vector区别

Vector是一个比较老的集合类,jdk1.2

Vector底层也是数组,和ArrayList的最大区别就是,方法前面有Synchronized,

也就是方法是同步的,线程安全

相对来说,效率比ArrayList低

扩容上来说,Vector每次扩容2倍

LinkedList

说明:

1.底层是双向链表,可以存放任意类型元素

2.可以存放null元素,存取有序,元素可以重复,线程不安全

3.效率上,查询慢,增删快

4.结构上,它实现了Deque接口,因此LinkedList中还具有类似于操作队列和栈一样的方法

既然是链表,LinkedList中必然含有Node节点对象

private static class Node<E> {

E item; //节点中数据对象

Node<E> next; //当前节点的下一个节点

Node<E> prev; //当前节点的上一个节点

Node(Node<E> prev, E element, Node<E> next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

构造方法

LinkedList()

构造一个空列表。

普通方法

boolean add(E e)

将指定的元素追加到此列表的末尾。

void add(int index, E element)

在此列表中的指定位置插入指定的元素。

void addFirst(E e)

在该列表开头插入指定的元素。

void addLast(E e)

将指定的元素追加到此列表的末尾。

E get(int index)

返回此列表中指定位置的元素。

E getFirst()

返回此列表中的第一个元素。

E getLast()

返回此列表中的最后一个元素。

boolean offer(E e)

将指定的元素添加为此列表的尾部(最后一个元素)。

boolean offerFirst(E e)

在此列表的前面插入指定的元素。

boolean offerLast(E e)

在该列表的末尾插入指定的元素。

E pop()

从此列表表示的堆栈中弹出一个元素。

void push(E e)

将元素推送到由此列表表示的堆栈上。

package com.day14.list;import java.util.LinkedList;
import java.util.ListIterator;public class LinkedListDemo {public static void main(String[] args) {//创建一个LinkedList对象,存放String类型的元素LinkedList<String> linkedList = new LinkedList<>();//调用方法//addlinkedList.add("hello");linkedList.add("world");linkedList.add("java");System.out.println(linkedList);linkedList.addFirst("spring");linkedList.addLast("mysql");System.out.println(linkedList);//push方法相当于addFirstlinkedList.push("abc");linkedList.push("oracle");//往里加System.out.println(linkedList);//pop方法,弹栈,会将第一个元素取出linkedList.pop();//取出System.out.println(linkedList);//普通的get方法,并不会取出元素,只是获取了元素内容System.out.println(linkedList.get(1));System.out.println(linkedList);//getFirst获取第一个元素,不会将元素弹出System.out.println(linkedList.getFirst());System.out.println(linkedList);//遍历for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(1));}System.out.println("---------------------");for (String s : linkedList){System.out.println(s);}System.out.println("-----------------------");ListIterator<String> listIterator = linkedList.listIterator();while (listIterator.hasNext()){System.out.println(listIterator.next());}}
}

List总结

List接口具有有序、可重复、可以存放null、存放任意类型元素的特点,他的子实现类也具有相同的特点

ArrayList:底层是数组,初始空间默认为0,放入第一个元素,扩容为10,

后续元素放满后,放入下一个元素会继续扩容,扩容1.5倍。

增删慢,查询快

LinkedList:底层是双向链表,查询慢,增删快

Vector:底层也是数组,每次扩容2倍,同步的,效率比ArrayList低,被ArrayList替代

相关文章:

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器&#xff0c;用来存放Java对象。 集合在存放对象的时候&#xff0c;不同的容器&#xff0c;存放的方法实现是不一样的&#xff0c; Java中将这些不同实现的容器&#xff0c;往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…...

NLP从入门到实战——命名实体识别

1. 命名实体识别 1.1 概念 中文命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER是指识别中文文本中实体的边界和类别。命名实体识别是文本处理中的基础技术&#xff0c;广泛应用在自然语言处理、推荐系统、知识图谱等领域&#xff0c;比如推荐系统中的基于…...

接口测试工具-postman介绍

一、介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 作用:常用于进行接口测试。 它可以模拟浏览器发起任何形式的HTTP请求...

日志中看到来自User Agent go-http-client / 1.1的大量请求(go-http-client 1.1)服务器爆了

在日志中看到来自User Agent go-http-client / 1.1的大量请求 The go-http-client/1.1 User Agent 是Google的Bot / Crawler 这不是真的。这可能是指Go库&#xff08;根据您提到的来源&#xff0c;由Google开发&#xff0c;但是我找不到可靠的信息&#xff09;。 之前写过“G…...

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的&#xff0c;具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points&#xff0c;当行人这一类别…...

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…...

用Go实现一个无界资源池

写在文章开头 我们希望通过go语言实现一个简单的资源池&#xff0c;而这个资源池的资源包括但不限于: 数据库连接池线程池协程池网络连接池 只要这些资源实现我们指定的关闭方法&#xff0c;则都可以通过我们封装的资源池进行统一管理&#xff0c;需要简单说明一下这个资源池…...

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…...

13、揭秘JVM垃圾回收器:面试必备知识,你掌握了吗?

13.1、前文回顾 在上一篇文章中,我们详细分析了触发Minor GC的时机,以及对象何时会从新生代迁移到老年代。我们还讨论了为了确保新生代向老年代的内存迁移安全,需要在Minor GC之前如何检查老年代的内存空间,以及在什么情况下会触发老年代的Full GC,以及老年代的垃圾回收算…...

治疗耳鸣患者案例分享第二期

“患者耳鸣20年了&#xff0c;目前耳朵没有堵或者胀的感觉&#xff0c;但是偶尔有点痒&#xff0c;平时会有头晕头胀这种情况&#xff0c;然后头晕是稍微晕炫一下。然后头疼是经常有的&#xff0c;头胀不经常。” 患者耳鸣持续20年&#xff0c;虽然耳朵没有堵或胀的感觉&#x…...

数据加密的方法

这些方法可以单独或结合使用&#xff0c;以提高数据的安全性和保护隐私。 对称加密&#xff1a;使用相同的密钥对数据进行加密和解密。常见的对称加密算法包括DES、AES和RC4。 非对称加密&#xff1a;使用一对密钥&#xff08;公钥和私钥&#xff09;对数据进行加密和解密。发…...

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置&#xff1a; 与LINUX传统IPC对比...

运维各种中间件的手动安装(非常详细)

压缩文件夹 tar -zcvf newFolder.tar.gz oldFolder 把oldFolder文件夹压缩成newFolder.tar.gz解压文件夹 tar -zxvf 压缩文件名.tar.gzlinux安装jdk &#xff08;参考 https://blog.csdn.net/qq_42269466/article/details/124079963 &#xff09; 1、创建目录存放jdk包 mkd…...

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…...

FBA头程海运发货流程是怎样的?

FBA头程发货作为整个FBA流程的关键一环&#xff0c;更是直接影响到商品从起点到终点的流通效率和成本。其中&#xff0c;海运作为一种经济、稳定的运输方式&#xff0c;在FBA头程发货中扮演着举足轻重的角色。那么&#xff0c;FBA头程海运发货流程究竟是怎样的呢? 1、装箱与发…...

二、VLAN原理和配置

vlan不是协议&#xff0c;是一个技术&#xff0c;虚拟局域网技术&#xff0c;基于802.1q协议。 vlan&#xff08;虚拟局域网&#xff09;&#xff0c;将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…...

stackqueue类——适配器模式 双端队列deque(C++)

接下来我们将实现 stack、queue 类的常用函数&#xff0c;其实对于 stack 和 queue 的常用函数实现可以说得上是非常简单&#xff0c;若想详细了解可以看这篇&#xff1a;栈和队列&循环队列&#xff08;C/C&#xff09;_栈和循环队列-CSDN博客&#xff1b;在本篇中我们将使…...

SpringCloud知识点梳理

1. Spring Cloud 综述 1.1 Spring Cloud 是什么 [百度百科]Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中⼼、消息总线、负载均衡、断路器、数据监控等,都可以⽤ Spring Boot的开发⻛格…...

【NOI】C++程序结构入门之分支结构二

文章目录 前言一、逻辑运算符1.导入2.逻辑与&#xff08;&&&#xff09;3.逻辑或&#xff08;||&#xff09;4.逻辑非&#xff08;!&#xff09; 二、例题讲解问题&#xff1a;1656. 是两位的偶数吗问题&#xff1a;1658. 游乐设施问题&#xff1a;1659. 是否含有数字5…...

web自动化系列-使用普通模式编写测试用例以及存在问题(十六)

前面已经把selenium的主要操作介绍完毕 &#xff0c;接下来我们通过编写几条测试用例感受下selenium的用法 。 1.用例需求 还是以登录为例 &#xff0c;需要实现的测试用例为 &#xff1a; case1&#xff1a;输入正确的用户名和密码进行登录case2 : 输入正确的用户名和错误的…...

VSCode 配置 Qt 开发环境

文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统&#xff1a;Windows 11VSCode版本&#xff1a;1.88.1CMake版本&#xff1a;3.27.7Qt6版本&#xff1a;6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...

【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库

🟣【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库 1、创建组2、创建用户3、将用户添加到组中4、在用户组中创建项目5、源码上传到Gitlab仓库5.1 初始化版本控制5.2 将文件添加到暂存区5.3 提交代码到本地仓库5.4 推送代码到 Git…...

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数&#xff0c;则程度增加0.5倍&#xff1b;如果还是个偶数&#xff0c;则再增加1倍。例如数字-13142223336是个11位数&#xff0c;其中有3个2&#xff0c;并且是负数&#xff0c;也是偶数&…...

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…...

python笔记 | 哥德巴赫猜想

哥德巴赫猜想&#xff1a;每个不小于6的偶数都可以表示成两个素数之和。 素数&#xff1a;只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如&#xff0c;2、3、5、7、11等都是素数&#xff0c;而4、6、8、9等则不是素数。 下面这段Python代码…...

IO基础-IO多路复用基础

Java的Selector封装了底层epoll和poll的API&#xff0c;可以通过指定如下参数来调用执行的内核调用, 在Linux平台&#xff0c;如果指定 -Djava.nio.channels.spi.SelectorProvidersun.nio.ch.PollSelectorProvider 则底层调用poll&#xff0c; -Djava.nio.channels.spi.Selec…...

Python机器学习项目开发实战:如何进行人脸识别

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a; Python机器学习项目开发实战_人脸识别_编程案例解析实例详解课程教程.pdf 人脸识别是一个复杂但…...

管理能力学习笔记五:识别团队角色,因才施用

识别团队角色&#xff0c;因才施用&#xff0c;需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好&#xff0c;而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才&#xff0c;才能高效配合…...

Real3DPortrait照片对口型,数字人,音频/视频驱动数字人

先看效果 上传一张图片和一段音频&#xff0c;照片如下&#xff1a; 合成后效果如下&#xff1a; 照片对口型-音频驱动 支持音频驱动和视频驱动&#xff0c;视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…...

Stable Diffusion之Ubuntu下部署

1、安装conda环境 conda create -n webui python3.10.6 2、激活环境 每次使用都要激活 conda activate webui 注意开始位置的变换 关闭环境 conda deactivate webui 3、离线下载SD 代码 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/Stabilit…...

《妻子》在线观看免费韩剧/网站优化推广费用

[传送门] 问题 区间更新 单点查询 解决 用差分数组来处理 注意: getsum(i) 就已经是当前点的值了 CODE: #include <bits/stdc.h> using namespace std; const int N 5e510; typedef long long ll; ll a[N],c[N]; ll n,m;ll lowbit(ll x) {return x&(-x); } …...

个人网站开发的论文/百度网站怎样优化排名

一、django内置分页模块介绍 django内置的分页功能需要引入内置模块from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger Paginator是一个类&#xff0c;可实例化出一个对象&#xff0c;实例化的对象中封存了以下属性&#xff0c;示例paginator Pagina…...

成都专业网站建设价格/排名首页服务热线

[极品笑话]太有才了&#xff0c;这是谁编的&#xff1f; 没钱的,养猪 有钱的&#xff0c;养狗。 没钱的,在家里吃野菜 有钱的,在酒店吃野菜。 没钱的,在马路上骑自行车 有钱的&#xff0c;在客厅里骑自行车。 没钱的想结婚&#xff0c; 有钱的想离婚 没钱的老婆兼秘书,…...

在线销售网站设计文献/个人网站网页首页

我们通常在控制台输出时使用System.out.print(),print只能直接输出基本类型和字符串&#xff0c;对于其他的类型直接输出将会输出开头的引用&#xff0c;因此若需要输出对应的内容则需要使用toSring方法。toString方法属于Object&#xff0c;Object是所有类的顶级父类&#xff…...

wordpress博客位置/中国舆情观察网

第五章 SQL 更新数据 插入数据——insert 单条插入 insert into 表名 &#xff08;列名1&#xff0c;列名2&#xff0c;列明3…列名n&#xff09;value (值1&#xff0c;值2&#xff0c;值3…值n);在insert 操作中&#xff0c;列名列表中的各列需要以逗号分隔&#xff1b;而值…...

烟台网站制作公司/浏览器直接进入网站的注意事项

数组是元素的一个有序组合。在JavaScript中&#xff0c;数组可以使用正式的对象表示法来创建&#xff0c;或者可以使用直接量表示法来初始化。 var arrObject new Array("val1", "val2"); // 作为对象的数组 var arrLiteral ["val1", "va…...