Java笔记_14(集合进阶2)

news2024/12/23 6:45:49

Java笔记_14

  • 一、双列集合
    • 1.1、Map的常见API
    • 1.2、Map遍历方式一(键找值)
    • 1.3、Map集合遍历方法二(键值对)
    • 1.4、Map集合遍历方法三(lambda表达式)
    • 1.5、HashMap
    • 1.6、HashMap练习
    • 1.7、HashMap底层源码解析
    • 1.8、LinkedHashMap
    • 1.9、TreeMap
    • 1.10、TreeMap源码解析
  • 二、集合练习
    • 2.1、可变参数
    • 2.2、Collections
    • 2.3、综合练习

一、双列集合

双列集合体系结构
在这里插入图片描述

双列集合的特点

  1. 双列集合一次需要存一对数据,分别为键和值
  2. 键不能重复,值可以重复
  3. 键和值是一一对应的,每一个键只能找到自己对应的值
  4. 键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象

1.1、Map的常见API

Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

方法名称说明
v put(K key,v value)添加元素
v remove(object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(object key)判断集合是否包含指定的键
boolean containsValue(object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
  • put方法细节
    • 在添加数据的时候,如果键不存在,那么直接把键值对对象添加到Map集合中,方法返回null
    • 在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
package Collection_two_Dome.MapDome;

import java.util.HashMap;
import java.util.Map;

public class Dome1 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();

        map.put("康师傅","kangshufu");
        map.put("可口","百事");
        map.put("段子","皮皮");
        map.put("可口","美年达");//会覆盖上面的可口

        map.put("段子","123");
        System.out.println(map);

        map.remove("康师傅");
        System.out.println(map);
        System.out.println(map.size());//集合长度
        //判断是否存在键
        boolean keyResult = map.containsKey("康师傅");
        System.out.println(keyResult);
        //判断是否存在值
        boolean ValueResult = map.containsValue("美年达");
        System.out.println(ValueResult);

        //清空
        map.clear();
        System.out.println(map.isEmpty());
        System.out.println(map);
    }
}

1.2、Map遍历方式一(键找值)

三种遍历方式

  • 迭代器遍历
  • 增强for遍历
  • forEach遍历
package Collection_two_Dome.MapDome;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

public class Dome2 {
    public static void main(String[] args) {

        Map<String,Integer> map = new HashMap<>();

        map.put("可乐",3);
        map.put("康师傅",1);
        map.put("汇源",5);
        map.put("沙市",4);

        Iterator it = map.keySet().iterator();
        while (it.hasNext()){
            Object next = it.next();
            int money = map.get(next);
            System.out.println(next +"="+money);
        }
        System.out.println("--------- ------------------------------");
        Set<String> strings = map.keySet();

        for (String string : strings) {
            int money = map.get(string);
            System.out.println(string+"="+money);
        }

        strings.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                Integer money = map.get(s);
                System.out.println(s+"="+money);
            }
        });
    }
}

1.3、Map集合遍历方法二(键值对)

  1. 利用entrySet方法返回一个Set集合
  2. 这个集合里面装的是键值对对象
  3. 在通过get方法分别得到keyvalue
package Collection_two_Dome.MapDome;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Dome3 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();

        map.put("可乐",3);
        map.put("康师傅",1);
        map.put("汇源",5);
        map.put("沙市",4);
        //通过entrySet()方法获得装键值对的set集合
        Set<Map.Entry<String, Integer>> entries = map.entrySet();

        for (Map.Entry<String, Integer> entry : entries) {
            //通过get方法依次得到键和值
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

1.4、Map集合遍历方法三(lambda表达式)

方法名称说明
default void forEach(Biconsumer<? super K,? super V> action)结合lambda遍历Map集合
package Collection_two_Dome.MapDome;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

public class Dome4 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();

        map.put("可乐",3);
        map.put("康师傅",1);
        map.put("汇源",5);
        map.put("沙市",4);

        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println(s+"="+ integer);
            }
        });
        System.out.println("-----------------------------------");

        map.forEach((String s, Integer integer)->{
                System.out.println(s+"="+ integer);
            }
        );
        System.out.println("-----------------------------------");
    }
}

