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

学习大数据所需的java基础(5)

文章目录

  • 集合框架
  • Collection接口
  • 迭代器
    • 迭代器基本使用
    • 迭代器底层原理
    • 并发修改异常
  • 数据结构
    • 队列
    • 数组
    • 链表
  • List接口
      • 底层源码分析
  • LinkList集合
      • LinkedList底层成员解释说明
      • LinkedList中get方法的源码分析
      • LinkedList中add方法的源码分析
  • 增强for
    • 增强for的介绍以及基本使用发
    • 2.使用增强for的注意事项
  • 集合工具类
    • 比较器
  • 泛型
    • 为什么要使用泛型
    • 泛型的定义
      • 含有泛型的类
      • 含有泛型的方法
      • 含有泛型的接口
    • 泛型的高级使用
      • 泛型的上限和下限


集合框架

概述:容器
作用:一次存储多个数据
特点:
长度可变
只能存储引用数据类型的数据
有很多的方法直接操作元素,方便
单列集合:一个元素由一部分构成
list.add(“张三”)
双列集合:一个元素由两部分构成------ key value形式 键值对形式
map.put(“张三”,“18”)
在这里插入图片描述

Collection接口

概述:Collection是单列集合的顶级接口
特点:
a.元素有序
b.元素可重复
c.没有索引
创建
Collection 集合名 = new ArrayList()
a.E:代表的是集合元素的具体类型
b.<>里面只能存储引用类型,如果啥也不写,默认为Object类型
----- 不对
---- 对
------对
等号右边的泛型可以空着
5.方法:
boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
void clear():清除集合中所有的元素
boolean contains(Object o) :判断当前集合中是否包含指定的元素
boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
boolean remove(Object o):将指定的元素从集合中删除
int size() :返回集合中的元素数。
Object[] toArray(): 把集合中的元素,存储到数组中

		Collection<String> collection = new ArrayList<String>();//往集合中添加元素collection.add("李云龙");collection.add("丁伟");collection.add("孔捷");collection.add("楚云飞");System.out.println(collection);//将另一个集合元素添加到当前集合中,集合合并Collection<String> collection1 = new ArrayList<String >();collection1.add("魏大勇");collection1.add("大彪");collection1.add("段鹏");System.out.println(collection1);//将另一个集合元素添加到当前集合中(集合合并)collection1.addAll(collection);System.out.println(collection1);//清除集合中所有的元素collection1.clear();System.out.println(collection1);//判断当前集合中是否包含指定元素System.out.println(collection.contains("李云龙"));//将指定的元素从集合中删除collection.remove("孔捷");System.out.println(collection);//返回集合中的元素数System.out.println("collection.size() = " + collection.size());//将集合中的元素存储到数组中Object[] array = collection.toArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}

迭代器

迭代器基本使用

概述:Iterator接口
作用: 遍历集合
获取 Collection中的方法 Iterator iterator()
方法: boolean hasNext() ---- 判断集合还有没有下一个元素
E next ---- 获取下一个元素

