【Java数据结构 -- 顺序表】

List和ArrayList与顺序表

  • 一. List
    • 1.1 List介绍
    • 2.1 常见接口介绍
    • 3.1 List的使用
  • 二. ArrayList与顺序表
    • 1.线性表
    • 2.顺序表
      • 2.1 接口的实现
      • 2.2 顺序表的创建
      • 2.3 顺序表的打印
      • 2.4 顺序表的插入
      • 2.5 顺序表的按索引位置插入数据
      • 2.6 判断顺序表是否包含某个数
      • 2.7 返回顺序表某个数的索引
      • 2.8 获取顺序表pos位置的值
      • 2.9 更新顺序表pos位置的值
      • 2.10 顺序表删除元素
      • 2.11 顺序表的大小
      • 2.12 清空顺序表
    • 3.ArrayList简介
    • 4. ArrayList使用
      • 4.1 ArrayList的构造
    • 4.2 ArrayList常见操作
    • 4.3 ArrayList的遍历
    • 4.4 ArrayList的扩容机制
    • 5. ArrayList的具体使用
      • 5.1 简单的洗牌算法
      • 5.2 杨辉三角的实现
    • 6 面试题

一. List

1.1 List介绍

在集合框架中,List是一个接口,继承Collection
Iterable <-- Collection <-- List

Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,

Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,

站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作

2.1 常见接口介绍

List中提供了很多方法,具体的常用方法如下:
方法 ---- 解释
boolean add(E e) ---- 尾插 e
void add(int index, E element) ---- 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) ---- 尾插 c 中的元素
E remove(int index) ---- 删除 index 位置元素
boolean remove(Object o) ---- 删除遇到的第一个 o
E get(int index) ---- 获取下标 index 位置元素
E set(int index, E element) ---- 将下标 index 位置元素设置为 element
void clear() ---- 清空
boolean contains(Object o) ---- 判断 o 是否在线性表中
int indexOf(Object o) ---- 返回第一个 o 所在下标
int lastIndexOf(Object o) ---- 返回最后一个 o 的下标
List subList(int fromIndex, int toIndex) ---- 截取部分 list

3.1 List的使用

List是一个接口,并不是直接用来实例化
如果要使用的话必须先去实例化List的实现类,ArrayLsit和LinkedList都实现了List接口。

二. ArrayList与顺序表

1.线性表

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列等等。

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

2.顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.1 接口的实现

IList接口:

public interface IList {// 新增元素,默认在数组最后新增public void add(int data);// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind);// 查找某个元素对应的位置public int indexOf(int toFind);// 获取 pos 位置的元素public int get(int pos);// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size();// 清空顺序表public void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display();Boolean isFull();Boolean isEmpty();
}

2.2 顺序表的创建

把顺序表封装成一个类,定义数组 elem,大小 usedSize、默认容量和顺序表MyArrayList

public class MyArrayList implements IList{public int[] elem;public int usedSize;public static final int DEFAULT_CAPACITY = 5;public MyArrayList() {elem = new int[DEFAULT_CAPACITY];}
}

2.3 顺序表的打印

    @Overridepublic void display() {for (int i = 0; i < this.usedSize; i++) {System.out.println(elem[i]+" ");}System.out.println();}

2.4 顺序表的插入

