Collection 单列集合 List Set

news2024/11/27 5:26:09

集合概念

集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于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集合中的元素 赋值给新的对象 obj
            System.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){// 循环遍历ArrayList
         System.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); // 将对象的值传入到集合中 也就是传入 class
        set.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.coloradmin.cn/o/2219356.html

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

相关文章

包子凑数

类似完全背包求方案数&#xff0c;再加上点数论知识&#xff0c;裴蜀定理。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n const int N300000; bool f[N]; int a[120]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.…

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…

无人机搭载激光雷达在地形测绘中的多元应用

一、高精度地形测量 无人机激光雷达能够发射激光脉冲并接收其回波&#xff0c;通过精确计算激光脉冲的往返时间来确定目标物的距离。这一特性使得无人机激光雷达在地形测绘中能够实现高精度的三维地形测量。通过快速获取大量地形数据&#xff0c;可以生成高精度的数字高程模型…

pytorh学习笔记——cifar10(一)生成数据

CIFAR&#xff08;Canadian Institute For Advanced Research&#xff09;是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集&#xff0c;最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像&#xff0c;分为10个类别&#xff0c;每…

SpringCloud无介绍快使用,单机Eureka服务注册中心cloud-eureka-server7001搭建(十)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao项目源码以及…

Python学习的自我理解和想法(17)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第17天&#xff0c;学的内容是面向对象设计。开学了&#xff0c;时间不多&#xff0c;写得不多&#xff0c;见谅。 目录 1.面向对象入门 …

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务&#xff0c;同时提高餐厅的运营效率。系统后端采用PHP语言开发&#xff0c;利用MySQL数据库进行数据存储与管理&#xff0c;实现了用户注册登录、菜品浏览、购物车管理、订单提…

es kibana .logstash离线集群安装

es离线集群安装 下载对应的版本一般看你客户端引用的是什么版本我这里下载的是7.6.2 官方下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 源码安装-环境准备&#xff1a;在etc/hosts文件添加3台主机 node-001 192.168.1.81 node-002 19…

图像中的数值计算

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

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序&#xff1a;miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致&#xff0c;老是切来切去。而且同一个人开发上传需要打包…

求最大公约数(c语言)

先看题&#x1f447; 我这里介绍的方法&#xff1a;辗转相除法&#xff1a; 最大公约数&#xff1a; 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…

关于我、重生到500年前凭借C语言改变世界科技vlog.7——数组函数实践

文章目录 扫雷游戏专题1.扫雷游戏的设计分析1.1 棋盘1.2 文件 2.扫雷游戏的实现3.扫雷游戏的扩展 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 扫雷游戏专题 掌握了前面的数组与函数的知识&#xff0c;我们可以制作一款大多电脑上都有的简易…

公交信息在线查询系统|基于java和小程序的公交信息在线查询系统小程序设计与实现(源码+数据库+文档)

公交信息在线查询系统小程序 目录 基于java和小程序的公交信息在线查询系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **&#x1f31f;解锁文本数据可视化的无限可能&#xff1a;Wordcloud库全解析&#x1f510;**1. **背景介绍**2. **Wordcloud库是什么&#xff1f;**3. **如何安装Wordcloud库&#xff1f;**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

VUE 仿神州租车-开放平台

项目背景&#xff1a; 神州租车是一家提供汽车租赁服务的公司&#xff0c;其API开放平台为开发者提供了访问神州租车相关服务和数据的接口。用VUE技术来仿照其开发平台。 成果展示&#xff1a; 首页&#xff1a; API文档&#xff1a; 关于我们&#xff1a;

MyBatis实践:提高持久层数据处理效率

文章目录 1 Mybatis简介1.1 简介1.2 持久层框架对比 2 快速入门2.1 准备数据库2.2 项目搭建2.3 依赖导入2.4 准备MyBatis配置文件2.5 实体类准备2.6 准备Mapper接口和MapperXML文件2.7 运行和测试 3. 核心配置文件4. MyBatis进阶使用4.0 以包为单位&#xff0c;引入所有的映射文…

算法Day-4

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…

Windows10去掉隐藏文件仍找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中&#xff0c;最近新装的Windows10系统发现该目录下没有hosts文件。 执行如下命令hosts文件出现&#xff1a; 执行 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc &am…

ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…