1.5、HashMap

HashMap的特点

  1. HashMap是Map里面的一个实现类。
  2. 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
  3. 特点都是由键决定的:无序、不重复、无索引
  4. HashMap跟HashSet底层原理是一模一样的,都是哈希表结构
  5. 依赖hashcode方法和equals方法保证键的唯一
  • 如果存储的是自定义对象,需要重写hashCode和equals方法
  • 如果存储的是自定义对象,不需要重写hashCode和equals方法

1.6、HashMap练习

在这里插入图片描述

package Collection_two_Dome.HashMapDome;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class Dome1 {
    public static void main(String[] args) {
        HashMap<student,String> hm = new HashMap<>();

        student s1 = new student("xiaoming",18);
        student s2 = new student("xiaowang",19);
        student s3 = new student("xiaoli",18);
        student s4 = new student("xiaoming",18);

        hm.put(s1,"henan");
        hm.put(s2,"guangdong");
        hm.put(s3,"jiangsu");
        hm.put(s4,"shandong");

       hm.forEach((student student, String s)->{
                System.out.println(student+" "+s);
            }
        );

        System.out.println("-------------------------------------");

        Set<Map.Entry<student, String>> hms = hm.entrySet();
        for (Map.Entry<student, String> studentStringEntry : hms) {
            System.out.println(studentStringEntry);
        }

        System.out.println("-------------------------------------");

        Iterator it = hm.entrySet().iterator();
        while (it.hasNext()){
            Object next = it.next();
            System.out.println(next);
        }

    }
}

在这里插入图片描述

package Collection_two_Dome.HashMapDome;

import java.util.*;

public class Dome2 {
    public static void main(String[] args) {
        //创建数组,记录四个景点
        String[] arr = {"黄山","泰山","华山","佘山"};
        //利用随机数模拟80个同学的投票票
        //通过集合的形式记录每个景点的票数
        Random r =new Random();
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 80; i++) {
            int index = r.nextInt(arr.length);
            list.add(arr[index]);
        }
        //定义Map集合,利用集合进行统计
        HashMap<String,Integer> hm = new HashMap<>();
        for (String name : list) {
            //判断当前景点在map集合中是否存在
            if(hm.containsKey(name)){
                //先得到这个景点的次数
                int count = hm.get(name);
                //在进行++
                count++;
                //重新存入
                hm.put(name,count);
            }else {
                hm.put(name,1);
            }
        }

        System.out.println(hm);

        //求最大值
        int max = 0;
        //比较得出最大值
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            if(entry.getValue()>max){
                max= entry.getValue();
            }
        }
        System.out.println(max);
        //再次通过遍历的到最大票数的景点

        for (Map.Entry<String, Integer> entry : entries) {
            if (max== entry.getValue()){
                System.out.println(entry.getKey());
            }
        }

    }
}

1.7、HashMap底层源码解析

数组位置为null
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
数组位置不为null,键不重复,挂在下面形成链表或者红黑树
在这里插入图片描述
在这里插入图片描述

1.8、LinkedHashMap

  • 由键决定:有序、不重复、无索引。
  • 这里的有序指的是保证存储和取出的元素顺序一致
  • 原理∶底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。

在这里插入图片描述

package Collection_two_Dome.LinkedHashMapDome;

import java.util.LinkedHashMap;

public class Dome1 {
    public static void main(String[] args) {
        LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>();

        linkedHashMap.put("可乐",3);
        linkedHashMap.put("百事",3);
        linkedHashMap.put("沙市",4);
        linkedHashMap.put("北冰洋",5);
        linkedHashMap.put("可口",3);
        linkedHashMap.put("芬达",3);
        linkedHashMap.put("雪碧",3);
        linkedHashMap.put("可乐",4);//键相同时,回覆盖掉原来的值

        System.out.println(linkedHashMap);
    }
}

1.9、TreeMap

  • TreeMap跟TreeSet底层原理一样,都是红黑树结构的。
  • 由键决定特性:不重复、无索引、可排序
  • 可排序:对键进行排序
  • 注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

