Collection 单列集合 List Set

集合概念

集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包

按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下

Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的的子接口, List Set

`List` 接口 特点是元素有序可重复 它的实现类有  **ArrayList  LinkedList**`Set` 接口 特点是元素无序且不可重复它的实现类有 HashSet  TreeSet

Map 双列集合类的根接口, 用于存储具有 键(Key) 值(Value) 隐射关系的元素,每个元素都包 含一对键值 ,其中键值不可重复且每个键 最多只能映射到到一个值,在使用Map集合时 可以通过指定的Key找到对应的Value,通一个人的学号找到学生的名字一样没有爸爸接口,只要爷爷接口Mpa 实现类有 HashMap TreeMap

Collection 单列集合根接口

单列集合的父接口,它定义了单例集合(List Set) 通用的一些方法,这样方法可用于操作所有的单列集合 ,,在开发中,往往很少直接使用 Collcetion 接口进行开发基本上都是使用其子接口,子接口主要有 List、Set、Queue和 SortedSeto

常用API

List接口

List接口继承父接口Collection 接口 ,是单列集合的一个重要分支,它允许出现重复的元素,所有元素都是以一种线性的方式存储的,通过索引访问List

集合中的指定元素,它的特点是有序** 即元素 存入和取出的 顺序一致**

List集合常用方法,上方父接口 Collection方法同样可以继承使用

List 的所有实现类都可以通过调用这些方法操作集合元素

方法声明

功能描述

void add ( int index, Object element )

将元素 element 插入在List 集合的index处

boolean addAll ( int index, Collection c )

将集合所包含的所有元素插入到List集合的index处

Object get ( int index )

返回集合索引inde处的元素

Object remove ( int index )

删除集合索引inde处的元素

