个人的一个模拟面试java1

文章目录

  • 列举 Java 集合框架中的几个主要接口和类
  • 解释 ArrayList 和 LinkedList 的区别
  • 什么是 HashCode 和 Equals 方法,为什么在覆盖 Equals 方法时通常也要覆盖 HashCode 方法?
  • ==和equals()的区别
  • `equals()` 方法在 String 类中是如何被覆盖的?
  • 解释 final、finally 和 finalize 的区别
  • 解释 JVM 的工作原理
  • 描述 Java 垃圾回收机制
  • 什么是并发(Concurrency)?Java 提供了哪些并发工具和类?

列举 Java 集合框架中的几个主要接口和类

Java 集合框架(Java Collections Framework)提供了一套性能优良、功能丰富的接口和类,用于存储和管理对象集合。下面列举一些主要的接口和类:

  1. 接口:
    • Collection:根接口,用于表示一组对象,ListSetQueue 都继承自该接口。
    • List:继承自 Collection,列表,元素可以重复,有序。
    • Set:继承自 Collection,集合,元素唯一,无序(HashSet)或有特定顺序(如 TreeSet)。
    • Queue:继承自 Collection,队列,用于在列表末尾添加元素,从列表开始处删除元素。
    • Deque:继承自 Queue,双端队列,允许在两端添加或移除元素。
    • Map:映射表接口,和 Collection 是平行的一个根接口,用于存储键值对。
    • SortedSet:继承自 Set,有序集合。
    • SortedMap:继承自 Map,有序映射表。
  2. 主要实现类:
    • ArrayList:实现了 List 接口,基于动态数组的数据结构。
    • LinkedList:实现了 List 接口和 Deque 接口,基于链表的数据结构。
    • HashSet:实现了 Set 接口,基于哈希表的数据结构,不允许重复元素。
    • LinkedHashSet:继承了 HashSet,维护了元素的插入顺序。
    • TreeSet:实现了 SortedSet 接口,基于红黑树的数据结构,元素有序。
    • ArrayDeque:实现了 Deque 接口,基于数组的数据结构,可以作为栈和队列使用。
    • PriorityQueue:实现了 Queue 接口,基于优先堆的一个无界优先队列。
    • HashMap:实现了 Map 接口,基于哈希表的数据结构。
    • LinkedHashMap:继承了 HashMap,维护了元素的插入顺序。
    • TreeMap:实现了 SortedMap 接口,基于红黑树的数据结构,键值有序。
  3. 其他工具类:
    • Collections:提供了一系列静态方法来操作集合,如排序、查找等。
    • Arrays:提供了操作数组的静态方法。

解释 ArrayList 和 LinkedList 的区别

ArrayListLinkedList 都是 Java 集合框架中 List 接口的实现,它们都提供了添加、删除、访问和修改列表元素的方法。但是,它们在内部数据结构、性能和功能方面有所不同:

  1. 内部数据结构:
    • ArrayList 是基于动态数组的数据结构,它允许快速随机访问。当数组容量不足时,ArrayList 会自动扩容,创建一个新的更大的数组,并将旧数组的内容复制到新数组中。
    • LinkedList 是基于双向链表的数据结构,每个元素都是一个节点,包含数据和两个指针,分别指向前一个和后一个节点。这种结构使得 LinkedList 在添加和删除元素时非常高效,因为它只需要改变指针的指向,而不需要移动其他元素。
  2. 性能:
    • ArrayList 提供了更快的随机访问和顺序访问速度,因为它是基于数组的。访问任何元素的时间复杂度是 O(1)。
    • LinkedList 在列表的开始和结束处提供了高效的添加和删除操作,时间复杂度为 O(1)。但是,访问任何元素的时间复杂度是 O(n),因为需要从头节点开始遍历链表直到达到目标位置。
  3. 内存占用:
    • ArrayList 由于需要连续的内存空间来存储数组,可能会浪费一些内存,特别是在数组需要扩容但实际存储的元素并不多时。
    • LinkedList 每个元素都需要额外的内存来存储指向前一个和后一个节点的指针,因此在存储大量元素时可能会比 ArrayList 使用更多的内存。
  4. 功能:
    • ArrayList 提供了更多的功能性方法,如 ensureCapacity 来增加数组容量,以及 trimToSize 来减少数组容量到当前元素数量。
    • LinkedList 除了实现了 List 接口外,还实现了 Deque 接口,因此可以作为栈和队列使用,提供了 pushpopofferpoll 等方法。
      选择 ArrayList 还是 LinkedList 取决于具体的应用场景。如果需要频繁的随机访问操作,ArrayList 是更好的选择。如果应用场景中包含大量的添加和删除操作,尤其是在列表的开始和结束处,LinkedList 可能是更优的选择。

