如何使用 Maven 来创建项目(一篇文章就够了)

article/2025/9/17 2:31:37

如何使用 Maven 来创建项目(一篇文章就够了)

  • 1. Maven 简介
    • 1. 简介
    • 2. 项目构建
    • 3. 项目构建工具
  • 2. Maven 的四大特性
    • 1. 依赖管理系统
      • 版本号规范
    • 2. 多模块构建
    • 3. 一致的项目结构
    • 4. 一致的构建模型和插件机制
  • 3. Maven 的安装配置和目录结构
    • 1. Maven 的安装配置
    • 2. 认识 Maven 目录结构
  • 4. Maven 命令
  • 5. IDEA 编辑集成 Maven 环境
  • 6. Maven 项目的创建
    • 1. 创建 Java 项目
    • 2. IDEA 自动下载 Maven 依赖
    • 3. 编译 Maven 项目
    • 4. 创建 Web 项目
    • 5. 启动 Web 项目
  • 7. Maven 仓库的基本概念
    • 1. 中央仓库
    • 2. 私服
    • 3. 其他公共库
  • 8. Maven 环境下构件多模块项目
    • 1. 创建 maven_parent 项目
    • 2. 依次创建 dao、service、controller 模块
    • 3. 修改模块的配置
    • 4. 设置模块之间的依赖
      • 1. dao 模块
      • 2. service 模块
      • 3. controller 模块
    • 5. 启动项目
  • 9. Maven 的打包操作
    • 1. 建立对应的目录结构
    • 2. 执行打包操作
  • 10. Maven 依赖的基本概念
    • 1. 依赖的基本配置
    • 2. 依赖范围
    • 3. 传递性依赖

1. Maven 简介

1. 简介

Maven 这个词翻译为“专家”,“内行”。
作为一个 Apache 组织中一个成功的开源项目,Maven 主要服务于基于 java 平台的项目构建,依赖管理和项目信息管理。

2. 项目构建

项目构建:项目的编译、打包等操作。
而 Maven 可以使用一条简单的命令,将所有的繁琐的步骤都能够自动完成,很快得到最终的结果。

3. 项目构建工具

Ant 构建
最早的构建工具,基于 IDE,是2000年最流行的 java 构建工具,不过它的 XML 脚本编写格式让 XML 文件特别大。
Maven【java】
项目对象模型,通过描述信息来管理项目的构建,报告和文档软件项目管理工具。它填补了 Ant 缺点,Maven 第一次支持了从网络上下载的功能,仍然采用 xml 作为配置文件格式。Maven 专注的是依赖管理,使用 Java 编写。
Gradle
属于结合以上两个的优点,继承了 Ant 的灵活和 Maven 的生命周期管理。它最大的区别时不用 xml 作为配置文件格式,采用了 DSL 格式,使得脚本更加简洁。

2. Maven 的四大特性

1. 依赖管理系统

Maven 为 Java 世界引入了一个新的依赖管理系统 jar 包管理,jar 升级时修改配置文件即可。
Maven 使用 groupIdartifactIdversion三个标签组成的Coordination(坐标)唯一标识一个依赖。
任何基于 Maven 构建的项目自身必须定义这三项属性,生成的包可以是 jar 包,也可以是 war 包或者 jar 包。

一个典型的依赖引用如下:

		<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency>

Maven 坐标属性的理解

  • Maven 制定了一套规则:使用坐标唯一标识构件(artifact)。
  • Maven 常用的坐标元素包括:groupId、artifactId、version、packaging、classfier。
  • 只要提供正确的坐标元素,Maven 就能找到对应的构件,首先在本地仓库查找,没有的话再去远程仓库下载。

groupId(Group)
定义当前 Maven 项目隶属的实际项目-公司名称。

artifactId(Artifact)
该元素定义实际项目中的 Maven 模块-项目名,推荐做法是使用实际项目名称作为 artifactId 的前缀。