写一个判断是否满了的方法,先要判断是否满了,满了就要扩容,扩容是使用Arrays.copyOf方法来进行扩容

    @Overridepublic void add(int data) {// 判断是否满了 满了就要扩容if (isFull()) {elem = Arrays.copyOf(elem,elem.length*2);}this.elem[usedSize] = data;this.usedSize++;}@Overridepublic Boolean isFull() {return this.usedSize == DEFAULT_CAPACITY;}

2.5 顺序表的按索引位置插入数据

在插入数据之前,我们需要检查插入的位置是否合法,如果小于0或者大于usedSize就抛出位置不合法的异常,如果位置合法,还需要判断顺序表是否满了,满了就需要扩容;在pos位置插入data时,从this.usedSize-1开始遍历到pos位置,也就是大于等于pos,把元素一个一个往后挪,即:elem[i+1] = elem[i];,然后插入数据,usedSize++。

    @Overridepublic void add(int pos, int data) {// pos位置的判断checkPosOfAdd(pos);if (isFull()) {elem = Arrays.copyOf(elem,elem.length*2);}for (int i = this.usedSize-1; i >= pos; i--) {this.elem[i+1] = elem[i];}this.elem[pos] = data;this.usedSize++;System.out.println();}private void checkPosOfAdd(int pos) {if (pos<0 || pos >this.usedSize) {throw new PosException("Pos位置为:"+ pos);}}

2.6 判断顺序表是否包含某个数

    @Overridepublic boolean contains(int toFind) {for (int i = 0; i < this.usedSize; i++) {if (elem[i] == toFind){return true;}}return false;}

2.7 返回顺序表某个数的索引

    @Overridepublic int indexOf(int toFind) {for (int i = 0; i < this.usedSize; i++) {if (elem[i] == toFind) {return i;}}return -1;}

2.8 获取顺序表pos位置的值

在这里也需要写一个**checkPosOfGet(pos)方法来判断位置是否合法,注意还要检查顺序表是否为空,写一个判断是否为空的isEmpty()**方法,

    public int get(int pos) {// 判断pos位置checkPosOfGet(pos);// 为空if (isEmpty()) {throw new EmptyException("顺序表为空");//return -1;}return this.elem[pos];}public Boolean isEmpty() {return usedSize ==0;}private void checkPosOfGet(int pos){if (pos < 0 || pos >= this.usedSize) {throw new PosException("Pos位置不合法:"+pos);}}

2.9 更新顺序表pos位置的值

同样也需要获取到pos的位置并检查是否合法,判断顺序表是否为空,不为空直接修改

    @Overridepublic void set(int pos, int value) {checkPosOfGet(pos);if (isEmpty()) {System.out.println("顺序表为空");}this.elem[pos] = value;}

2.10 顺序表删除元素

判断顺序表是否为空,获取到要删除的元素索引位置,然后从该位置index开始遍历,把该删除的后一个元素往前覆盖,然后usedSize–

    @Overridepublic void remove(int toRemove) {if (isEmpty()) {throw new EmptyException("顺序表为空");}int index=indexOf(toRemove);for (int i = index; i < this.usedSize-1; i++) {this.elem[i] = this.elem[i+1];}this.usedSize--;}

2.11 顺序表的大小

    @Overridepublic int size() {return this.usedSize;}

2.12 清空顺序表

为了防止数据泄露,需要情况顺序表。

    @Overridepublic void clear() {this.usedSize = 0;}

注意

  • 在定义了一个空顺序表的时候第一次add分配了默认的内存大小
  • 在扩容的时候是以1.5倍扩容

3.ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述注意:

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化
  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

4. ArrayList使用

4.1 ArrayList的构造

在这里插入图片描述
注意在这里的extends E 传入的是E类型或者是E的子类型

public static void main(String[] args) {// ArrayList创建,推荐写法// 构造一个空的列表List<Integer> list1 = new ArrayList<>();// 构造一个具有10个容量的列表List<Integer> list2 = new ArrayList<>(10);list2.add(1);list2.add(2);list2.add(3);// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素// list3构造好之后,与list中的元素一致ArrayList<Integer> list3 = new ArrayList<>(list2);// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难List list4 = new ArrayList();list4.add("111");list4.add(100);
}

4.2 ArrayList常见操作

方法 ------ 解释
boolean add(E e) ------ 尾插 e
void add(int index, E element) ------ 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) ------ 尾插 c 中的元素
E remove(int index) ------ 删除 index 位置元素
boolean remove(Object o) ------ 删除遇到的第一个 o
E get(int index) ------ 获取下标 index 位置元素
E set(int index, E element) ------ 将下标 index 位置元素设置为 element
void clear() ------ 清空
boolean contains(Object o) ------ 判断 o 是否在线性表中
int indexOf(Object o) ------ 返回第一个 o 所在下标
int lastIndexOf(Object o) ------ 返回最后一个 o 的下标
List subList(int fromIndex, int toIndex) ------ 截取部分 list

    public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("JavaSE");list.add("JavaWeb");list.add("JavaEE");list.add("JVM");list.add("测试课程");System.out.println(list);// 获取list中有效元素个数System.out.println(list.size());// 获取和设置index位置上的元素,注意index必须介于[0, size)间System.out.println(list.get(1));list.set(1, "JavaWEB");System.out.println(list.get(1));// 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置list.add(1, "Java数据结构");System.out.println(list);// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置list.remove("JVM");System.out.println(list);// 删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常list.remove(list.size()-1);System.out.println(list);// 检测list中是否包含指定元素,包含返回true,否则返回falseif(list.contains("测试课程")){list.add("测试课程");}// 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找list.add("JavaSE");System.out.println(list.indexOf("JavaSE"));System.out.println(list.lastIndexOf("JavaSE"));// 使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData数组List<String> ret = list.subList(0, 4);System.out.println(ret);list.clear();System.out.println(list.size());}

4.3 ArrayList的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器

    public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(10);arrayList.add(20);arrayList.add(30);//ArrayList的遍历//第一种遍历方式   重写了toString方法System.out.println(arrayList);//第二种遍历方式for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}System.out.println();//3.for-eachfor (int x:arrayList) {System.out.print(x+" ");}System.out.println();// 4. 迭代器Iterator<Integer> it = arrayList.iterator();while (it.hasNext()) {System.out.print(it.next()+" ");}System.out.println();//5. ListIterator  是 Iterator的子类ListIterator<Integer> it2 = arrayList.listIterator();while (it2.hasNext()) {System.out.print(it2.next()+" ");}System.out.println();//6. 从后往前打印ListIterator<Integer> it3 = arrayList.listIterator();while (it2.hasPrevious()) {System.out.print(it2.previous()+" ");}System.out.println();}

4.4 ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。
ArrayList源码:

Object[] elementData; // 存放元素的空间
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默认空间
private static final int DEFAULT_CAPACITY = 10; // 默认容量大小
public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;
}
private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {// 获取旧空间大小int oldCapacity = elementData.length;// 预计按照1.5倍方式扩容int newCapacity = oldCapacity + (oldCapacity >> 1);// 如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 如果需要扩容大小超过MAX_ARRAY_SIZE,重新计算容量大小if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// 调用copyOf扩容elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {// 如果minCapacity小于0,抛出OutOfMemoryError异常if (minCapacity < 0)throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

总结:

  1. 检测是否真正需要扩容,如果是调用grow准备扩容
  2. 预估需要库容的大小初步预估按照1.5倍大小扩容,如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容,真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
  3. 使用copyOf进行扩容

5. ArrayList的具体使用

5.1 简单的洗牌算法

Card:

public class Card {public String suit;public int num;public Card(String suit, int num) {this.suit = suit;this.num = num;}@Overridepublic String toString() {/*return "Card{" +"suit='" + suit + '\'' +", num=" + num +'}';*/return suit +""+num;}
}

Cardgame:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Cardgame {public static final String[] suits = {"♥","♣","♦","♠"};// 买牌 (创建牌)public List<Card> buyCard() {List<Card> cardList = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 0; j < 13; j++) {cardList.add(new Card(suits[i],j));//相当于下面代码/*String suit = suits[i];Card card = new Card(suit,j)cardList.add(card);*/}}return cardList;}// 洗牌public void shuffle(List<Card> cardList) {Random random = new Random();for (int i = cardList.size()-1; i > 0; i--) {int index = random.nextInt(i);swap(cardList,i,index);}}private static void swap(List<Card> cardList,int i,int j) {Card tmp = cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,tmp);}// 发牌 3个人每个人轮流抓5张牌// 思路:1.每个人拿到牌 放到哪//      2. l轮流怎么抓5张牌public List<List<Card>> getCard(List<Card> cardList) {List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for (int i = 0; i < 5; i++) {  // 拿五次牌for (int j = 0; j < 3; j++) {  // 3个人//怎么揭牌?  每次相当于 删除下0标这个牌Card card = cardList.remove(0);// 怎么放到对应人的手里面?hand.get(j).add(card);}}return hand;}
}

Main测试:

import java.util.List;public class Main {public static void main(String[] args) {Cardgame cardgame = new Cardgame();List<Card> ret = cardgame.buyCard();System.out.println("买牌:");System.out.println(ret);cardgame.shuffle(ret);System.out.println("洗牌:");System.out.println(ret);System.out.println("揭牌:");List<List<Card>> hand = cardgame.getCard(ret);for (int i = 0; i < hand.size(); i++) {System.out.println("第"+(i+1)+"个人的牌"+hand.get(i));}System.out.println("剩下的牌");System.out.println(ret);}}

在这里插入图片描述

5.2 杨辉三角的实现

具体要求:
在这里插入图片描述
** 实现这个杨辉三角得需要定义一个二维数组,每个一维数组的第一个和最后一个都为1,中间的数字就是上一行的j位置的元素+(j-1)也就是前一个元素,所以需要定义一个preRow来获取上一行的数据,即preRow = ret.get(i-1),然后再用preRow去调用get方法得到该位置的上面需要相加的两个元素,即:preRow.get(j)+preRow.get(j-1),然后再用add插入数据**。

    public List<List<Integer>> generate(int numRows) {// 定义一个二维数组List<List<Integer>> ret = new ArrayList<>();List<Integer> list = new ArrayList<>();list.add(1);ret.add(list);for (int i = 1; i < numRows; i++) {//每循环一次  就是一行List<Integer> curRow = new ArrayList<>();curRow.add(1);  //每行的第一个元素//处理中间的数字List<Integer> preRow = ret.get(i-1);for (int j = 1; j < i; j++) {int x = preRow.get(j)+preRow.get(j-1);curRow.add(x);}//处理最后一个数字curRow.add(1);ret.add(curRow);}return ret;}

6 面试题

CVTE面试题:
str1:“welcome to cvte”
str2: “come”
删除字符串1当中,出现的所有字符串2当中的字符, 即结果为 “wl t vt”

public class Test {public static List<Character> func(String str1,String str2) {List<Character> list = new ArrayList<>();for (int i = 0; i < str1.length(); i++) {char ch = str1.charAt(i);if(!str2.contains(ch+"")) { //contains接收的是字符串  所以字符ch +""list.add(ch);}}return list;}public static void main(String[] args) {List<Character> ret = func("welcome to cvte","come");for (Character ch:ret) {System.out.print(ch);}}
}

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

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

相关文章

2023-12学习笔记

1.NonNull要手动写无参构造器 这是一个我今天研究了很久的问题&#xff0c;开始不知道原因是在这里&#xff0c;还在那想是不是Data覆盖了无参构造&#xff0c;结果当然不是。先说下解决历程 1.问题起因 通过RequestBody接收前端报文的时候报错&#xff0c;大致是说我构造方…

python中tkinter实现GUI程序:三个实例

python中tkinter实现GUI程序 写在最前面Python中使用Tkinter实现GUI程序的基本元素Tkinter简介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件处理 1.用 tkinter实现一个简单的 GUI程序,单击“click”按钮&…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

【Go自学版】02-goroutine

利用时间片分割进程&#xff0c;致使宏观上A,B,C同时执行&#xff08;并发&#xff09; CPU利用率包含了执行和切换&#xff0c;进程/线程的数量越多&#xff0c;切换成本也会增大 最大并行数&#xff1a;GOMAXPROCS work stealing: 偷其他队列的G hand off: 当前G1阻塞&#…

css 修改滚动条样式,解决Windows浏览器中滚动条不美观问题

Windows环境中的浏览器中滚动条默认是直接显示了&#xff0c;不管光标是否进入该区域&#xff0c;这样就很不美观&#xff0c;如下图&#xff1a; 之前样式为 .well {display: block;background-color: #f2f2f2;border: 1px solid #ccc;margin: 5px;width: calc(100% - 12px);h…

mycat部署和配置读写分离(二)

说明&#xff1a; MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 1. jdk1.8安装 详见jdk环境安装 2. Mysql安装 详见mysql8.0.11源码安装…

【lesson11】数据类型之string类型

文章目录 数据类型分类string类型set类型测试 enum类型测试 string类型的内容查找找所有女生&#xff08;enum中&#xff09;找爱好有游泳的人&#xff08;set中&#xff09;找到爱好中有足球和篮球的人 数据类型分类 string类型 set类型 说明&#xff1a; set&#xff1a;集…

SL9008 3.6-60V输入 LED降压恒流芯片 内置MOS管 带PWM调光

SL9008是一款内置MOS管、具有PWM调光功能的LED降压恒流芯片&#xff0c;适用于3.6-60V的输入电压范围。它采用了先进的电路设计&#xff0c;确保了高效率和长寿命&#xff0c;同时具有宽电压输入范围和优异的负载调整率。 SL9008的主要特点包括&#xff1a; 1. 宽输入电压范围&…

HarmonyOS4.0开发应用——【ArkUI组件使用】

ArkUI组件使用 这里会详细演示以下组件使用: ImageTextTextInputButtonSliderColumn&&RowList自定义组件以及相关函数使用 Image 可以是网络图片、可以是本地图片、也可以是像素图 Image("https://ts1.cn.mm.bing.net/th?idOIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&…

CLIP在Github上的使用教程

CLIP的github链接&#xff1a;https://github.com/openai/CLIP CLIP Blog&#xff0c;Paper&#xff0c;Model Card&#xff0c;Colab CLIP&#xff08;对比语言-图像预训练&#xff09;是一个在各种&#xff08;图像、文本&#xff09;对上进行训练的神经网络。可以用自然语…

鸿蒙HarmonyOS(ArkTS)语法 声明变量及注意事项

好 今天我们来看一个基础的harmonyOS语法 变量声明 这里 我们还是用 ArkTS项目 我们声明变量的语法并不是ArkTS的 而是 javaScript 和 TypeScript的 可以看一下下面一张图 js是最初弱类型语言 于是TS作为js的副类 是一种更严谨的数据限定语法 而ArkTS 是TS的改良版 其实我们…

一篇文章教你快速弄懂 web自动化测试中的三种等待方式

前言 现在的网页很多都是动态加载的&#xff0c;如果页面的内容发生了改变&#xff0c;就需要时间来渲染。在咱们做web自动化测试的时候&#xff0c;由于代码是自动执行的&#xff0c;代码在执行的时候&#xff0c;有可能上一步操作而加载的元素还没加载出来&#xff0c;就会报…

配置本地端口镜像示例(1:1)

本地端口镜像简介 本地端口镜像是指观察端口与监控设备直接相连&#xff0c;观察端口直接将镜像端口复制来的报文转发到与其相连的监控设备进行故障定位和业务监测。 配置注意事项 观察端口专门用于镜像报文的转发&#xff0c;因此不要在上面配置其他业务&#xff0c;防止镜像…

建筑学VR虚拟仿真情景实训教学

首先&#xff0c;建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术&#xff0c;学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

记录 | ubuntu源码编译安装/更新boost版本

一、卸载当前的版本 1、查看当前安装的boost版本 dpkg -S /usr/include/boost/version.hpp通过上面的命令&#xff0c;你就可以发现boost的版本了&#xff0c;查看结果可能如下&#xff1a; libboost1.54-dev: /usr/include/boost/version.hpp 2、删除当前安装的boost sudo …

记录 | 使用samba将ubuntu文件夹映射到windows实现共享文件夹

一、ubuntu配置 1. 安装 samba samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议。 sudo apt-…

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7&#xff0c;B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…

大数据分析与应用实验任务十一

大数据分析与应用实验任务十一 实验目的 通过实验掌握spark Streaming相关对象的创建方法&#xff1b; 熟悉spark Streaming对文件流、套接字流和RDD队列流的数据接收处理方法&#xff1b; 熟悉spark Streaming的转换操作&#xff0c;包括无状态和有状态转换。 熟悉spark S…

Linux 驱动开发需要掌握哪些编程语言和技术?

Linux 驱动开发需要掌握哪些编程语言和技术&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xf…