什么是 HashCode 和 Equals 方法,为什么在覆盖 Equals 方法时通常也要覆盖 HashCode 方法?

hashCode()equals() 方法是 Object 类的两个基本方法,它们在对象的比较和哈希表中起着重要的作用。

  1. hashCode() 方法:
    • hashCode() 方法返回一个整数值,这个值是对象哈希码的一个表示,用于快速地查找对象。
    • 哈希码是一个由对象导出的整数,它被用于确定对象在哈希表中的索引位置,例如在 Java 的集合类 HashSetHashMap 中。
    • hashCode() 的默认实现返回对象的内存地址的整数表示,但很多类会覆盖这个方法以提供更合适的哈希码。
  2. equals() 方法:
    • equals() 方法用于比较两个对象是否相等。在 Object 类中,equals() 方法默认比较两个对象的引用是否相同,即是否指向同一个对象。
    • 当我们希望比较对象的内容而不是引用时,我们会覆盖 equals() 方法,提供自定义的相等性比较逻辑。
      为什么在覆盖 equals() 方法时通常也要覆盖 hashCode() 方法?
      这是因为 Java 的集合框架中,特别是哈希表相关的类(如 HashSetHashMap)依赖于这两个方法来确定对象的唯一性和存储位置:
  • 一致性(Consistency): 当一个对象被存储进哈希集合或者哈希映射表时,其 hashCode() 值被用来确定它的存储位置。如果 equals() 方法被覆盖,那么 hashCode() 也必须被覆盖,以确保相同的对象总是有相同的哈希码。如果 equals() 方法表明两个对象是相等的,那么它们的 hashCode() 值也必须相同。
  • 契约(Contract): 根据 Java 规范,如果两个对象通过 equals() 方法比较为相等,那么它们的 hashCode() 值也应该相同。反过来,如果两个对象的 hashCode() 值相同,这并不意味着它们一定通过 equals() 方法比较为相等,但是它们应该很快可以通过 equals() 方法进行比较。
    如果违反了这个契约,哈希表可能无法正确地工作,导致数据丢失或错误的行为。因此,如果你覆盖了 equals() 方法,你也需要覆盖 hashCode() 方法,以确保你的类可以正确地在哈希集合和哈希映射表中使用。

==和equals()的区别

在 Java 中,==equals() 是两种不同的比较方式,它们用于比较两个对象或值是否相等,但它们的用途和比较方式有本质的区别。

  1. == 运算符:
    • == 是 Java 中的比较运算符,用于比较两个操作数是否相等。
    • 当用于基本数据类型(如 int、float、char 等)时,== 比较的是两个值的数值是否相等。
    • 当用于引用数据类型(如对象、数组等)时,== 比较的是两个引用是否指向同一个对象,即它们是否在内存中占据同一个位置。
  2. equals() 方法:
    • equals() 是 Object 类的一个方法,所有 Java 类都继承了这个方法。
    • equals() 方法的默认实现(在 Object 类中)与 == 运算符用于引用数据类型时的作用相同,即比较两个引用是否指向同一个对象。
    • 然而,许多类会覆盖 equals() 方法,以提供自定义的相等性逻辑,比如 String 类的 equals() 方法就被覆盖,用于比较两个字符串的内容是否相同,而不是比较它们的引用。
      总结一下它们的区别:
  • == 用于比较值类型的数值是否相等,或者引用类型是否指向同一个对象。
  • equals() 方法用于比较对象的内容是否相等,但在没有覆盖的情况下,它默认比较的是引用是否相同。
  • == 不能被覆盖,因为它是一个运算符,而 equals() 方法可以被覆盖,以提供特定的相等性定义。
  • 对于基本数据类型,只能使用 == 进行比较,因为基本数据类型没有 equals() 方法。
  • 对于包装类(如 Integer、Double 等)和字符串等,通常使用 equals() 方法来比较它们的内容是否相等。
    在实际编程中,应该根据具体需求选择使用 == 还是 equals() 方法。如果要比较对象的身份(即是否为同一个对象),则使用 ==;如果要比较对象的内容是否相同,则使用 equals() 方法。

