Java 中的泛型 集合(List,Set) Map

news2024/9/21 22:29:41

泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性

泛型的具体定义与作用

  • 定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<> 来声明类型参数.这些参数在编译时会被具体的类型替换.java在运行时,会通过类型擦除机制,将泛型类型擦除,变为原始类型(如,String,Integer),具体的例子将在”泛型的使用”中演示

  • 作用:

  1. 类型安全:通过泛型,在编译阶段可以检查到更多的类型错误,就不用再运行时抛出ClassCastException

  2. 消除强制转化:在使用了泛型之后,很多的类型转换都可以自动执行,减少了代码中的显性强制转换

  3. 提高了代码的复用性

泛型的使用

  • 泛型类的使用:在类名后添加参数声明部分(用<> 包括起来),如 class Box<T>

public class Box<T>
{
    private  T value;//定义泛型值
    public T getValue() {
        return value;
    }
    public void setValue(T value) {
        this.value = value;
    }
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();//实例化String类的泛型对象
        stringBox.setValue("这是一个String类型范式");
        System.out.println(stringBox.getValue());
        Box<Integer> integerBox = new Box<>();//实例化Integer类的泛型对象
        integerBox.setValue(123);
        System.out.println(integerBox.getValue());
    }
}

  • 泛型接口的使用:与泛型类类似,在接口定义后添加类似参数声明.如interface<K,V>

public interface Pair <K,V>{  //泛型接口
    K getKey();  //Pair 接口定义了两个抽象方法 类型分别为 K,V
    V getValue(); //K,V都是待定义的类型
}
public class SimplePair<K,V> implements Pair<K,V>{
    private K key;
    private V value;
             //SimplePair类实现了 Pair接口 必须从写其中的抽象方法
    public SimplePair(K key, V value) {
        this.key = key;    //SimplePair的构造函数
        this.value = value;
    }
    @Override
    public K getKey() {
        return key;
    }
    @Override
    public V getValue() {
        return value;
    }
    public static void main(String[] args) {
        //实例化 一个SimplePair对象 传入参数为 Integer,String
        SimplePair<Integer, String> integerStringSimplePair = new SimplePair<Integer, String>(1,"one");
        //则K就代表Integer V就代表String
        System.out.println(integerStringSimplePair.getKey());
        System.out.println(integerStringSimplePair.getValue());
    }
}

  • 泛型方法:在方法返回类型前声明类型参数,如public <T> void printArray(T[] inputArray)。泛型方法可以定义在泛型类中,也可以定义在非泛型类中。

public class Method {
    public static <T> void printArray(T[] inputArray){ //定义了一个返回值为<T>的泛型函数
        for (T element : inputArray) {
            System.out.println(element);
        }
    }
    public static void main(String[] args) {
        Integer [] integers={1,2,3,4,5};
        String [] strings={"abcdefg"};
        printArray(integers);//调用泛型函数
        printArray(strings);
    }
}

  • 类型通配标识符:使用? 表示类型实参,表示不确定的类型(或者是待定的类型),通常用于泛型方法,泛型类,泛型接口;通常应用于当你不确定该数据类型时

 public static void printElements(List<?> list)//假设你要写一个打印集合元素的方法
 //当你不确定该集合的类型 则可以使用通配符
    {
        for (Object o : list) {
            System.out.println(o);
        }
    }
    public static void main(String[] args) {
        List<String> stringList=new ArrayList<>();
        List<Integer> integerList=new ArrayList<>();
        printElements(stringList);//可以打印String
        printElements(integerList);//也可以打印Integer
    }

  • 上限通配符:上限通配符用于知道一个类型的上限,它允许你指定一个类型及其子类型,其使用格式为<?extends Type >

List<? extends Number> listOfNum=new ArrayList<Integer>();//使用Integer是合法的
        //因为Number的子类包括 Integer Double 等等
        listOfNum.add(null);//也是合法的null属于一切类型

在这个例子中,List<? extends Number>表示列表可以持有Number类型或其子类型(如IntegerDouble等)的对象,但你不能往这个列表中添加除了null之外的任何元素,因为编译器不知道列表的确切类型