public class test02 {public static void main(String[] args) {Collection<String> collection = new ArrayList<String>();collection.add("李云龙");collection.add("丁伟");collection.add("孔捷");//定义一个迭代器Iterator<String> iterator = collection.iterator();while (iterator.hasNext()){String element1 = iterator.next();//String element2 = iterator.next();System.out.println("element1 = " + element1);//System.out.println("element2 = " + element2);}}
}

注意:使用i迭代器时尽量不要连续调用多次next方法获取元素,防止报错

迭代器底层原理

只有ArrayList集合使用迭代器的时候Iterator指向的是Itr,其他集合不一定,比如HashSet集合

public class test03 {public static void main(String[] args) {final HashSet<String> set = new HashSet<>();set.add("孙悟空");set.add("猪八戒");set.add("唐僧");set.add("沙和尚");Iterator<String> iterator = set.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

并不是顺序输出
在这里插入图片描述

并发修改异常

我们定义一个集合,存储亮剑中三个团长,遍历集合,在遍历的过程中,如果获取出来的是李云龙,就直接在集合中添加”张大彪“

public class test04 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("李云龙");list.add("孔捷");list.add("丁伟");Iterator<String> iterator = list.iterator();while (iterator.hasNext()){String element =  iterator.next();if ("李云龙".equals(element)){list.add("张大彪");}}System.out.println(list);}
}

我么发现报错:ConcurrentModificationException
modCount:实际操作次数
expectionModCount:预期操作次数
结论:当实际操作次数和预期操作次数不相等时,出现并发修改异常
总结:当我们调用add方法,底层单独给modCount+1,但是没有重新将更改后的modCount赋值给二线expectionModCount
再调用next方法时,next方法底层做了一个判断,当实际操作次数和预期操作次数不相等时,出现并发修改异常

拓展:ArrayList集合中的方法:ListIterator()

数据结构

学过数据机构的同学们,对此章节可能会比较了解,这里不做详细的介绍,只简单的过一下 ·

特点: 先进后出

队列

特点:先进先出

数组

特点 查询快,增删慢
查询快:有索引,我们可以通过索引获取对应的元素
增删慢:定长
添加元素:先创建一个新的数组,指定新长度,将老数组的元素复制到新数组中,再添加新的元素
删除元素:先创建一个新的数组,指定新新长度,将老数组的元素复制到新数组中

链表

特点:查询慢,增删快
分类:
单向链表:一个字节分两部分
前面的字节记录后面字节的地址
后面字节不记录前面字节的地址
如果集合底层数据结构用的是单向链表,无法保证元素有序
双向链表:一个字节分三部分
前面的字节机会后面字节的地址
后米娜的字节记录前面字节的地址
如果集合底层数据结构用的是双向链表,能够保证元素有序

List接口

概述:list接口是Collection接口的子接口
实现类
ArrayList,LinkedList,Vector
4.常用方法:
boolean add(E e) -> 将元素添加到集合中->尾部(add方法一定能添加成功的,所以我们不用boolean接收返回值)
void add(int index, E element) ->在指定索引位置上添加元素
boolean remove(Object o) ->删除指定的元素,删除成功为true,失败为false
E remove(int index) -> 删除指定索引位置上的元素,返回的是被删除的那个元素
E set(int index, E element) -> 将指定索引位置上的元素,修改成后面的element元素
E get(int index) -> 根据索引获取元素
int size() -> 获取集合元素个数

public class test05 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("李云龙");list.add("丁伟");list.add("孔捷");list.add("张大彪");list.add("魏大勇");list.add("段鹏");//往指定位置添加元素list.add(3,"楚云飞");//删除指定元素,删除成功返回true,失败返回falselist.remove("楚云飞");//删除指定位置的元素,返回值为删除的元素System.out.println(list.remove(0));//将指定索引位置上的元素,修改为后面的元素,返回值为被替换元素的值System.out.println(list.set(1, "李云龙"));
//        System.out.println(list);//根据索引获取元素System.out.println(list.get(2));//获取集合元素的个数System.out.println(list.size());//快速遍历集合的方法for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

底层源码分析

ArrayList是一个集合,集合的长度是可变的,ArrayList底层数据结构数组,所以需要进行数组扩容使得数组长度可变
rrayList有一个空参构造: ArrayList() 构造一个初始容量为10的空列表
注意:不是 new就创建一个长的为10的空列表
而是第一次add的时候才会创建长度为10的空列表

扩容方式为
elementData = Arrays.copyOf(elementData, newCapacity);->数组扩容,数组复制
扩容1.5倍

LinkList集合

基本使用
概述:是List接口下的实现类
特点:
a.元素有序
b.元素可重复
c.有索引
d.线程不安全
数据结构双向链表
LinkList 将来我们有可能有大量的首位元素的操作,LinkList有很多特有方法
这些特有防火阀都是直接操作首位元素的
.方法:
public void addFirst(E e):将指定元素插入此列表的开头。
public void addLast(E e):将指定元素添加到此列表的结尾。
public E getFirst():返回此列表的第一个元素。
public E getLast():返回此列表的最后一个元素。
public E removeFirst():移除并返回此列表的第一个元素。
public E removeLast():移除并返回此列表的最后一个元素。
public E pop():从此列表所表示的堆栈处弹出一个元素。
public void push(E e):将元素推入此列表所表示的堆栈。
public boolean isEmpty():如果列表不包含元素,则返回true。

public class test06 {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();System.out.println("农药的龙年王者限定皮肤");list.add("赵云");list.add("孙尚香");list.add("孙策");list.add("安其拉");list.add("大乔");System.out.println(list);//将指定元素插入到列表开头list.addFirst("龙年限定");//将指定元素插入得到列表结尾list.addLast("就这五个");//返回列表的第一个元素System.out.println(list.getFirst());//返回列表的最后一个元素System.out.println(list.getLast());//移出并返回列表的第一个元素System.out.println(list.removeFirst());//移出并返回列表的最后一个元素System.out.println(list.removeLast());//从此列表表示的堆栈处弹出一个元素,底层调用removFirstlist.pop();//将元素推入到次列表所表示的堆栈,底层调用addFirstlist.push("龙年限定");}
}

LinkedList底层成员解释说明

1.LinkedList底层成员
transient int size = 0; 元素个数
transient Node first; 第一个节点对象
transient Node last; 最后一个节点对象

2.Node代表的是结点对象
private static class Node {
E item;//节点上的元素
Node next;//记录着下一个节点地址
Node prev;//记录着上一个节点地址

    Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}

LinkedList中get方法的源码分析

public E get(int index) {checkElementIndex(index);return node(index).item;
} Node<E> node(int index) {// assert isElementIndex(index);if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}

LinkedList中add方法的源码分析

LinkedList<String> list = new LinkedList<>();
list.add("a");
list.add("b");    void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;
}

增强for

增强for的介绍以及基本使用发

作用 遍历集合或者数组
格式
for(元素的数据类型 变量名:要遍历的集合名或者数组名){
变量代表的就是每一个元素
}
快捷键
集合名或者数组名.,for

ArrayList<String> list = new ArrayList<>();list.add("李云龙");list.add("丁伟");list.add("孔捷");list.add("张大彪");list.add("魏大勇");list.add("段鹏");for (String s : list) {System.out.println(s);}int[] arr = {1, 2, 3, 4, 5};for (int i : arr) {System.out.println(i);}

2.使用增强for的注意事项

1.在使用增强for遍历集合的时候尽量也不要随意改变集合长度,不然也会出现"并发修改异常"
a.增强for在遍历集合的时候,实现原理为迭代器
b.增强for在遍历数组的时候,实现原理为普通for

public class test07 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("李云龙");list.add("丁伟");list.add("孔捷");list.add("张大彪");list.add("魏大勇");list.add("段鹏");for (String s : list) {System.out.println(s);}int[] arr = {1, 2, 3, 4, 5};for (int i : arr) {System.out.println(i);}

集合工具类

概述:Collections集合工具类
特点
构造私有
成员方法是静态的
使用
类名直接调用
常用方法
static boolean addAll(Collection<? super T> c, T... elements)->批量将元素存到集合中 static void shuffle(List<?> list) -> 将集合中的元素顺序打乱
static void sort(List list) ->将集合中的元素按照默认规则排序->ASCII
static void sort(List list, Comparator<? super T> c)->将集合中的元素按照指定规则排序

public class test01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();//批量将元素存到集合中Collections.addAll(list,"李玉龙","孔捷","丁伟");System.out.println(list);System.out.println("============================");//将集合中的元素打乱Collections.shuffle(list);System.out.println(list);//将集合中的元素按照默认规则排序  ASCIICollections.sort(list);System.out.println(list);}
}