Version
该元素定义 Maven 项目当前所处的版本

版本号规范

通常下载软件或jar包的时候会看到如下 :1.0.0-beta-2
版本号约定 < 主版本 >.< 次版本 >.<增量版本 >-< 里程碑版本 >
如这里的beta-2、 表示该增量的某一个里程碑。(SNAPSHOT快照版本,beta,rc,release,final为稳定版)

  • 主版本:表示项目的重大架构变更。例如: Maven2 和 Maven1 相去甚远; Struts1 和 Struts2 采用了 不同的架构。

  • 次版本:表示较大范围的功能增加和变化,及 Bug 修复,可能修复了很多 Bug, 但是从总体架构来说,没有什么变化。

  • 增量版本:一般是一些小的 bug fix ,不会有重大的功能变化。

  • 里程碑版本:顾名思义,这往往指某一个版本的里程碑。
    例如, Maven3 已经发布了很多里程碑版本,如:3.0-alpha-1 、 3.0-alpha-2 、 3.0-bata-1 等。
    这里的版本与正式版本 3.0 相比,往往表示不是非常稳定,还需要很多测试。
    我们用spring 或者开源框架 都是会选择 release稳定版本,这样版本通常在线上运行了一段时间,很稳定了。
    所以大家如果在引用别人SNAPSHOT版本的时候,需要注意可能存在各种各样的问题。

请添加图片描述

例如:版本号 1.3.4-beta-2 中
1:表示该本本是第一个重大版本;
3:表示这是基于重大版本的第三个次要版本;
4:表示该次要版本的第四个增量;
beata-2: 最后的“beta-2”表示该增量的某一个里程碑

GA
General Availability,正式发布的版本,官方开始推荐广泛使用,国外有的用GA来表示release版本。

RELEASE
正式发布版,官方推荐使用的版本,有的用GA来表示。比如spring。

Stable
稳定版,开源软件有的会用stable来表示正式发布的版本。比如Nginx。

Final
最终版,也是正式发布版的一种表示方法。比如Hibernate。

RC
Release Candidate,发行候选版本,基本不再加入新的功能,主要修复bug。是最终发布成正式版的前一个版本,将bug修改完就可以发布成正式版了。

alpha
α是希腊字母的第一个,表示最早的版本,内部测试版,一般不向外部发布,bug会比较多,功能也不全,一般只有测试人员使用。

Beta
β是希腊字母的第二个,公开测试版,比alpha版本晚些,主要会有“粉丝用户”测试使用,该版本仍然存在很多bug,但比alpha版本稳定一些。
这个阶段版本还会不断增加新功能。分为Beta1、Beta2等,直到逐渐稳定下来进入RC版本。

SNAPSHOT
快照版,Snapshot版本代表不稳定、尚处于开发中的版本 Release版本则代表稳定的版本
(1)如果deploy到远程服务器 如果是 release 只能deploy一次,以后部署的话,就会报错冲突,因此很稳定
(2)但是如果是snapshot的话,你可以deploy多次,每一次都会冲掉原来的版本,因此不稳定

2. 多模块构建

Maven 可以将一个项目分解为多个模块来进行构建和复查。

3. 一致的项目结构

通过 Ant 在eclipse 和在 IDEA 中创建的项目目录是不同的,两个软件中国构建的项目是不能直接转到其他软件中打开运行的。
通过 Maven 创建的项目,在任何软件中的项目目录都是相同的,不会带来项目目录不一致的问题。

4. 一致的构建模型和插件机制

<plugin><groupId>org. mortbay. jetty</ groupId><arti factId>maven-jetty-plugi n</arti factId><version>6.1.25</versi on><confi gurati on><scanIntervalSeconds>10</scanIntervalSeconds><contextPath>/test</contextPath></confi guration>
</p1ugin>

3. Maven 的安装配置和目录结构

1. Maven 的安装配置