泛型中常见的类型参数

  • T:表示任意类型,是Type的缩写,常用于泛型类,方法,接口中

  • K,V:分别表示键(key)和值(value),常用于键值对中,如Map<K,V>

  • E:表示元素(Element),常用于集合中如List<E>

  • N:表示数字(Number),常用于数字类型

  • S, U, V等:用于表示第二、第三、第四个泛型类型参数,这些字母在代码中的使用已成为一种约定俗成的规范

集合

java中,集合框架是一组接口和类的集合,他们提供了一种数据储存和操作的方式.java的集合框架主要包括两大接口CollectionMap

Collection接口

  • Collection是所有单列集合的根接口,其子接口包括List,Set,Queue

    java.util.Collection下的接口和继承类关系简易结构图:

java.util.Map下的接口和继承类关系简易结构图:

List接口

List集合也被称为序列,其允许有重复的元素.List接口的实现类主要有ArrayList, LinkedList Vector

ArrayList

底层使用数组实现,不是线程安全,查询速度块,但插入速度慢

 public static void main(String[] args) {
       //创建ArrayList对象
        List<String> list=new ArrayList<>();
        //使用add()方法向数组中添加元素
        list.add("张三");
        list.add("李四");
        list.add("王五");
        //使用get(index)方法获取数组下标为index的元素
        System.out.println(list.get(0));
        //list的增强for循环
        for (String s : list) {
            System.out.println(s);
        }
    }

LinkArray

底层使用双向链表实现,查询速度慢,但其增删速度快,使用方法与ArrayList基本一致

    public static void main(String[] args) {
        List<String> list=new LinkedList<>(); //创建LinkedList对象
        list.add("张三");//一下的使用方法与ArrayList一致
        list.add("李四");
        list.add("王五");
        System.out.println(list.get(0));
        for (String s : list) {
            System.out.println(s);
        }

Vector

底层与ArrayList一致都是使用数组实现的,线程安全性高,但效率较低

public static void main(String[] args) {
        List<String> list=new Vector<>();//创建Vector对象
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list.get(0));
        for (String s : list) {
            System.out.println(s);
        }
    }

Set接口

其特点为无序集合,不允许有重复元素,包括主要实现类HashSet,LinkedSetTreeSet

HashSet

作为较为常用的Set集合,其底层是基于哈希表实现的,这就决定了其无法添加重复的元素和无序性

  • HashSet之所以能保证元素的唯一性是重写了其hashCode()方法和equals()方法,具体操作为:

  1. HashSet在每次储存元素的过程都会首先查看其hashCode()值,看其哈希值是否与以存入HashSet的元素的哈希值一致,若不一致则直接存入集合,若一致则进行步骤2

  2. 如果其哈希值相同则继续调用元素的equals()方法与哈希值相同的元素进行依次比较,若返回值为ture,则说明重复则不添加,反之则添加

  • 无序性:HashSet 是基于哈希表实现的,因此在添加元素时,不会按照其添加的顺序排放,而是根据哈希表原理,通过hash值存放.

  • 遍历无需性:当使用迭代器或者增强for循环时,HashSet的遍历也不是按照其元素插入的顺序执行的,也不是按照任何可预测的顺序执行的,而是基于哈希表的内部结构决定的,则意味着对于相同的HashSet ,在不同的JVM和实现方法下其遍历顺序都是不同的

 HashSet<Integer> integerHashSet = new HashSet<>(); //创建HashSet对象
        integerHashSet.add(1);
        integerHashSet.add(1);//使用add方法向其插入元素
        integerHashSet.add(2);
        integerHashSet.add(-1);
        for (Integer integer : integerHashSet) {
            System.out.println(integer);
        } //打印结果为 -1 1 2

LinkedHashSet