代码书写两种排序规则

  • 实现Comparable接口,指定比较规则。
  • 创建集合时传递Comparator比较器对象,指定比较规则。
    在这里插入图片描述
package Collection_two_Dome.TreeMapDome;

import java.util.Comparator;
import java.util.TreeMap;

public class Dome1 {
    public static void main(String[] args) {

        TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;//此时Integer按照降序排列
            }
        });
        //默认情况下Integer 和Double类型是按照升序的方法进行排列
        tm.put(1,"火车");
        tm.put(4,"游艇");
        tm.put(5,"出租");
        tm.put(2,"公交");
        tm.put(7,"大巴");
        tm.put(6,"汽车");
        tm.put(8,"飞机");

        System.out.println(tm);
    }
}

在这里插入图片描述

package Collection_two_Dome.TreeMapDome;

import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Dome2 {
    public static void main(String[] args) {
        TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o1.getAge()- o2.getAge();
                i = i==0?o1.getName().compareTo(o2.getName()):i;

                return i;
            }
        });

        Student s1 = new Student("chen",18);
        Student s2 = new Student("lu",19);
        Student s3 = new Student("huang",17);
        Student s4 = new Student("jia",19);
        Student s5 = new Student("qian",18);
        Student s6 = new Student("gao",20);


        tm.put(s1,"广东");
        tm.put(s2,"河南");
        tm.put(s3,"四川");
        tm.put(s4,"山西");
        tm.put(s5,"江苏");
        tm.put(s6,"云南");

        Set<Map.Entry<Student, String>> entries = tm.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            System.out.println(entry);
        }
    }
}
package Collection_two_Dome.TreeMapDome;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(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;
    }
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

在这里插入图片描述

package Collection_two_Dome.TreeMapDome;

import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;

public class Dome3 {
    public static void main(String[] args) {

        String s = "asdasdasdasdasdddasdasdaddadfffaasffafasffff";

        TreeMap<Character,Integer> tm = new TreeMap<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(tm.containsKey(c)){
                Integer count = tm.get(c);
                count++;
                tm.put(c,count);
            }else {
                tm.put(c,1);
            }
        }

        StringBuilder sb = new StringBuilder();

        tm.forEach((character,integer)->sb.append(character).append("(").append(integer).append(")"));
        System.out.println(sb);
        //使用StringJoiner方法时需要定义开头末尾以及中间每个元素之间的间隔字符
        StringJoiner sj  =new StringJoiner("","","");/*使用StringJoiner的add方法时一定要添加字符串&*/
        tm.forEach(( character,  integer)->sj.add(character+"").add("(").add(integer+"").add(")"));
        System.out.println(sj);
    }
}

1.10、TreeMap源码解析

在这里插入图片描述

二、集合练习

2.1、可变参数

  1. 可变参数本质上就是一个数组
  2. 作用:在形参中接收多个数据
  3. 格式:
    • 数据类型...参数名称
    • 举例:int...a
  4. 注意事项:
    • 形参列表中可变参数只能有一个
    • 可变参数必须放在形参列表的最后面
package Collection_two_Dome.Args_Collections;

import com.sun.source.tree.ReturnTree;

public class Dome1 {
    public static void main(String[] args) {
        System.out.println(Addall(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    }
    public static int Addall(int... a){
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum =  sum + a[i];
        }
        return sum;
    }
}

2.2、Collections