比较器

概述 Comparator:接口–比较器
方法:
int compare(T o1,T o2) ----- 设置比较规则
o1-o2 ----- 升序
o2-o1 ------降序
相关代码,首先构造javabean

public class Person implements Comparable<Person>{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" + name + '\'' + ",age:" +age+'}';}@Overridepublic int compareTo(Person o) {return o.getAge() - this.getAge();}
}

构建测试类

public class test01{public static void main(String[] args) {final ArrayList<Person> list = new ArrayList<>();list.add(new Person("刘备",30));list.add(new Person("关羽",48));list.add(new Person("张飞",45));System.out.println(list);//由于sort继承comparable.调用重写的方法Collections.sort(list);System.out.println(list);}
}

泛型

使用
注意:
泛型中写的类型都是引用数据类型
如果<>中什么都不写,元素默认类型为Object类型

为什么要使用泛型

从使用上看,如果使用了泛型,规定了数据类型,那么数据类型是一致的,防止了类型转换异常
从定义上看,定义泛型以后,在使用的时候确定啥类型,泛型就是啥类型,通用

泛型的定义

含有泛型的类

定义格式:
piublc class 类名{ }
什么时候确定泛型类型
new对象的时候确定类型

public class MyArrayList <E>{public void add(E e){System.out.println(e);}
}
public class test02 {public static void main(String[] args) {final MyArrayList<String> list = new MyArrayList<>();list.add("李云龙");final MyArrayList<Integer> list1 = new MyArrayList<>();list1.add(123);}
}

含有泛型的方法

格式 修饰符 返回值类型 方法名(E e) { }
调用的时候确定类型

public class Mylist {public <E> void add(E e){System.out.println(e);}
}

测试类

public class test03 {public static void main(String[] args) {final Mylist mylist = new Mylist();mylist.add(1);mylist.add("李云龙");}
}

含有泛型的接口

格式 public interfa 接口名{}
什么时候确定类型
在实现类的时候确定类型 比如Scanner
在实现类的时候还不确定类型,只能在new的时候确定类型 ---- 比如 ArrayList

public interface MyList <E>{public void add(E e);
}
public class MyScanner implements MyList<String>{@Overridepublic void add(String s) {System.out.println(s);}
}
public class MyScanner implements MyList<String>{@Overridepublic void add(String s) {System.out.println(s);}
}
public class Test01 {public static void main(String[] args) {MyScanner myScanner = new MyScanner();myScanner.add("哈哈哈");}
}

泛型的高级使用

什么时候使用泛型通配符:参数位置当不知道接收什么类型时 ------ 一般用在集合方面
用在什么位置上 一般用在参数位置上

import java.util.ArrayList;public class test06 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("李云龙");list.add("孔捷");list.add("丁伟");ArrayList<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);method(list);method(list1);}public static void method(ArrayList<?> list){for (Object o : list) {System.out.println(o);}}
}