作为HashSet的子类,继承了HashSet的所有特性,即不允许集合中有重复元素,但与HashSet不同的是LinkedHashSet内部维护了一个双向链表,用于实现按元素的插入的顺序实现遍历

  • 底层数据逻辑:LinkedHashSet底层的数据结构包括一个数组和一个双向链表(或者是红黑树),这个数组和双向链表(或者红黑树)共同构成了LinkedHashMap (本文将在下文讲解到),的实现基础,LinkedHashSet就是通过封装LinkedHashMap来实现其功能,即底层是基于LinkedHashMap实现的

  • 具体实现: LinkedHashSet,在添加元素时,都会调用LinkedHashMapput方法来实现.LinkedHashMap 的put方法首先会计算插入元素的哈希值,并根据哈希值确定元素在数组中的位置,然后,会在双向链表(或红黑树)添加一个节点,保存元素值,因此每次遍历*LinkedHashSet时实际上是遍历其双向链表(红黑树)*,从而保证了遍历顺序与元素插入顺序一致

 LinkedHashSet<Integer> integerLinkedHashSet = new LinkedHashSet<>();
 //创建一个LinkedHashSet对象
        integerLinkedHashSet.add(1);
        integerLinkedHashSet.add(1);//添加元素
        integerLinkedHashSet.add(2);
        integerLinkedHashSet.add(-1);
        for (Integer integer : integerLinkedHashSet) {
            System.out.println(integer);
        }//打印结果与插入顺序一致 1 2 -1

TreeSet

TreeSet 是Set的子类,因此也保留的Set接口的特性,特别的是TreeSet是基于红黑树实现的

  • 底层数据逻辑:TreeSet 的底层实际上是基于TreeMap 作为底层存储实现的,TreeSet内部维护了一个NavigableMap (实际上就是TreeMap的一个实例化对象),用于存储元素,在这个映射中,键(key)就是TreeSet中的元素,而值(value)是一个固定的关系共享的Object对象,(在TreeSet中,这个Object对象被命名为PRESENT),用于表现值的存在性,不储存特点的值.

以下是TreeSet内部代码结构:

  • TreeSet的排序机制:

TreeSet元素默认是根据自然顺序或根据指定的Comparator进行排序,如果没有提供Comparator则,TreeSet会按照元素自然排序;如果提供了Comparator则使用Comparator来确定元素的顺序

public class NumComparator implements Comparator<Integer> {
//NumComparator类实现了Comparator接口
    @Override//重写了compare方法
    public int compare(Integer o1, Integer o2) {
        return Integer.compare(o1,o2);
    }
} 
   TreeSet<Integer> integerTreeSet = new TreeSet<>(new NumComparator());
   //传入NumComparator对象表明该TreeSet以该方式排序元素
        integerTreeSet.add(1);//添加元素
        integerTreeSet.add(-1);
        integerTreeSet.add(2);
        for (Integer integer : integerTreeSet) {
            System.out.println(integer);
        }打印结果为[-1,1,2]

List与Set的常用方法

Map(字典)

Map是一种将键(key)映射到值(value)的对象,它提供了一种键值对的储存机制,其中每个键都唯一映射到一个值,这种结构有利于快速查找,插入和删除值

Map的存储结构:

HashMap

HashMap是基于哈希表实现的,它允许使用null键和null值,HashMap不保证映射的顺序,即遍历Map时元素的顺序可能与插入顺序不同,HashMap底层主要维护一个数组和一个链表

  • HashMap的底层原理:

  1. HashMap底层维护了一个数组,被称为”桶”,用来储存多个键值对,没有指定初始量时,数组默认长度是16

  2. 当插入数据时两个不同的键产生了哈希冲突,这时就会通过HashMap底层维护的链表来解决哈希冲突

 HashMap<Integer, String> integerStringHashMap = new HashMap<>();//创建HashMap对象
        integerStringHashMap.put(1,"one");//Map使用put添加元素
        integerStringHashMap.put(-1,"-one");
        integerStringHashMap.put(2,"two");
        for (Map.Entry<Integer, String> entry : integerStringHashMap.entrySet()) {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }//对于Map有特殊的遍历方式,本文将会在下文解析
        //输出[-1 -one,1 one,2 two]

TreeMap

TreeMap是基于红黑树实现的Map接口,基于这种数据结构让TreeMap 可以在log(n)时间复杂度完成containsKey、get、put和remove等操作.TreeMap是实现TreeSet的基础

  • 有序性:由于基于红黑树实现储存,则保证了TreeMap是有序的,这种有序可以是自然顺序(即插入顺序),或者可以根据指定Comparator实现

TreeMap<Integer, String> integerStringHashMap = new TreeMap<>();//创建TreeMap对象
        integerStringHashMap.put(1,"one");//Map使用put添加元素
        integerStringHashMap.put(-1,"-one");
        integerStringHashMap.put(2,"two");
        for (Map.Entry<Integer, String> entry : integerStringHashMap.entrySet()) {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }//对于Map有特殊的遍历方式,本文将会在下文解析
        //输出[-1 -one,1 one,2 two]