  • java.util.Collections:是集合工具类
  • 作用:Collections不是集合,而是集合的工具类。
方法名称说明
public static <T> boolean addAll(Collection<T> c,T… elements批量添加元素
public static void shuffle(List<?> list)打乱List集合元素的顺序
public static <T> void sort(List<T> list)排序
public static <T> void sort(List<T> list,comparator<T> c)根据指定的规则进行排序
public static <T> int binarySearch (List<T> list,T key)以二分查找法查找元素
public static <T> void copy( List<T> dest,List<T> src)拷贝集合中的元素
public static <T> int fill (List<T> list,T obj)使用指定的元素填充集合
public static <T> void max/min(collection<T> coll)根据默认的自然排序获取最大/小值
public static <T> void swap(List< ?> list,int i, int j)交换集合中指定位置的元素
package Collection_two_Dome.Args_Collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Dome2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        //在集合里面批量添加元素
        Collections.addAll(list,"asd","qwewq","zxczxc","jghjgh","yuiuyiu","bnmbmn");
        System.out.println(list);
        //打乱集合的顺序
        Collections.shuffle(list);
        System.out.println(list);
        //对集合进行排序(默认是从小到大)
        Collections.sort(list);
        System.out.println(list);
        //按照指定规则对集合进行排序(匿名内部类中重写)
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int i = o2.compareTo(o1);
                return i;
            }
        });
        System.out.println(list);
        //通过二分法进行查找
        System.out.println(Collections.binarySearch(list, "qwewq"));

        //使用该方法必须让被拷贝添加的数组有长度,且大于等于拷贝数组
        Collections.addAll(list2,new String[list.size()]);
        Collections.copy(list2,list);
        System.out.println(list2);
        //获取集合最大值/最小值
        System.out.println(Collections.max(list));
        System.out.println(Collections.min(list));
        //交换集合中指定元素的位置
        Collections.swap(list,0,list.size()-1);
        System.out.println(list);;
        //使用指定元素添加给集合
        Collections.fill(list,"12321");
        System.out.println(list);

    }
}

2.3、综合练习

在这里插入图片描述

package Collection_two_Dome.Exam;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test1 {
    public static void main(String[] args) {
        //班级里有N个学生,实现随机点名器。
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"xiaoming","xiaowang","xiaohong","xiaoli","xiaozhang","xiaolu","xiaochang");

        Random r = new Random();
        System.out.println(list.get(r.nextInt(list.size())));

        Collections.shuffle(list);
        System.out.println(list.get(r.nextInt(list.size())));

    }
}

在这里插入图片描述

package Collection_two_Dome.Exam;

import java.util.*;

public class Test2 {
    public static void main(String[] args) {
        /*
        班级里有N个学生要求:
            70%的概率随机到男生
            30%的概率随机到女生
        */

        //创建一个集合存放0和1,其中1代表男生,0代表女生
        //这个集合中1的数量为7,0的数量为3
        //随机抽取出来的概率就是男生70%女生30%

        ArrayList<Integer> integers = new ArrayList<>();
        Collections.addAll(integers,1,1,1,1,1,1,1);
        Collections.addAll(integers,0,0,0);

        Random r = new Random();
        int index = integers.get(r.nextInt(integers.size()));

        //创建男生集合
        ArrayList<String> man = new ArrayList<>();
        Collections.addAll(man,"男1","男2","男3","男4","男5","男6","男7","男8");
        //创建女生集合
        ArrayList<String> woman = new ArrayList<>();
        Collections.addAll(woman,"女1","女2","女3","女4","女5","女6","女7","女8");

        if (index == 1){
            System.out.println(man.get(r.nextInt(man.size())));
        } else if (index == 0) {
            System.out.println(woman.get(r.nextInt(man.size())));
        }

    }
}

在这里插入图片描述

package Collection_two_Dome.Exam;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        /*
        * 班级里有N个学生
        * 要求:
        被点到的学生不会再被点到。
        但是如果班级中所有的学生都点完了,需要重新开启第二轮点名
        * */

        ArrayList<String> list1 = new ArrayList<>();
        //定义一个集合来获取第一个集合删除的元素
        ArrayList<String> list2 = new ArrayList<>();

        Collections.addAll(list1,"xiangwang","xianghuang","xiangli","xiangzhang","xianglu","xiangzhao","xianglong","xiangtian");
        Random r = new Random();

        for (int i = 0; i < 10 ; i++) {
            int count = list1.size();
            for (int j = 0; j < count; j++) {
                //remove(index)该方法会返回删除的结果
                String name  = list1.remove(r.nextInt(list1.size()));
                list2.add(name);
                System.out.println(name);
            }
            //给第list1重新添加回数据,并且清空list2以便重新点名
            list1.addAll(list2);
            list2.clear();
            System.out.println("------------------------------");
        }
    }
}

在这里插入图片描述

  • 该案例回到后面完成
    在这里插入图片描述
package Collection_two_Dome.Exam;