泛型的上限和下限

泛型通配符的高级使用 受限泛型
上限:
a.格式: 类型名称<? extends 类> 对象名
b,意义:?只能接收extends后面的本类以及子类
下限
a.格式:类型名称<? super 类> 对象名
b.意义: ?只能接受super后面的本类以及父类

import java.util.ArrayList;
import java.util.Collection;public class test07 {public static void main(String[] args) {Collection<Integer> list1 = new ArrayList<>();Collection<String> list2 = new ArrayList<>();Collection<Number> list3 = new ArrayList<>();Collection<Object> list4 = new ArrayList<>();getElement1(list1);//getElement1(list2); 报错getElement1(list3);//getElement1(list4);  报错System.out.println("================================");//getElement2(list1);  报错//getElement2(list2);  报错getElement2(list3);getElement2(list4);}// 上限 ?只能接受extends后面的本类以及子类public static void  getElement1(Collection<? extends Number> collection){}//下限 ?只能接受super后的本类以及父类public static void  getElement2(Collection<? super Number> collection){}
}

相关文章:

学习大数据所需的java基础(5)

文章目录 集合框架Collection接口迭代器迭代器基本使用迭代器底层原理并发修改异常 数据结构栈队列数组链表 List接口底层源码分析 LinkList集合LinkedList底层成员解释说明LinkedList中get方法的源码分析LinkedList中add方法的源码分析 增强for增强for的介绍以及基本使用发2.使…...

Python 光速入门课程

首先说一下&#xff0c;为啥小编在即PHP和Golang之后&#xff0c;为啥又要整Python&#xff0c;那是因为小编最近又拿起了 " 阿里天池 " 的东西&#xff0c;所以小编又不得不捡起来大概五年前学习的Python&#xff0c;本篇文章主要讲的是最基础版本&#xff0c;所以比…...

解决vite打包出现 “default“ is not exported by “node_modules/...问题

项目场景&#xff1a; vue3tsvite项目打包 问题描述 // codemirror 编辑器的相关资源 import Codemirror from codemirror;error during build: RollupError: "default" is not exported by "node_modules/vue/dist/vue.runtime.esm-bundler.js", impor…...

c语言strtok的使用

strtok函数的作用为以指定字符分割字符串&#xff0c;含有两个参数&#xff0c;第一个函数为待分割的字符串或者空指针NULL&#xff0c;第二个参数为分割字符集。 对一个字符串首次使用strtok时第一个参数应该是待分割字符串&#xff0c;strtok以指定字符完成第一次分割后&…...

hash,以及数据结构——map容器

1.hash是什么&#xff1f; 定义&#xff1a;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入&#xff08;又叫做预映射pre-image&#xff09;通过散列算法变换成固定长度的输出&#xff0c; 该输出就是散列值。这种转换是一种压缩映射&…...

AIoT网关 人工智能物联网网关

AIoT(人工智能物联网)作为新一代技术的代表&#xff0c;正以前所未有的速度改变着我们的生活方式。在这个智能时代&#xff0c;AIoT网关的重要性日益凸显。它不仅是连接智能设备和应用的关键&#xff0c;同时也是实现智能化家居、智慧城市和工业自动化的必备技术。      一…...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的鸟类识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本文详细阐述了一个利用深度学习进行鸟类识别的系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类鸟类。文中不仅深入讲解了YO…...

核密度分析

一.算法介绍 核密度估计&#xff08;Kernel Density Estimation&#xff09;是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用&#xff0c;包括&#xff1a; 数据可视化&#xff1a;核密度估计可以用来绘制平滑的密度曲线或热力图&#xff0c;从而直观地表…...

先进语言模型带来的变革与潜力

用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动&#xff0c;开启通往知识宝库的大门&#xff0c;即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型&#xff0c;能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…...

重铸安卓荣光——上传图片组件

痛点&#xff1a; 公司打算做安卓软件&#xff0c;最近在研究安卓&#xff0c;打算先绘制样式 研究发现安卓并不像前端有那么多组件库&#xff0c;甚至有些基础的组件都需要自己实现&#xff0c;记录一下自己实现的组件 成品展示 一个上传图片的组件 可以选择拍照或者从相册中…...

Bert基础(四)--解码器(上)

1 理解解码器 假设我们想把英语句子I am good&#xff08;原句&#xff09;翻译成法语句子Je vais bien&#xff08;目标句&#xff09;。首先&#xff0c;将原句I am good送入编码器&#xff0c;使编码器学习原句&#xff0c;并计算特征值。在前文中&#xff0c;我们学习了编…...

Visual Studio快捷键记录

日常使用Visual Studio进行开发&#xff0c;记录一下常用的快捷键&#xff1a; 复制&#xff1a;CtrlC剪切&#xff1a;CtrlX粘贴&#xff1a;CtrlV删除&#xff1a;CtrlL撤销&#xff1a;CtrlZ反撤销&#xff1a;CtrlY查找&#xff1a;CtrlF/CtrlI替换&#xff1a;CtrlH框式选…...

分享84个Html个人模板,总有一款适合您

分享84个Html个人模板&#xff0c;总有一款适合您 84个Html个人模板下载链接&#xff1a;https://pan.baidu.com/s/1GXUZlKPzmHvxtO0sm3gHLg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集…...

vue使用.sync和update实现父组件与子组件数据绑定的案例

在 Vue 中&#xff0c;.sync 是一个用于实现双向数据绑定的特殊修饰符。它允许父组件通过一种简洁的方式向子组件传递一个 prop&#xff0c;并在子组件中修改这个 prop 的值&#xff0c;然后将修改后的值反馈回父组件&#xff0c;实现双向数据绑定。 使用 .sync 修饰符的基本语…...

C语言系列15——C语言的安全性与防御性编程

目录 写在开头1 缓冲区溢出&#xff1a;如何防范与处理1.1 缓冲区溢出的原因1.2 预防与处理策略 2. 安全的字符串处理函数与使用技巧2.1 strncpy函数2.2 snprintf函数2.3 strlcpy函数2.4 使用技巧 3 防御性编程的基本原则与实际方法3.1 基本原则3.2 实际方法 写在最后 写在开头…...

objectMapper、ObjectNode、JsonNode调用接口时进行参数组装

objectMapper、ObjectNode、JsonNode用于调用接口时进行参数组装 public String sendText( List< String > listUser, String content ) throws JsonProcessingException{if ( listUser.size() < 0 ){return "用户ID为空&#xff01;";}if ( content.lengt…...

2024开年,手机厂商革了自己的命

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024开年&#xff0c;AI终端的号角已经由手机行业吹响。 OPPO春节期间就没闲着&#xff0c;首席产品官刘作虎在大年三十就迫不及待地宣布&#xff0c;OPPO正式进入AI手机时代。随后在开年后就紧急召开了AI战略发布会&#xff0c;…...

【安全】大模型安全综述

大模型相关非安全综述 LLM演化和分类法 A survey on evaluation of large language models,” arXiv preprint arXiv:2307.03109, 2023.“A survey of large language models,” arXiv preprint arXiv:2303.18223, 2023.“A survey on llm-gernerated text detection: Necess…...

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…...

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...