HashTable

HashTable底层原理与HashMap十分相似,但与HashMap相比HashTable的put,get,remove 加上了同步块,和使用了this锁,则使得HashTable线程是安全的,但性能较低

  • 键和值的约束:HashTable是不允许使用null作为键和值的,否则会报出NullPointerException 异常

      HashMap<Integer, String> integerStringHashMap = new HashMap<>();//创建HashMap对象
        integerStringHashMap.put(1,"one");//Map使用put添加元素
        integerStringHashMap.put(-1,"-one");
        integerStringHashMap.put(2,"two");
        for (Map.Entry<Integer, String> entry : integerStringHashMap.entrySet()) {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }//对于Map有特殊的遍历方式,本文将会在下文解析
        //输出[-1 -one,1 one,2 two]

LinkedHashMap

LinkedHashMap继承了HashMap ,Linked的内部维护了一个双向链表用于保证元素的顺序

  • LinkedHashMap内部结构:其内部结合了哈希表和双向链表两种数据结构,哈希表用于快速检索元素,双向链表用于维护元素的顺序

  • 插入和访问:当元素被插入LinkedHashMap时,会在链表的尾部添加一个新的节点。如果设置了按访问顺序排列(通过构造函数或setAccessOrder方法),则每次访问元素时,会将该节点移动到链表的尾部,以保持访问顺序


        LinkedHashMap<Integer, String> integerStringHashMap = new LinkedHashMap<>();//创建LinkedHashMap对象
        integerStringHashMap.put(1,"one");//Map使用put添加元素
        integerStringHashMap.put(-1,"-one");
        integerStringHashMap.put(2,"two");
        for (Map.Entry<Integer, String> entry : integerStringHashMap.entrySet()) {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }//对于Map有特殊的遍历方式,本文将会在下文解析
        //输出[1 one,-1 -one,2 two]

Map的遍历方式

由于Map数据结构的特性,(使用键值对),因此必须指定要遍历的条件,例如按键或按值遍历等等

  • 使用entrySet()和增强for循环:

通过entrySet()方法,Map可以被转换为一个包含Map.Entry对象的Set集合,其中每个Map.Entry对象都代表Map中的一个键值对。然后,可以使用增强for循环来遍历这个Set集合

  LinkedHashMap<Integer, String> integerStringHashMap = new LinkedHashMap<>();//创建LinkedHashMap对象
        for (Map.Entry<Integer, String> entry : integerStringHashMap.entrySet()) {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }

  • 使用KeySet()和增强for循环:

如果只对Map的键感兴趣,可以使用keySet()方法获取一个包含Map中所有键的Set集合,然后遍历这个集合。如果需要获取对应的值,可以通过键来从Map中获取。

 LinkedHashMap<Integer, String> integerStringHashMap = new LinkedHashMap<>();
        for (Integer integer : integerStringHashMap.keySet()) {//其中integer表示Map的键值
        //通过Map方法的get(key)方法返回的是通过key映射的value
            System.out.println(integer+integerStringHashMap.get(integer));
        }

  • 使用values()和增强for循环:

KeySet()方法同理,如果只对Map的值感兴趣,可以使用values()方法获取一个包含Map中所有值的Collection集合,然后遍历这个集合。但请注意,这种方式无法直接获取到对应的键。只能获取其value值

 LinkedHashMap<Integer, String> integerStringHashMap = new LinkedHashMap<>();//创建LinkedHashMap对象
        for (String value : integerStringHashMap.values()) {
            System.out.println(value);
        }

  • 使用entrySet()Iterator迭代器

使用 entrySet() 方法结合 Iterator 迭代器来遍历 Map 中的键值对是一种常见的做法,尤其当需要同时访问键和值时,整体是通过while循环实现的

  • 在使用前必须使用interator()方法构建一个interator 对象,并且需要通过 Iterator 的 hasNext() 方法检查是否还有下一个元素。

  • 使用 Iterator 的 next() 方法获取下一个 Map.Entry 对象,从 Map.Entry 对象中使用 getKey() 和 getValue() 方法分别获取键和值。

        LinkedHashMap<Integer, String> integerStringHashMap = new LinkedHashMap<>();
  Iterator<Map.Entry<Integer, String>> iterator = integerStringHashMap.entrySet().iterator();
  //使用interator()创建一个intertor对象这步其实为联合方法可以分为一下两步
         while (iterator.hasNext())
         {
             Map.Entry<Integer, String> entry = iterator.next();
             //每次通过next()方法获取entries的下一个实体 储存再entry中
             Integer key=entry.getKey();//使用迭代器的getKey()方法可以获取键
             String value=entry.getValue();//getValue()方法可以获取值
             System.out.println(key+value);
         }