equals() 方法在 String 类中是如何被覆盖的?

String 类是内置的一个非常特殊的类,因为字符串是不可变的。String 类覆盖了 Object 类中的 equals() 方法,以提供字符串内容的比较,而不是对象引用的比较。
String 类中的 equals() 方法被定义为比较两个字符串对象包含的字符序列是否相同。如果两个字符串对象包含的字符序列完全一样,则 equals() 方法返回 true,否则返回 false
下面是 String 类中 equals() 方法的简化版实现:

public boolean equals(Object anObject) {
    // 首先快速检查是否比较的是同一个对象的引用
    if (this == anObject) {
        return true;
    }
    // 确保参数是字符串类型的对象
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        // 获取两个字符串的长度
        int n = value.length;
        if (n == anotherString.value.length) {
            // 获取两个字符串的字节数组
            char v1[] = value;
            char v2[] = anotherString.value;
            // 逐个字符比较
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

在这个实现中,value 是一个字符数组,它存储了字符串的内容。equals() 方法首先比较两个对象的引用是否相同,如果是同一个对象,直接返回 true。然后,它检查参数是否是 String 类型的对象,如果不是,返回 false。接着,它比较两个字符串的长度,如果长度不同,直接返回 false。最后,它逐个字符比较两个字符串的内容,如果所有字符都相同,则返回 true,否则返回 false
这个覆盖的实现确保了字符串内容的比较,而不是对象引用的比较,这通常是我们在比较字符串时所需要的。

解释 final、finally 和 finalize 的区别

finalfinallyfinalize 是 Java 中的三个不同的概念,它们分别用于不同的目的:

  1. final:
    • final 是一个修饰符,可以用来修饰类、方法和变量。
    • final 修饰一个类时,表示这个类不能被继承。
    • final 修饰一个方法时,表示这个方法不能被子类覆盖。
    • final 修饰一个变量时,表示这个变量的值一旦被初始化之后就不能被改变。对于基本数据类型,这意味着变量的值不能被改变;对于引用类型,这意味着引用本身不能被改变,但是引用指向的对象内容可以改变。
  2. finally:
    • finally 是一个关键字,用于异常处理语句中,通常与 trycatch 一起使用。
    • finally 块是可选的,它放在 trycatch 块之后。finally 块中的代码无论是否发生异常,都会被执行。这使得 finally 块通常用于执行清理工作,如关闭文件流、释放资源等。
  3. finalize:
    • finalize() 是 Object 类的一个方法,它在对象被垃圾收集器回收之前被调用。
    • finalize() 方法用于清理对象占用的资源,但它不是释放资源的推荐方式,因为垃圾收集器的调用时机是不确定的。通常,应该使用 try-with-resources 语句或者 finally 块来确保资源被正确释放。
    • 从 Java 9 开始,finalize() 方法已经被标记为 @Deprecated,因为它可能导致性能问题,并且在未来的 Java 版本中可能会被完全移除。
      总结:
  • final 是一个修饰符,用于指示类、方法或变量不可变或不可覆盖。
  • finally 是一个关键字,用于定义一个代码块,这个代码块在 try 块和 catch 块之后执行,无论是否发生异常。
  • finalize() 是一个方法,用于在对象被垃圾收集之前执行清理工作,但由于性能和不确定性,它的使用不推荐。

解释 JVM 的工作原理

Java 虚拟机(JVM, Java Virtual Machine)是一个可以执行 Java 字节码的虚拟机进程。它是 Java 平台的核心组成部分,负责运行 Java 应用程序。下面是 JVM 的工作原理的简要解释:

  1. 编译过程:
    • Java 源代码首先被编译器(javac)编译成字节码,这是一种中间形式的代码,它不是特定于任何平台的机器代码。
  2. 类加载(Class Loading):
    • 当运行 Java 程序时,JVM 会使用类加载器(Class Loader)来加载字节码文件(.class 文件)到内存中。类加载器会读取字节码文件,并创建一个 Class 对象,这个对象包含了类的所有信息,如方法、字段和接口等。
  3. 字节码验证(Bytecode Verification):
    • 在类加载之后,JVM 会进行字节码验证,以确保字节码的安全性和有效性。字节码验证器会检查字节码是否符合 JVM 规范,比如类型是否正确,是否有非法的操作码等。
  4. 运行时数据区(Runtime Data Area):
    • JVM 的运行时数据区包括方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(Program Counter Register)和本地方法栈(Native Method Stack)。
    • 方法区存储了类的结构信息,如字段、方法和构造器等。
    • 堆是所有对象实例的存储区域,它是垃圾收集的主要区域。
    • 栈为每个线程创建一个私有的存储区域,用于存储局部变量、操作数栈、动态链接和方法出口等信息。
    • 程序计数器用于存储当前线程执行的字节码指令地址。
    • 本地方法栈用于存储本地方法(用 C/C++ 或其他语言编写的方法)的调用状态。
  5. 执行引擎(Execution Engine):
    • 执行引擎负责执行字节码。它可以是解释器(Interpreter),也可以是即时编译器(Just-In-Time Compiler, JIT)。
    • 解释器逐条解释执行字节码,而 JIT 编译器将字节码编译成本地机器码,以提高程序的执行速度。
  6. 垃圾收集(Garbage Collection):
    • JVM 负责自动管理内存,垃圾收集器会识别并回收不再使用的对象,以释放内存资源。
  7. 本地接口(Native Interface):
    • JVM 通过本地方法接口(JNI, Java Native Interface)与本地方法库(如 C/C++ 库)进行交互,允许 Java 代码调用其他语言编写的代码。
      JVM 的这种设计允许 Java 程序在不同的平台上运行,而不需要重新编译,实现了 “一次编写,到处运行” 的理念。JVM 的优化和垃圾收集策略对于 Java 程序的性能有着重要的影响。

描述 Java 垃圾回收机制

Java 垃圾回收机制(Garbage Collection, GC)是 Java 虚拟机(JVM)的一个重要特性,它自动管理内存,减轻了开发人员的工作负担。Java GC 的主要目标是识别并回收不再使用的对象,以释放内存资源,防止内存泄漏。
以下是 Java 垃圾回收机制的基本描述:

  1. 标记-清除(Mark-Sweep)算法:
    • 这是最基本的垃圾回收算法。它分为两个阶段:标记和清除。
    • 在标记阶段,GC 会遍历所有的活跃对象,并标记它们。
    • 在清除阶段,GC 会遍历堆内存,回收未被标记的对象所占用的空间。
  2. 复制(Copying)算法:
    • 这种算法将可用内存划分为两个相等的部分,每次只使用其中一个。
    • 当进行垃圾回收时,GC 会将活跃对象复制到未使用的内存部分,然后清理掉旧的内存部分。
    • 这种算法适用于对象生存周期短的场景,但它需要两倍的内存空间。
  3. 标记-整理(Mark-Compact)算法:
    • 这种算法在标记阶段与标记-清除算法相同。
    • 在整理阶段,GC 会对标记的对象进行压缩,以消除内存碎片。
  4. 分代收集(Generational Collection)算法:
    • 这种算法基于这样一个观察:大多数对象要么在创建后很快死亡,要么存活很长时间。
    • 因此,堆内存被划分为几个不同的代,通常是新生代(Young Generation)和老年代(Old Generation)。
    • 新生代使用复制算法,因为这里的对象生命周期短,垃圾回收频繁。
    • 老年代使用标记-清除或标记-整理算法,因为这里的对象生命周期长,垃圾回收不频繁。
  5. 垃圾回收器(Garbage Collectors):
    • JVM 提供了多种垃圾回收器,每种回收器都适用于不同的场景。
    • 例如,Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)GC、G1(Garbage-First)GC、ZGC(Z Garbage Collector)和 Shenandoah GC。
    • 开发人员可以根据应用程序的需求和性能要求选择合适的垃圾回收器。
  6. 触发垃圾回收:
    • GC 的触发条件由 JVM 决定,通常是基于堆内存的使用情况。
    • 当堆内存不足以分配新的对象时,JVM 会触发垃圾回收。
  7. GC 监控和调优:
    • Java 提供了多种工具和 JVM 参数来监控和调优 GC。
    • 例如,jstatjmapVisualVMGC Log 等。
      Java 垃圾回收机制是一个复杂的主题,涉及到很多细节和调优选项。理解 GC 的工作原理对于优化 Java 应用程序的性能至关重要。

什么是并发(Concurrency)?Java 提供了哪些并发工具和类?

并发(Concurrency)是指多个独立的任务或者执行流同时进行的能力。在编程中,这意味着在同一时间内,多个任务可以同时执行,共享资源,并且可能会互相交互。并发可以提高应用程序的性能,尤其是在多核处理器系统中,因为它可以有效地利用多个 CPU 核心来并行处理任务。
Java 语言提供了丰富的并发工具和类,以支持并发编程。以下是一些主要的并发工具和类:

  1. 线程(Thread):
    • Thread 类是 Java 并发编程的基础,它表示一个执行线程。通过创建 Thread 对象并调用 start() 方法,可以启动一个新的线程。
  2. Runnable 接口:
    • Runnable 接口是一种用于定义线程执行任务的简单方式。实现 Runnable 接口的类需要重写 run() 方法,该方法包含要执行的代码。
  3. Executor 框架:
    • Executor 框架是一个高级的线程池管理API,它简化了线程的管理工作。通过 Executor,可以创建线程池并提交任务以异步执行。
  4. Callable 和 Future:
    • Callable 接口类似于 Runnable,但它可以返回一个结果或抛出一个异常。Future 对象代表一个异步计算的结果,可以通过调用 get() 方法来获取结果。
  5. 锁(Locks):
    • java.util.concurrent.locks 包提供了锁机制,如 ReentrantLock,它比传统的 synchronized 方法和语句提供了更灵活的锁定操作。
  6. 并发集合(Concurrent Collections):
    • Java 提供了线程安全的集合类,如 ConcurrentHashMapConcurrentLinkedQueueCopyOnWriteArrayList 等,这些集合类在多线程环境中提供了高性能的并发访问。
  7. 原子变量(Atomic Variables):
    • java.util.concurrent.atomic 包提供了原子变量类,如 AtomicIntegerAtomicLong 等,它们提供了无需锁的线程安全操作。
  8. CountDownLatch、CyclicBarrier 和 Semaphore:
    • 这些是同步辅助类,用于在并发任务之间的协调。例如,CountDownLatch 可以用来等待其他线程完成操作,而 CyclicBarrier 用于在多个线程中建立一个同步点。
  9. Fork/Join 框架:
    • Fork/Join 框架是一个用于并行执行任务的框架,它可以将一个任务分解成多个子任务,并在多个线程中执行它们,最后合并结果。
  10. CompletableFuture:
    • CompletableFuture 是一个用于异步编程的类,它提供了非阻塞的操作,可以组合多个异步任务,并处理它们的结果。
      Java 的并发工具和类是为了简化并发编程并提供高性能的并发应用程序而设计的。正确地使用这些工具和类可以帮助开发者编写出高效且线程安全的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蜂群优化算法(bee colony optimization algorithm)

​注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 算法引言 自然界的启发:BSO算法的灵感来自于蜜蜂在自然界中的觅食行为。在自然界中,蜜蜂需要找到花蜜来生存。当一只蜜…

在做题中学习(53):寻找旋转数组中的最小值

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode) 解法:O(logn)->很可能就是二分查找 思路:再看看题目要求,可以画出旋转之后数组中元素的大小关系: 首先,数组是具有二段性的(适配二分查…

车载测试系列:UDS诊断服务

UDS诊断服务介绍 UDS(Unified Diagnostic Services,统一诊断服务)诊断协议诊断测试仪和ECU之间一种通信协议,在ISO14229中规定。UDS被用在几乎所有由OEM一级供应商所制造的新ECU。 诊断工具与车内的所有ECU均有连接,…

IO 5.10

在一个进程中,创建一个子线程。 主线程负责:向文件中写入数据 子线程负责:从文件中读取数据 要求使用线程的同步逻辑,保证一定在主线程向文件中写入数据成功之后,子线程才开始运行,去读取文件中的数据#incl…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时,报错说 docker-compose 命令找不到,在网上试了一些安装方法,良莠不齐,所以在这块整理一下,如何正确快速的安装 docker-compose cd…

复习了好久的软考中项,现在上半年不考了,该怎么办?

如果有更多学习时间的话,可以考虑报考高级职称,因为高级和中级职称的很多知识点有重叠,只需要再复习一下相关论文就可以了。 从2024年下半年开始,集成考试将采用最新版教材和大纲,与高级职称的新版教材内容相似度很高…

【计算机毕业设计】springboot二手家电管理平台

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,二手家电管理平台当然不能排除在外。二手家电管理平台是在实际应用和 软件工程的开发原理之上,运用java语言以及前台VUE框架&#xf…

JMeter安装及使用

JMeter安装及使用 1.JMete安装 1.1 本地需要有Java8的环境 1.2 下载链接 JMeter官网下载地址 1.3 解压即安装 【!!命令窗口不可关闭】 2.更换语言 方法1 》Options》Choose Language》Chinese Simplified 方法2 解压的文件》bin》jmeter.propert…

盘点2024年4月Sui生态发展,了解Sui近期成长历程!

2024年4月是Sui的活动月,10–11日聚焦全世界目光的Sui Basecamp会议如约而至,来自65个国家的超过1100人参加了这场在巴黎举办的Sui全球性活动。21日,Sui首届全球黑客松正式开放注册。同时,20日-28日,七天四场大陆地区重…

通用产品发布解决方案(家居分类表设计以及renren代码生成器的使用)

文章目录 1.商品分类表设计1.需求分析2.数据库表设计1.数据库sunliving_commodity,商品分类表commodity_category2.测试数据 2.代码生成器生成crud1.解压到sunliving下并聚合管理1.解压2.修改sunliving的pom.xml进行聚合管理3.刷新maven报错 parent.relativePath4.将…

支付宝——图技术在金融反欺诈中的应用

目录 图在金融反欺诈中的应用背景 图驱动的感知研判决策处置 图在金融反欺诈中的演进 总结和展望

06-xss攻防于绕过

xss的攻击于防御 攻击的利用方式 1)获取cookie,实现越权,如果是获取到网站管理员的cookie,也可以叫提权。注意尽量尽快退出账号,删除session,让session失效 2)钓鱼网站,模拟真实的…