import java.util.*;
import java.util.function.BiConsumer;

public class Test4 {
    public static void main(String[] args) {
        HashMap<String, ArrayList<String>> hm = new HashMap<>();

        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<String> list3 = new ArrayList<>();
        ArrayList<String> list4 = new ArrayList<>();

        Collections.addAll(list1,"南京市","扬州市","苏州市","镇江市","盐城市","徐州市");
        Collections.addAll(list2,"郑州市","周口市","洛阳市","开封市","商丘市","焦作市");
        Collections.addAll(list3,"广州市","深圳市","东莞市","湛江市","茂名市","汕头市");
        Collections.addAll(list4,"武汉市","鄂州市","黄冈市","孝感市","宜昌市","十堰市");

        hm.put("江苏",list1);
        hm.put("河南",list2);
        hm.put("广东",list3);
        hm.put("湖北",list4);


        Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();
        for (Map.Entry<String, ArrayList<String>> entry : entries) {
            String key = entry.getKey();
            ArrayList<String> value = entry.getValue();
            StringJoiner sj = new StringJoiner(",","","");
            for (String s : value) {
                sj.add(s);
            }
            System.out.println(key+"="+sj);
        }
    }
}

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

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

相关文章

【ChatGPT】ChatGPT+飞书,打造智能问答助手

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 环境列表 视频教程 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 6.固定公网地址 7.机器人权限配…

Unity本地化:添加多语言支持

文档&#xff1a;Quick Start Guide | Localization | 1.2.1 (unity3d.com) /**************************************************** 文件&#xff1a;LocaleSelector.cs 作者&#xff1a;Edision 日期&#xff1a;#CreateTime# 功能&#xff1a;语言本地化 *…

vue脚手架(vue-cli)详细安装过程

CLI&#xff0c;俗称脚手架。全称是Command Line Interface。 vue-cli 是vue官方发布的开发vue项目的脚手架。 vue脚手架用于自动生成vue和webpack的项目模板&#xff0c;是一个快速构建vue项目的工具&#xff0c;可以自动安装vue所需要的插件&#xff0c;避免手动安装各种插件…

camunda执行监听器和任务监听器有什么区别

Camunda的执行监听器和任务监听器是用于添加自定义逻辑的监听器&#xff0c;它们的区别在于作用对象和触发事件的不同。 执行监听器是与BPMN流程中的各种流程元素&#xff08;例如开始事件、用户任务、服务任务、网关等&#xff09;相关联的。执行监听器可以在流程元素执行前、…

德邦快递:逆境之下,让数字化辅助业务的利润增长

#01行业背景 2022年&#xff0c;我国快递业务量完成 1105.8 亿件&#xff0c;业务量连续 9 年位居世界第一&#xff0c;仅用七年时间&#xff0c;中国的快递行业就完成了从百亿到千亿的十倍增长。我国快递物流行业正从蓝海进入红海&#xff0c;在下半场激烈竞争中破局的关键在…

线上问题-CPU使用频率飙升

描述 中午收到群内人员反馈环境访问速度慢。登录验证码打不开等问题。通过查看日志发现是kafka出现问题&#xff0c;无法处理消息。联系运维解决。在排查的过程中使用mobaXterm连接服务器。左下角看到CPU使用频率非常高。于是记录一下通过CPU查看程序占用情况分析问题。 过程 …

各大厂与卡顿和ANR的战斗记录篇

作者&#xff1a;Drummor 1.1 认识ANR 1.1.1 系统如何处理ANR 设计原理和影响因素篇&#xff0c;主要对以下关键问题展开 ANR触发的条件以及根本原因发生ANR之后&#xff0c;系统处理ANR的流程。应用层如何判定ANR&#xff1a;对ANR的感知&#xff0c;通过监听SIGQUIT信号。…

直播合辑 | 微软ATP与您相约100场公益演讲

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; Public100已历经了近一年的春夏秋冬&#xff0c;截止目前我们一共举办33场公益直播&#xff0c;由微软及合作伙伴中从事 AI 相关工作的工程师、产品经理、市场总监、运营经理等各类专家和学者&#xff0c;分享自己在学…

IPC机制之管道