Iterator<Map.Entry<Integer, String>> iterator =integerStringHashMap.entrySet().iterator();//使用interator()创建一个intertor对象这步其实为联合方法可以分为一下两步

  1. 先使用entrySet()方法创建一个Set集合:

Set<Map.Entry<Integer, String>> entries = integerStringHashMap.entrySet();

其中Map.Entry<>表示Map中的一个实体

  1. 再使用interator()构造一个interator对象

Iterator<Map.Entry<Integer, String>> iterator = entries. Iterator();

文章转载自:ihave2carryon

原文链接:https://www.cnblogs.com/ihave2carryon/p/18292200

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

Java生成Word->PDF->图片:基于poi-tl 进行word模板渲染

文章目录 引言I Java生成Word、PDF、图片文档获取标签渲染数据生成文档案例II 工具类封装2.1 word 渲染和word 转 pfd2.2 pdf转成一张图片III poi-tl(word模板渲染) 标签简介文本标签{{var}}图片标签表格标签引用标签IV poi-tl提供了类 Configure 来配置常用的设置标签类型前后…

dwg图纸识别,提取建筑外轮廓坐标数据

1.业务流程说明 目的是通过dwg图纸&#xff0c;在网页端绘制出一个包括建筑外轮了的白模。为了达到这个目的&#xff0c;我们需要dwg图纸识别&#xff0c;提取到图纸中的建筑外轮廓的坐标数据。 2. 实施步骤 1.1 根据dwg图纸&#xff0c;转换成dxf文件&#xff0c;通过对dxf文…

区域与语言CultureInfo

CultureInfo 类 命名空间: System.Globalization 程序集: System.Globalization.dll 提供有关特定区域性&#xff08;对于非托管代码开发&#xff0c;则称为“区域设置”&#xff09;的信息。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期…

56 锐键交换机开局

锐键交换机开局 一 锐键视图切换 1 Ruijie> 用户视图 2 Ruijie# 特权模式 3 Ruijie(config)# 全局配置模式 4 Ruijie(config-if-GigabitEthernet 1/1/1)# 接口配置模式 5 Ruijie(config)#show vlan 6 exit (退出) 7 enable(进入)

【电子数据取证】支持最新版微信、企业微信、钉钉等重点应用数据提取分析!

文章关键词&#xff1a;电子数据取证、手机取证、云取证、电子物证、仿真取证 针对取证调查员目前在案件现场无法提取通讯聊天数据的情况&#xff0c;为了更好地适应这一实战需求&#xff0c;龙信科技快速响应对A303“鹰眼”介质快取系统和A315计算机快速采集系统全面升级&…

java10-集合框架

1. 集合的简介 1.1什么是集合 集合Collection&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提供了若干个…

人工智能安全态势和趋势

吴世忠 中工院士 国家保密科技委主任 重大风险隐患呼唤加强安全研究&#xff0c;人工智能面临未来担忧 1 总体态势 1.1 相对于技术发展&#xff0c;安全研究严重滞后 1.2 我国研究十分活跃&#xff0c;论文数量遥遥领先 1.3 影响力美国排名第一&#xff0c;大厂大学作用大 1…

【python】Python操作Redis数据库的详细教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

三防平板助力MES系统,实现工厂移动式生产报工

在当今竞争激烈的制造业环境中&#xff0c;提高生产效率、优化生产流程以及实现精准的生产管理已经成为企业生存和发展的关键。 MES系统作为连接企业计划层和控制层的桥梁&#xff0c;在实现生产过程的信息化、数字化和智能化方面发挥着重要作用。与此同时&#xff0c;三防平板…

JNPF快速开发平台助力企业实现工作流自动化