Object set ( int index, Object element

将集合索引indx处 元素替换成element对象,并将替换后的元素返回

int indexOf ( Object o )

返回对象o在List集合中出现的位置索引

int lastlndexOf ( Object o )

返回对象o在List集合中最后一次出现的位置索引

List subList ( int fromlndex, int tolndex )

返回从索引 fromindex(包括) 到toindex(不包括) 处所有元素组成的子集合

ArrayList实现类 查询 有序可重复

ArrayListList 接口的一个实现类,它是程序中一种常见的集合,在ArrayList内部封装了一个长度可变的数组对象,当存入的元素

超过数组长度时 ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度灵活可变的数组

它的大部分方法都是继承父类CollectionList接口的 其中 add()方法 和 get() 分别实现元素的存入和取出

import java.util.ArrayList;public class h {public static void main(String[] args) {ArrayList List = new ArrayList(); // 创建 ArrayList集合 相当于实现了List接口List.add(3);List.add("你好");List.add("世界");// 获取集合中元素的个数  size()方法是 Collection的System.out.println("集合的长度:"+List.size());// 取出并打印指定位置的元素 通过索引查找和数组一样从 0开始// 访问元素索引最好不要超过范围,否则会出现角标越界异常System.out.println("第2个元素是:"+List.get(1));}
}---------------------------------------------输出:集合的长度:3
第2个元素是:你好

注意 :

由于Aaytist 集合的底层使用一个数组来保存元素,在增加或删除指定位置的元素时,会创建新的数组,效率很低 因此不适合大量的增加删除操作,

因为这种数组的结构允许程序通过索引的方式来访问问元素,所以 ArrayList集合查找元素很方法

LinkedList实现类 增删 有序可重复

LinkedList集合内部维护了一个双向循环表,链表中的每一个元素都使用了引用的方式来记住它的前一个元素或后一个元素,从而可以将所有的元素彼此连接起来,LikedList 集合进行元素的增加删除操作时效率很高,

常用方法

import java.util.LinkedList;public class g {public static void main(String[] args) {LinkedList link = new LinkedList(); // 创建了LinkeduList集合link.add(3);link.add("你好");link.add("世界");System.out.println(link.toString()); //取出并打印该集合的元素转换为字符串输出System.out.println(link);  // 同样取出元素直接输出对象// 上面两个的区别在于两个打印语句的结果是相同的,只是输出格式不同。link.add(3,"saber"); // 向该集合中指定位置插入元素link.addFirst("插入");     // 向该集合第一个位置插入元素System.out.println(link.getFirst()); // 取出该集合中的第一个元素 插入link.remove(2); // 删除该集合中指定位置的元素 按照数组索引来 所以是第三个 看清楚System.out.println("会输出"+link);link.removeFirst(); // 删除该集合中的第一个元素System.out.println(link);}
}使用 LinkedList 对元素进行增加和删除操作是非常便捷的----------------------------------------------输出:[3, 你好, 世界]
[3, 你好, 世界]
插入
会输出 [插入, 3, 世界, saber]
[3, 世界, saber]

lterator接口 遍历迭代器

接口Iterator 接口也是集合中的一员, 但是它与 Collection Map 有所不同, Collection接口和Map 接口主要是用于存储元素 而

Iteratore 主要用于迭代访问(即遍历) Collection 中的元素,因此 Iteratior对象也称迭代器

代码含义:hasNext()方法用于判断集合中是否还有下一个元素,如果有则返回true,否则返回false。如果返回true,
则可以使用next()方法取出下一个元素,并将其赋值给一个Object类型的变量obj。最后,使用System.out.println()方法将obj打印出来。
整个过程会一直重复,直到集合中的所有元素都被遍历完毕。因此,这段代码的作用是遍历ArrayList集合中的所有元素,并将它们打印出来。注意:通过next()方法获取元素时 必须保证获取元素的存在,否则会抛出 NoSuchElementException 异常  (无搜索元素异常)---------------------------------------------import java.util.ArrayList;
import java.util.Iterator;
public class f {public static void main(String[] args) {ArrayList list = new ArrayList();list.add("张三");  // 存入了集合就必须使用 Object类型接收list.add("李四");list.add("王五");list.add("赵六"); // 每一个集合迭代前都是必须通过下面的代码来获取迭代器Iterator it = list.iterator(); // 获取迭代器对象while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素Object obj = it.next(); // 取出ArrayList集合中的元素 赋值给新的对象 objSystem.out.println(obj); // 依次打印出全部的时间}}
}-----------------------------------------------输出:张三
李四
王五
赵六
迭代判断删除

使用迭代器对集合中的元素进行迭代时, 如果调用了集合对象的 remover() 方法删除元素,那么继续使用迭代器会出现异常,下面通过案例来演示说明

import java.util.Locale;public class e {public static void main(String[] args) {ArrayList list = new ArrayList();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");Iterator it = list.iterator(); // 获取迭代器对象while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素Object obj = it.next(); // 取出ArrayList集合中的元素if ("张三".equals(obj))list.remove(obj); // 删除后就也就不再继续}System.out.println(list); // 删除的是没有张三的集合}
}

上述代码会报出错误,原因是迭代器在运行期间删除了元素,导致迭代次数发生了变化,迭代结果不准确,解决方案

(1) 找到对应的名称字符删除后就使用 breack语句跳出循环不再继续迭代,

while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素Object obj = it.next(); // 取出ArrayList集合中的元素if ("张三".equals(obj))list.remove(obj); // 删除后就也就不再继续break;

(2) 使用迭代器本身的删除方法去进行删除,删除后所导致的迭代次数变化,对于迭代器本身是可预测的

while (it.hasNext()){  // 判断ArrayList集合 是否存在下一个元素Object obj = it.next(); // 取出ArrayList集合中的元素if ("张三".equals(obj))list.remove(); // 删除后就也就不再继续}
foreach 循环

Iterator 虽然可以遍历集合中的元素,但是写法比较繁琐,简化书写提供了 foreach 循环,也称 增强for 循环, 它可以遍历数组或集合中的元素

语法格式:for(容器中元素类型 临时变量: 容器变量){执行语句
}和for循环相比foreach不再需要获得容器的长度,也不再需要根据索引访问,它会根据索引去访问容器的元素 
`并且自动遍历容器中的每个元素`
import java.util.ArrayList;
public class foreach {public static void main(String[] args) {ArrayList list = new ArrayList();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");for (Object obj:list){// 循环遍历ArrayListSystem.out.println(obj); // 取出}}
}--------------------------------输出:张三
李四
王五
赵六
循环局限性

当使用foreach 循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改, 下面是一个String 类型的数组,演示 foreach 局限性

public class foreach {static String[]  strrs = {"aaa","ddd","ccccc"};public static void main(String[] args) {// foteach 遍历数组for(String  str: strrs){str="ddd";}System.out.println("foreach循环修改后的数组"+strrs[0]+","+strrs[1]+","+strrs[2]);// for循环遍历数组for (int i= 0;i<strrs.length;i++){strrs[i]="ddd"; // 修改数据}System.out.println("循环修改后的数组"+strrs[0]+","+strrs[1]+","+strrs[2]);}
}-----------------------------------输出:foreach循环修改后的数组aaa,ddd,ccccc
循环修改后的数组ddd,ddd,ddd

foreach循环str=“ddd” 只是将临时的变量指向一个新的字符串并不能修改元素,for循环则是可以通过索引的方式对数组中的元素进行修改的

Set接口

Set接口和List接口一样,同样继承Collection 接口,方法和他基本一致, 功能上并没有扩充,反而更加严格,它的List接口不同在于, Set接口元素无序且不重复

实现类

  • **HashSet **: 根据对象的散列值来确定元素在集合中存储的位置,具有良好的存取和查找功能
  • TreeSet : 以二叉树方式存储元素,它可以实现对元素的排序
HashSet *实现类无序无重复

存储元素不可重复 意味着没有相同的,并且元素无序

import java.util.HashSet;
import java.util.Iterator;public class foreach {static String[]  strrs = {"aaa","ddd","ccccc"};public static void main(String[] args) {HashSet set = new HashSet(); // 创建HashSet集合set.add("张三"); //  向集合中添加元素set.add("李四");set.add("王五");set.add("王五"); // 添加重复元素Iterator it = set.iterator(); // 获取迭代器接口while (it.hasNext()){ // while 判断集合是否有元素Object obj = it.next(); // 如果有元素则通过迭代器 next() 获取元素System.out.println(obj); // 打印获取到的元素}}
}-----------------------------------------------输出:李四
张三
王五

注意:

取出元素和添加元素并不一致,并且重复添加的元素只出现了一次,它之所以可以确保不出现重复的元素,做了很多工作, add 添加元素时,首先调用存入对象的 hashCode() 方法获得对象的散列值,然后根据元素的散列值计算出特有的存储位置**, 散列值还是看数据类型是否相等的**, 只要数据类型相等,里面数字相等那么就是一样的,如果出现 String 字符串的100 和 int 类型的 100 其实是不同的,因为数据类型不同,并且 equals使用的前提也是相同数据类型比较字符串类型一致,详见String字符串 Random数字运算、

上面是不相同的情况,相同情况则是计算哈希后,进行equals 比较,如果比较存在,则是舍弃 没有则是加入

import java.util.HashSet;
import java.util.Iterator;public class foreach {static String[]  strrs = {"aaa","ddd","ccccc"};public static void main(String[] args) {HashSet set = new HashSet(); // 创建HashSet集合set.add("张三"); //  向集合中添加元素set.add("李四");set.add("王五");set.add("王五"); // 添加重复元素set.add("100");  // 两个类型不同set.add(100); // 两个类型不同Iterator it = set.iterator(); // 获取迭代器接口while (it.hasNext()){ // while 判断集合是否有元素Object obj = it.next(); // 如果有元素则通过迭代器 next() 获取元素System.out.println(obj); // 打印获取到的元素}}
}------------------------------------两个内容相同类型不同,散列值也是不同 会保存下来输出:李四
100
张三
100
王五
HashSet 存储Class类

将字符串存入HshSet时 String类已经重写了hashCodeequals 方法,下面演示存储自定义的Class类 的结果

未改写 hashCode和equals()方法

import java.util.HashSet;
class  Student{String id;String name;public Student(String id, String name) { // 创建构造方法this.id = id;this.name = name;}public String toString(){return  id+":"+name;}
}
public class foreach {static String[]  strrs = {"aaa","ddd","ccccc"};public static void main(String[] args) {HashSet set = new HashSet(); // 创建HashSet集合Student stu1 = new Student("1","杜甫");  // 创建对象传入参数到构造函数中Student stu2 = new Student("2","李白");Student stu3 = new Student("2","李白");set.add(stu1); // 将对象的值传入到集合中 也就是传入 classset.add(stu2);set.add(stu3);System.out.println(set);}
}---------------------------------------------输出:[2:李白, 2:李白, 1:杜甫]**注意:**在Java中,当我们使用System.out.println()方法输出一个对象时,实际上会自动调用该对象的`toString`()方
法来获取其字符串表示形式。因此,在这段代码中,当我们使用System.out.println(set)输出HashSet对象时
实际上会自动调用每个Student对象的toString()方法来获取其字符串表示形式,并将它们拼接成一个字符串输
出。虽然你没有显式调用toString()方法,但它确实被隐式调用了。 所以上面代码我们没有调用实际上啊是自动
调用了----------------------------------------------------------运行结果出现了两个相同的李白2,本来应该被认为是重复元素,不允许输出的,为什么没有去掉是因为在定义
Class类时 没有重写hashCode和equals()方法

已改写 hashCode和equals()方法

import java.util.HashSet;class  Student{String id;String name;public Student(String id, String name) { // 创建构造方法this.id = id;this.name = name;}public String toString(){  // 重写toSring() 方法return  id+":"+name;}public int hashCode(){  // 重写了hashCode()return  id.hashCode();}// 重写 eqlals 方法public boolean equals(Object obj){if (this==obj){  // 判断是否是同一个对象return true; // 是的话就是真}if (!(obj instanceof  Student)){ // 判断对象是否是Student类型return  false;}Student  stu = (Student) obj; // 将对象强制转换为 Student 类型boolean b = this.id.equals(stu.id); // 判断id值是否相同return  b;}}public class foreach {static String[]  strrs = {"aaa","ddd","ccccc"};public static void main(String[] args) {HashSet set = new HashSet(); // 创建HashSet集合Student stu1 = new Student("1","杜甫");  // 创建对象传入参数到构造函数中Student stu2 = new Student("2","李白");Student stu3 = new Student("2","李白");set.add(stu1); // 将对象的值传入到集合中set.add(stu2);set.add(stu3);System.out.println(set);}}----------------------------------------输出:[1:杜甫, 2:李白]**注意:**Student类重写了Object类的hashCode()返回`id`属性的散列值还有`equals` 并且在`equals` 方法比较对象
的id属性值是否相等并返回结果`HashSet`集合添加元素时,因为改写了`hashCode`方法所以`add`添加时
会进行比较发现散列值相同而且**stue.equsls(stu3)** 返回true 集合认为两个参数相等因为重复的被去掉了
LinkedHashSet实现类存取有序无重复

HashSet集合存储的元素是无序的,如果想让元素存取顺序一致,那么就使用 LinkedHashSet

它是HashSet 的子类,它和LinkdList一样 使用双向链表来维护内部元素关系

import java.util.Iterator;
import java.util.LinkedHashSet;public class foreach {public static void main(String[] args) {LinkedHashSet set = new LinkedHashSet();set.add("张三"); // 集合添加元素set.add("李四");set.add("王五");set.add("王五"); // 即使出现重复元素 也还是会显示一个Iterator it = set.iterator(); // 迭代器判断while (it.hasNext()){ // 循环判断是否有元素Object obj = it.next();System.out.println(obj);}}}-------------------------------------------------输出:张三
李四
王五

TreeSet 实现类有序无重复

为了对集合的元素进行排序,Set 接口提供了另一个可以对HashSet集合中元素排序的类——TreeSet

import java.util.TreeSet;public class foreach {public static void main(String[] args) {TreeSet set = new TreeSet();set.add(1);set.add(1);set.add(3);set.add(5);set.add(6);System.out.println(set);}
}----------------------------------------------输出:[1, 3, 5, 6]元素会自动排序并且没有存在重复TreeSet 集合之所以可以对添加元素排序,是因为元素的类实现了`Comparable`接口 
(基本类型的包装类 String类都实现了该接口) `Comparable`强行对实现它的每个类的对象进行整体排序这种排序被称为自然排序Comparable接口的compareTo()方法被称为自然比较方法!

什么是comparTo()方法

Comparable接口是Java中的一个接口,用于实现对象之间的比较。其中,compareTo()方法是Comparable接口中的一个方法,用于比较当前对象与另一个对象的大小关系。

compareTo()方法的返回值为int类型,表示当前对象与另一个对象的大小关系。如果当前对象小于另一个对象,则返回负整数;如果当前对象等于另一个对象,则返回0;如果当前对象大于另一个对象,则返回正整数。

compareTo()方法的作用是用于实现对象之间的排序。在Java中,如果一个类实现了Comparable接口,就可以使用Collections.sort()方法或Arrays.sort()方法对该类的对象进行排序。在排序过程中,会调用compareTo()方法来比较对象之间的大小关系,从而实现排序。

需要注意的是,如果一个类实现了Comparable接口,就必须实现compareTo()方法,否则会编译错误。另外,compareTo()方法的实现应该满足一定的规则,例如具有传递性、反对称性等,否则可能会导致排序结果不正确

TreeSet 存储Class类

如果同HashSet()一样存储Class类,TreeSet集合不会去进行排序,Class类对象必须实现 Comparable

接口并重写 compareTo方法实现对象元素的顺序存取 想对添加的元素进行排序就先重写

import java.util.TreeSet;// 定义Student类  **第一步实现了Comparable泛型;**
class Student implements Comparable<Student>{private String id;private String name;public Student(String id, String name) {this.id = id;this.name = name;}// 重写toString字符串方法public String toString(){return id+":"+name;}// **第二步重写 compareTo方法**//  三种compareTo方法的三种情况 public int compareTo(Student o){return 0 ;   // 集合中只有一个元素 还是第一个张三// return  1  // 集合怎么存怎么取的顺序
//        return -1;   // 集合按照存入的元素进行倒序}
}
public class foreach {public static void main(String[] args) {TreeSet set = new TreeSet();set.add(new Student("1","张三")); // 直接打印省去了 stu1 stu2 操作set.add(new Student("2","李白"));set.add(new Student("3","毒品"));System.out.println(set);}
}---------------------------------------------输出:return 0  [1:张三]return 1 [1:张三, 2:李白, 3:毒品]return -1[3:毒品, 2:李白, 1:张三]

除了自然排序还有另一种排序方法; 即实现Comparator接口 重写compare()方法 equals()方法

但是由于所有的类默认继承Object 而Object 又存在 equals() 所以自定义比较器类时,不用重写equals方法,只需要重写compare() 方法这种排序称为比较器排序

通过自定义Class类对象 通过比较器存入TreeSet集合

import java.util.Comparator;
import java.util.TreeSet;class Student {private String id;private String name;public Student(String id, String name) {this.id = id;this.name = name;}// 重写toString字符串方法public String toString(){return id+":"+name;}
}
public class foreach {public static void main(String[] args) {// 声明了一个TreeSet集合并通过匿名内部类的方式实现了Comparator接口,TreeSet set = new TreeSet(new Comparator() {@Override// 然后重写了compare()方法并public int compare(Object o1, Object o2) {return -1;}});set.add(new Student("1","张三")); // 直接打印省去了 stu1 stu2 操作set.add(new Student("2","李白"));set.add(new Student("3","毒品"));System.out.println(set);}
}--------------------------------------------输出:[3:毒品, 2:李白, 1:张三]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长&#xff0c;将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域&#xff0c;启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时&#xff0c;argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数&#xff0c;显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中&#xff0c;main函数的标准参数列表通常如下所示&#xff1a; in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏&#xff0c;包含多个选项&#xff0c;如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品&#xff0c;每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言&#xff1a;在05这节数据结构里面&#xff0c;我们知道select * from 这个操作很危险&#xff0c;如果数据库很大&#xff0c;会把服务器资源耗尽&#xff0c;接下来提到的查询可以有效的限制返回记录 1&#xff1a;分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…

【C语言】自定义类型:结构体--结构体内存对齐(用于计算结构体的大小)

结构体内存对齐 结构体内存对齐用于计算结构体的大小。 &#xff08;1&#xff09;对齐规则 1&#xff09;&#xff09;结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。 2&#xff09;&#xff09;其他成员变量要对齐到某个数字&#xff08;对齐数&#…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长&#xff0c;话来说长。前些天我投了一些日常实习的简历&#xff0c;结果足足等了两个礼拜才收到面试通知&#xff0c;看来如今的行情确实是挺紧张的。当时我是满怀信心去的&#xff0c;心想这次一定要好好拷打面试官一番&#xff0c;结果没想到&#xff0c;自我…

腰背肌筋膜炎有哪些治疗方法

腰背肌筋膜炎主要表现为腰背部的疼痛、酸胀、僵硬、活动受限等症状。在疾病初期&#xff0c;症状可能相对较轻&#xff0c;通过休息、保暖、适当的物理治疗等&#xff0c;往往可以缓解症状&#xff0c;此时病情不算严重。如果患者不重视&#xff0c;继续保持不良的生活习惯&…

微服务架构 --- 使用RabbitMQ进行异步处理

目录 一.什么是RabbitMQ&#xff1f; 二.异步调用处理逻辑&#xff1a; 三.RabbitMQ的基本使用&#xff1a; 1.安装&#xff1a; 2.架构图&#xff1a; 3.RabbitMQ控制台的使用&#xff1a; &#xff08;1&#xff09;Exchanges 交换机&#xff1a; &#xff08;2&#…

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统&#xff0c;是一个支持前后端分离设计的 客户端(C/S)项目&#xff0c;该示例项目前端xaml使用UI库 &#xff0c;Material Design Themes UI 来构建用户界面&#xff0c;确保…

【into outfile写文件】

简介 select * from user into outfile C:/Users/ichunqiu/Desktop/PhpStudy2018/PHPTutorial/WWW/1.txt;用法的意思就是把user表中查询到的所有字段都导出到1.txt文件中 我们之前还有学到dumpfile&#xff0c;单是它只能导出一条数据 写入shell 测试注入点 usernameadmin&…

【工具】使用perf抓取火焰图

背景 当程序存在cpu性能问题时&#xff0c;我们需要找到是哪个函数占用较多的CPU&#xff0c;也就是找出热点函数&#xff1b;perf的火焰图就是这个用途 安装 在Linux系统中&#xff0c;perf 是 Linux 内核提供的性能分析工具&#xff0c;它通常包含在内核源代码包中。大多数…

编码方式知识整理【ASCII、Unicode和UTF-8】

编码方式 一、ASCII编码二、Unicode 编码三、UTF-8编码四、GB2312编码五、GBK编码 计算机中对数据的存储为二进制形式&#xff0c;但采用什么样的编码方式存储&#xff0c;效率更高。主要编码方式有 ASCII、Unicode、UTF-8等。 英文一般为1个字节&#xff0c;汉字一般为3个字节…