每个进程各自有不同的用户地址空间&#xff0c;任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲区&#xff0c;进程1把数据从用户空间拷到内核缓冲区&#xff0c;进程2再从内核缓冲区把数据读走…

一行代码绘制高分SCI火山图

一、概述 在近半年中&#xff0c;我读了很多的高分SCI文章&#xff0c;很多文章中都有多种不同的火山图&#xff0c;包括「普通的火山图、渐变火山图、以及包含GO通路信息的火山图」&#xff01; 经过一段时间的文献阅读和资料查询&#xff0c;终于找到了一个好用而且简单的包…

烽火HG680KA-Hi3798MV300-当贝纯净桌面-卡刷固件包

烽火HG680KA-Hi3798MV300-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff…

乳杆菌属Lactobacillus——维持肠道和阴道健康不可忽缺的角色

谷禾健康 乳杆菌属&#xff08;Lactobacillus&#xff09;是厚壁菌门乳杆菌科下的一类革兰氏阳性菌&#xff0c;最早于19世纪在酸奶中发现。 乳杆菌在自然界中分布很广&#xff0c;在植物体表、乳制品、肉制品、葡萄酒、发酵面团、污水以及人畜粪便中&#xff0c;均可分离到。在…

dubbo高级特性分析

1.dubbo多协议支持 某些场景下&#xff0c;可能接口是使用的老的协议去发布的&#xff0c;此时希望接口能够以一种新的协议去发布&#xff0c;老的服务按照老的协议去调用&#xff0c;新的服务按照新的协议去调用 而dubbo服务就可以支持发布多种协议&#xff0c;如 dubbo / he…

c++入门第一篇

C 1 C是编译语言1.1 windows平台运行c1.2 linux平台运行c1.3 Clion和MinGW-w64&#xff08;编译器&#xff09;安装教程1.4 clion的使用教程1.5 c开发工具1.6 c发展应用领域1.7 c学习路线1.8 c学习资料1.9 编程界的四大派系 2 基本语法2.1 c程序各部分介绍2.2 编写C程序2.3 c第…

zeppos 开发工具模拟器 simulator 无法显示app

zeppos 开发工具模拟器 simulator 无法显示app 目录问题描述&#xff1a;simulator的 Apps 不显示 hello-world 工程解决方案 目录 问题描述&#xff1a;simulator的 Apps 不显示 hello-world 工程 已确认部分&#xff1a; 1.网卡驱动安装成功 2.simulator version:1.1.9 3.d…

【LinuxShell】Shell编程之数组

文章目录 一、数组二、数组的定义方式三、数组的相关概述1.数组包括的数据类型2.获取数组长度3.获取数组数据列表4.获取数据下标列表5.获取某下标赋值6.如何判断数组是否缺少元素 四、数组的操作1.数组遍历2.数组切片3.数组替换4.数组删除5.数组追加元素 五、函数与数组的使用1…

致力于中小企业JavaEE企业级快速开发平台、后台框架平台

一、开源项目简介 J2eeFAST 是一个 Java EE 企业级快速开发平台&#xff0c; 致力于打造中小企业最好用的开源免费的后台框架平台 。系统基于&#xff08;Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE&#xff09;经典技术开发&…

zigbee抓包器使用

软件名称&#xff1a;Ubiqua Protocol Analyzer 主要操作流程&#xff1a; 1. 添加物理抓包器 2. 抓包 3. 过滤

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)

目录 写在前面一、暴力破解Basic-3-Brute 11.解题思路2.Burp Suite工具使用简介 二、基于GET的SQL注入Pre.使用校园网做题时可能遇到的小问题 2.1 Basic-4-SQL course 1&#xff08;sql注入&#xff09;1.解题思路 2.2 Basic-8-sqli-labs&#xff08;sql注入的各种攻击形式&…

iostat

目录 iostat 查看读写速度和占用CPU时间比率 一、包名 二、常用命令 三、模拟磁盘读写 iptop 看哪个进程使用存储多 iostat 查看读写速度和占用CPU时间比率 一、包名 sysstat &#xff08;和sar同一个包&#xff09; 二、常用命令 iostat 1 每一秒…