随着企业信息化建设的不断深入&#xff0c;工作流自动化已成为提升企业效率、优化业务流程的关键手段。JNPF快速开发平台凭借其强大的功能和灵活的配置&#xff0c;为众多企业提供了实现工作流自动化的高效解决方案。 关于低代码开发平台的普及应用 随着信息技术的迅猛发展&…

高中数学必修一函数部分重难点(上)

高中数学必修一函数部分重难点&#xff08;上&#xff09; 本文主要引出映射的概念&#xff0c;明确函数即为映射的一种方式&#xff0c;同时本篇叙述了我在初学时的困难点—定义域等以及当时所觉的难题&#xff0c;最后一图为纯手整理的干货&#xff0c;需要可以留下三联自行取…

Swagger 自动生成 Dubbo 服务的接口文档,以及测试调用

1. 概述 在使用 SpringMVC 构建 HTTP API 时&#xff0c;我们可以通过 Swagger 自动生成 HTTP 接口文档&#xff0c;通过 Swagger UI 界面上进行 HTTP 接口调试。如下图所示&#xff1a; Swagger HTTP 界面 秃头提示&#xff1a;对 Swagger 不太了解的胖友&#xff0c;可以去阅…

论文阅读笔记:Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels

论文阅读笔记&#xff1a;Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 1 背景2 创新点3 方法4 模块4.1 伪标签4.2 使用不可靠的伪标签 5 效果5.1 与SOTA方法对比5.2 消融实验5.3 定性结果 6 结论 论文&#xff1a;https://arxiv.org/pdf/2203.03884…

北京崇文门中医院贾英才主任:战胜头晕,重获“清醒人生”

头晕&#xff0c;这个看似常见却又恼人的症状&#xff0c;常常让患者的生活陷入困境。在北京崇文门中医院&#xff0c;有个叫贾英才的医生&#xff0c;他凭借医术&#xff0c;给不少头晕患者带去了希望。 北京崇文门中医院贾英才主任在医学领域辛勤耕耘多年&#xff0c;对于头晕…

ubuntu20从docker安装到制作自己的镜像使用记录

ubuntu20从docker安装到制作自己的镜像使用记录 第一章&#xff1a;配置环境 1.ubuntu20 2.docker镜像18.04 3.参考&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 第二章&#xff1a;安装docker 一、安装docker 参考1&#xff1a;Ubuntu安装docker并运…

Spring Cloud微服务项目文件上传/下载

在现代的微服务架构中&#xff0c;文件上传与下载是常见的需求&#xff0c;尤其是在需要处理大量文件数据的系统中。Spring Cloud 提供了灵活的工具和组件&#xff0c;使得在微服务中实现文件上传和下载变得高效而简便。 本文博主将详细介绍如何在 Spring Cloud 微服务项目中实…

【Kubernetes】k8s集群之Pod容器资源限制和三种探针

目录 一、Pod容器的资源限制 1.资源限制 2.Pod 和容器的资源请求与限制 3.CPU 资源单位 4.内存资源单位 二、Pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法&#xff1a; 一、Pod容器的资源限制 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所…

成都数字产业中心崛起,树莓集团如何加速国际数字影像产业园的全球步伐?

在数字化浪潮的推动下&#xff0c;成都数字产业中心近年来强势崛起&#xff0c;展现出令人瞩目的发展态势。据统计&#xff0c;过去五年间&#xff0c;成都数字产业的年均增长率超过了 20%&#xff0c;这一数据充分证明了其强大的发展动力。而在这片充满活力与创新的土地上&…

数据结构 JAVADS ——部分栈题目分享 (持续更新版)

前言 大概十天前,笔者更新了如何手搓一个简易的栈 入门数据结构JAVA DS ——手搓 栈-CSDN博客 在本篇博客中,笔者就分享几个题目,这同样是一个持续 更新的博客,但是我不保证更新频率就是了 哈哈! 那么我们就来看题目吧 第一题 1.小蓝的括号串1 - 蓝桥云课 (lanqiao.cn) …

如何在 Windows 上设置 MacOS 云主机

在Windows上设置MacOS云主机实际上涉及在Windows环境中模拟或远程管理MacOS系统&#xff0c;因为直接在Windows上运行MacOS作为云主机的主操作系统是不可能的&#xff0c;因为MacOS是为苹果硬件设计的。不过&#xff0c;有几种方法可以实现类似的功能&#xff1a; 1. 使用虚拟机…