检查 JDK 的版本
jdk 版本最好是 1.7 及以上版本
通过java -version来查看自己 jdk 版本

下载 Maven
Maven 官网
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下载之后直接解压即可
在这里插入图片描述

配置环境变量
复制 bin 的路径
F:\Maven\apache-maven-3.8.1\bin
在这里插入图片描述
检查是否配置成功
如下图显示就是配置成功了
在这里插入图片描述

2. 认识 Maven 目录结构

无论是在 IDEA 还是 eclipse 中创建的 Maven 项目的文件目录都是相同的。

${basedir}
存放 pom.xml 和所有的子目录

${basedir}/src/main/java
项目的 java 源代码

${basedir}/src/main/resource
项目的资源,比如 property 文件

${basedir}/src/test/java
项目的测试类,比如 JUnit 代码

${basedir}/src/test/resources
测试类使用的资源

在这里插入图片描述
更换本地仓库的地址
<localRepository>/path/to/local/repo</localRepository>
在这里插入图片描述

更换阿里镜像,加快依赖下载

    <mirror><id>mnexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>

在这里插入图片描述

4. Maven 命令

命令描述
mvn-version显示版本信息
mvn clean清理项目产生的临时文件,一般是模块下的target目录
mvn compile编译源代码,一般编译模块下的src/main/java目录
mvn package项目打包工具,会在模块下的target目录下生成jar或者war文件
mvn test测试命令,或执行src/test/java下junit的测试用例
mvn install将打包的jar/war文件复制到你的本地仓库中,提供其他模块使用
mvn deploy将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn site生成项目相关信息的网站
mvn eclipse:eclipse将项目转换为Eclipse项目
mvn dependency:tree打印出项目的整个依赖树
mvn srchetype:generate创建Maven的普通java项目
mvn tomcat7:run在tomcat容器中运行web应用
mvn jetty:run调用jetty插件的run目标在jetty Servlet容器中启动web应用

5. IDEA 编辑集成 Maven 环境

找到 IDEA 中 setting 下的 Maven 选项
在这里插入图片描述
将 IDEA 中默认的 Maven 更改为自己的 Maven
在这里插入图片描述

6. Maven 项目的创建

1. 创建 Java 项目

普通的 Java 项目,Maven 对应的模板就是quickstart选项
在这里插入图片描述

2. IDEA 自动下载 Maven 依赖

idea 会自动下载 Maven 中的依赖环境,显示 BUILE SUCCESS 就代表下载成功了,下载成功后,项目的目录结构就会显示了!
在这里插入图片描述

3. 编译 Maven 项目

点击右上角的 addconfiguration
在这里插入图片描述
点击加号,选择Maven
在这里插入图片描述
选择要执行的Maven命令
在这里插入图片描述
选择好对应的命令后,点击右侧的运行按钮即可执行对应的Maven命令
在这里插入图片描述
编译成功
在这里插入图片描述
同样的操作执行package命令
在这里插入图片描述
打包命令执行成功后,会在target目录中生成对应的jar文件或者war文件
在这里插入图片描述

4. 创建 Web 项目

Web 项目的创建和 Java 项目的创建基本相同,唯一不同的地方在于模板的选择,Web 对应的模板是webapp
在这里插入图片描述
修改 jdk 版本 1.8

  <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties>

修改 junit 版本 4.12

  <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>

删除标签 pluginManagement

<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement>

添加 tomcat 插件

      <plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8081</port> <!--启动的端口号,默认8081 --><path>/SecondMaven_project</path> <!-- 项目站点名,对外访问路径 --><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin>

添加 jetty 插件

      <!-- jetty插件, 设定端口与context path --><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.4.11.v20180605</version><configuration><scanIntervalSeconds>10</scanIntervalSeconds><webAppConfig><contextPath>/test</contextPath></webAppConfig></configuration></plugin>

5. 启动 Web 项目