每日两题 / 226. 翻转二叉树 98. 验证二叉搜索树(LeetCode热题100)

226. 翻转二叉树 - 力扣(LeetCode) 以后续遍历的方式交换当前节点的左右指针 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), ri…

Visual Studio的使用方法

目录 1. 下载软件 2. 软件安装 3. 软件使用 4. VS工具的字体背景美化 5. 程序调试 1. 下载软件 官网地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 2. 软件安装 1.选中vs_Professional,鼠标右击选择“以管理员身份…

【CCF-CSP】202403-3 化学方程式配平

输入格式: 从标准输入读入数据。 输入的第一行包含一个正整数 n,表示需要判断的化学方程式的个数。 接下来的 n 行,每行描述了一个需要被配平的化学方程式。包含空格分隔的一个正整数和全部涉及物质的化学式。其中,正整数 m 表…

洗地机挑选有哪些要点?附618热门洗地机推荐

随着科技的不断发展,洗地机已经成为了人们家庭里必备的清洁家电了,它可以让我们高效的完成深度清洁的工作,让我们从繁重的家务劳动中解放出来,享受更轻松舒适的生活。那么我们如何在众多洗地机品牌中找到适合自己的产品呢&#xf…

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些? 先,我们需要明确Win10系统无法被远程桌面连接的可能原因。其中,最常见的原因包括:远程桌面功能未启用、网络连接问题、防火墙或安全软件设置不当、…

通俗的理解网关的概念的用途(一)

网关这个概念最早使用于网络,但在当今的智能设备/产品界中,硬生生的被产品人也搞出来一个“网关”的概念,这让早期的咱们这些只知道网络中的网关的人,听得稀里糊涂的。比如智能门锁、安防摄像头等,在产品的使用和介绍中…

node报错——解决Error: error:0308010C:digital envelope routines::unsupported——亲测可用

今天在打包vue2项目时,遇到一个报错: 最关键的代码如下: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…

C++——命名空间

c ——命名空间 前言一.命名空间命名空间的进一步拓展 二.io流特性 前言 ** 好久不见,甚是想念~今天我们讲解的是关于c命名空间的一些知识点,这只是开胃小菜哦,期待我们后面更深入知识的灵魂碰撞吧 ** 一.命名空间 怎么形容呢~命名空间出现…
最新文章