点击右上角的 addconfiguration
在这里插入图片描述
点击加号,选择Maven
在这里插入图片描述
选择要执行的命令(jetty命令)后,点击确定
在这里插入图片描述
选择好对应的命令后,点击右侧的运行按钮即可执行对应的命令
在这里插入图片描述
运行成功页面
在这里插入图片描述
在这里插入图片描述
上面的jetty的命令,对于tomcat的命令一样

7. Maven 仓库的基本概念

在 Maven 中,仓库是一个位置。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件/工件。
在此基础上,Maven 可以在某个位置统一存储所有的 Maven 项目共享工件。

分类

  • 本地仓库
  • 远程仓库:中央仓库、私服、其他公共库

私服是另一种特殊的远程仓库,为了节省宽带和时间,应该在局域网内假设一个私有的仓库服务器,勇气代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。

一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或者测试时,如果需要使用依赖文件,它总是局域坐标使用本地仓库的依赖文件。

默认情况下,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/的仓库目录。有时候,因为某些原因(比如c盘空间不足),需要修改本地仓库目录地址。(如何修改本地仓库地址上面已经说过了!)

1. 中央仓库

由于原始的本地仓库是空的,Maven 必须知道至少一个可用的远程仓库,才能执行 Maven 命令的时候下载到需要的构建。中央仓库就是这样一个默认的远程仓库。

2. 私服

私服是一种特殊的远程仓库,它主要是架设在局域网内的仓库服务,主要供局域网内的 Maven 用户使用。当Maven需要下载构件时,它会先从私服中查找,如果私服没有,就从外部的远程仓库下载,并缓存在私服上,再为Maven提供。

3. 其他公共库

主要就是阿里云仓库
阿里云仓库的配置上面也已经说了!

8. Maven 环境下构件多模块项目

使用 Maven 提供的过模块构建的特性完成 Maven 环境下多个模块的项目的管理与构建。

模块 maven_parent – 基模块,就是常说的 parent(pom)
模块 maven_dao – 数据库的访问层,例如 jdbc 操作(jar)
模块 maven_service – 项目的业务逻辑层(jar)
模块 maven_controller – 用来接收请求,响应数据(war)

1. 创建 maven_parent 项目

File -> new - > maven
2022 版本的 IDEA 与之前的版本可能有些不同,创建 parent 模块的要按照下面的图解。
在这里插入图片描述

2. 依次创建 dao、service、controller 模块

对于 dao、service 模块的创建,模板都选用 quickstart
对于 controller 模块的创建,模板选择 web
在这里插入图片描述

3. 修改模块的配置

  • 设置 JDK 版本
  • 单元测试 junit 版本
  • 删除多余额的配置

4. 设置模块之间的依赖

1. dao 模块

1. 新建包
在这里插入图片描述
2. 在包中创建 UserDao 类
在这里插入图片描述

3. 在类中添加方法

package org.example.dao;public class UserDao {public static void testDao(){System.out.println("UserDao Test ... ");}}

2. service 模块

1. 同样需要创建包,在包中新建一个类(UserService)
在这里插入图片描述

2. 添加 dao 依赖

        <dependency><groupId>org.example</groupId><artifactId>ThreeMaven_project_dao</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>

3. 在 UserService 类中添加方法

package org.example.service;import org.example.dao.UserDao;public class UserService {public static void testService(){System.out.println("UserServlet Test ... ");//调用dao模块的方法UserDao.testDao();}}

3. controller 模块

1. 添加 service 依赖

        <dependency><groupId>org.example</groupId><artifactId>ThreeMaven_project_service</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>

2. 添加 Servlet 依赖

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>

3. 新建 Java 类,继承 HttpServlet 类,并重写 service 方法

package org.example.controller;import org.example.service.UserService;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/user")
public class UserServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("UserSErvlet Test ... ");//调用service模块的方法UserService.testService();}
}

4. 添加 tomcat 插件

        <plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8081</port> <!--启动的端口号,默认8081 --><path>/SecondMaven_project</path> <!-- 项目站点名,对外访问路径 --><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>

5. 启动项目

添加启动项目命令
和之前相同
在这里插入图片描述
直接运行可能会失败,如果失败的话就对每个项目都进行一次 install

在这里插入图片描述
先对 dao 进行 install
显示 BUILD SUCCESS 说明 install 成功
在这里插入图片描述
再对 service 进行 install
在这里插入图片描述

最后对 parent 进行 install
在这里插入图片描述

全部 install 完成后,再运行项目
在这里插入图片描述

在网页上输入上面的网址
在这里插入图片描述

9. Maven 的打包操作

对于企业级项目,无论是进行本地测试,还是测试环境测试以及最终的项目上线,都会涉及项目的打包操作。
对于每个环境下的项目打包,对应的项目所需要的配置资源都会有所区别,实现打包的方式有很多种,可以通过 ant,或者通过 idea 自带的打包功能实现项目打包。
对 Maven 项目,我们可以用 pom.xml 配置的方式来实现打包时的环境选择,相比其他形式打包工具,通过 Maven 只需要通过简单的配置,就可以轻松的完成不同环境下项目的整体打包。

1. 建立对应的目录结构

使用 idea 创建项目,目录结构可能会缺失,需要通过手动添加对应的目录。
1. 添加 Java 源文件夹
选择项目的 main 文件夹,右键 new,选择 directory
在这里插入图片描述
2. 添加资源文件夹
步骤如上,创建文件夹,命名为 resources,并标记为 Resources Root
在这里插入图片描述
java:Java 源码文件夹
resources:配置资源文件,如 xml 文件,properties 文件等
webapp:资源目录,用于存放 jsp、js、css、image 等资源

3. 添加对应的文件夹目录,及添加不同环境下对应的配置文件。(本地环境、测试环境、正式环境)
在这里插入图片描述
dev:本地环境
product:正式环境
test:测试环境

2. 执行打包操作

  1. clean compile package -Dmaven.test.skip=true
    打包默认环境(开发环境)并且跳过 maven 测试操作
  2. clean compile package -Ptest -Dmaven.test.skip=true
    打包测试环境并且跳过 maven 测试操作
  3. clean compile package -Pproduct -Dmaven.test.skip=true
    打包生产环境并且跳过 maven 测试操作

10. Maven 依赖的基本概念

1. 依赖的基本配置

根元素 project 下的 dependencies 可以包含多个 dependence 元素,以声明多个依赖。每个依赖都应该包含以下元素:

  1. groupId,artifactId,version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven 根据坐标才能找到需要的依赖。

  2. Type:依赖的类型,大部分情况下不需要声明,默认值为 jar。

  3. Scope:依赖范围

    • compile:编译依赖范围
      如果没有指定,就会默认使用该依赖范围。使用此依赖范围的 Maven 依赖,对于编译、测试、运行三种 classpath 都有效。
    • test:测试依赖范围
      使用此依赖范围的 Maven 依赖,只对于测试 classpath 有效,在编译主代码或者运行项目的使用时将无法使用此依赖。
    • provideed:已提供依赖范围
      使用此依赖范围的 Maven 依赖,对于编译和测试 classpath 有效,但在运行时无效。
    • runtime:运行时依赖范围
      使用此依赖范围的 Maven 依赖,对于测试和运行 classpath 有效,但在编译主代码时无效。
    • system:系统依赖范围
      该依赖与三种 classpath 的关系,和 provided依赖范围完全一致。
  4. Optional:标记依赖是否可选。

  5. Exclusions:用来排除传递性依赖。

2. 依赖范围

  • compile:编译依赖范围,如果没有指定,就会默认使用该依赖范围。
  • test:测试依赖范围,只在测试的时候需要。
  • provideed:已提供依赖范围。
  • runtime:运行时依赖范围。
  • system:系统依赖范围,一般不使用。

3. 传递性依赖

传递依赖机制,让我们在使用某个 jar 的时候就不用去考虑它依赖了什么。也不用担心引入多余的依赖。
传递依赖有可能产生冲突!!!


http://chatgpt.dhexx.cn/article/XA6TibHg.shtml

相关文章

IDEA中创建maven项目详细步骤,很清晰

前言 在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 如还未配置安装Maven的&#xff0c;请先下载安装。如何下载安装&#xff0c;可参考我另外篇文章&#xff1a; maven的下载与安装教程 本篇教程是以创建基于servlet的JavaWeb项目为例子&#xff0c;如…

深拷贝和浅拷贝

深拷贝和浅拷贝的知识涉及到堆栈的概念。 堆栈的概念&#xff1a; 基本类型&#xff1a; 名值存储在栈内存中&#xff0c;例如: let a 1;引用类型&#xff1a; 名存在栈内存中&#xff0c;值存在于堆内存中&#xff0c;但是栈内存会提供一个引用的地址指向堆内存中的值&…

深拷贝和浅拷贝的区别详解

深拷贝和浅拷贝的作用是复制对象数据&#xff0c;这两者都用于构造拷贝构造函数中&#xff0c;那么这俩之间到底有什么区别呢&#xff1f; 先上答案 - 浅拷贝&#xff1a;简单的赋值拷贝操作 - 深拷贝&#xff1a;在堆区重新申请内存空间&#xff0c;进行拷贝操作 下面举一个…

Python深拷贝与浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝&#xff0c;都会生成一个看起来相同的对象&#xff0c;他们本质的区别是拷贝出来的对象的地址是否和原对象一样&#xff0c;也就是地址的复制还是值的复制的区别。 什么是可变对象&#xff0c;什么是不可变对象&#xff1a; 可变对象是指&am…

详解JS深拷贝与浅拷贝

深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型&#xff0c;浅拷贝会对对象逐个成员依次拷贝&#xff0c;但只复制内存地址&#xff0c;而不复制对象本身&#xff0c;新旧对象成员还是共享同一内存&#xff1b;深拷贝会另外创建一个一模一样的对象&#xff0c;新对象跟原对…

c++深拷贝与浅拷贝

浅拷贝&#xff1a;简单的赋值拷贝操作&#xff08;这个是系统默认提供的&#xff09; 深拷贝&#xff1a;在堆区重新释放空间&#xff0c;进行拷贝操作&#xff08;要自己写的&#xff09; 简单来说&#xff0c;只要类属性里有指针等就必须利用深拷贝操作 为便于深刻理解&a…

实现深拷贝与浅拷贝的方法

深拷贝与浅拷贝概念&#xff1a; 深浅拷贝出现的前提&#xff1a; 应用类型的数据&#xff08;对象和数组&#xff09; 深拷贝就是把目标对象里面的数据一个一个都复制下来&#xff0c;创建出一个一模一样的&#xff0c;存放地址不一样&#xff0c;互不影响。就像真假美猴王。改…

深拷贝和浅拷贝的区别及实现方法

文章目录 一、引言二、浅拷贝1.Object.assign()2.concat()3.扩展运算符 三、深拷贝1. 利用json数据和json字符串之间的转换2.$.extend()3. 递归 查阅多篇文章后&#xff0c;自己归纳总结对深拷贝和浅拷贝的理解&#xff0c;不足之处&#xff0c;还望多多指导 一、引言 基本数据…

深拷贝与浅拷贝的区别

深拷贝与浅拷贝是针对对象属性为对象的&#xff0c;因为基本数据类型在进行赋值操作时&#xff08;也就是深拷贝&#xff08;值拷贝&#xff09;&#xff09;&#xff0c;是直接将值赋给了新的变量&#xff0c;也就是该变量是原变量的一个副本&#xff0c;这时&#xff0c;你修…

深拷贝和浅拷贝的区别是什么?

深拷贝和浅拷贝的区别是什么? 1、浅拷贝 (1)、定义 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主"对象进行拷贝&#xff0c;但不会复制主对象里面的对象。"里面的对象”会在…

深拷贝和浅拷贝常见的实现方式

浅拷贝的实现方式 1. Object.assign()方法 assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象&#xff0c;然后返回目标对象。但是他的拷贝方式不是固定的&#xff0c;看下面的代码演示&#xff1a; let obj {username: kobe}; let obj2 Object.assign({},o…

什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?

拷贝浅是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的就是内存地址&#xff0c;所以如果其中一个对象改变了这个地址&#xff0c;就会影响到…

Java的深拷贝与浅拷贝的区别

1.二者的区别 浅拷贝&#xff1a;在拷贝一个对象时&#xff0c;对对象的基本数据类型的成员变量进行拷贝&#xff0c;但对引用类型的成员变量只进行引用的传递&#xff0c;并没有创建一个新的对象&#xff0c;当对引用类型的内容修改会影响被拷贝的对象。 深拷贝&#xff1a;在…

深拷贝和浅拷贝的区别(必须掌握)

前言&#xff1a; 在面试中&#xff0c;你必须要知道的一个知识点&#xff0c;那就是浅拷贝和深拷贝&#xff0c;那么就必须知道基本数据类型和引用类型&#xff0c;其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同。 网片来自网络&#xff08;侵删&#xff09; …

C++的浅拷贝与深拷贝

目录 前言 一、区别 二、浅拷贝 1.简单描述 2.代码实例 三.深拷贝 1.简单描述 2.代码实例 四.完整代码 五.运行结果 总结 前言 C中有两种拷贝&#xff1a;深拷贝和浅拷贝 要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别 一、区别 1 在未定义拷贝构造函数…

拷贝构造(深拷贝、浅拷贝)

一、概念介绍 拷贝构造&#xff1a;拷贝构造函数&#xff0c;又称构造函数&#xff0c;是一种特殊的构造函数&#xff0c;它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 其唯一的形参必须是引用&#xff0c;但并不限制为const&#xff0c;一般普遍的会加上c…

C++——深拷贝和浅拷贝

1.浅拷贝与深拷贝的区别 浅拷贝&#xff08;默认拷贝函数&#xff09;&#xff1a;将原对象或原数组的引用直接赋给新对象&#xff0c;新数组&#xff0c;新对象/新数组只是原对象的一个引用。 深拷贝&#xff1a;创建一个新的对象和数组&#xff0c;将原对象的各项属性的“值”…

深拷贝和浅拷贝的区别和与原理

一、基本类型和引用类型 string,number,boolean,null,undefined,symbolFunction,Array,Object 基本类型是按值访问的&#xff0c;引用类型是按引用访问 基本类型和引用类型也有人叫原始类型和对象类型&#xff0c;拥有方法的类型和不能拥有方法的类型&#xff0c;可变类型和不…

浅拷贝、深拷贝

深拷贝和浅拷贝 这两个概念是在项目中比较常见的&#xff0c;在很多时候&#xff0c;都会遇到拷贝的问题&#xff0c;我们总是需要将一个对象赋值到另一个对象上&#xff0c;但可能会在改变新赋值对象的时候&#xff0c;忽略掉我是否之后还需要用到原来的对象&#xff0c;那么就…

深拷贝和浅拷贝(copy和deepcopy)详解

深拷贝和浅拷贝&#xff08;copy和deepcopy&#xff09;详解 详细解释存储方式列表的增删改列表修改已有值列表新增一个值列表整体重新赋值 copy与deepcopy的区别不可变类型可变类型 浅拷贝指的是创建一个新对象&#xff0c;其中包含原始对象的引用&#xff08;指针&#xff09…