最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java拷貝機(jī)制之深拷貝、淺拷貝與零拷貝詳解

 更新時(shí)間:2026年02月27日 08:59:16   作者:J_liaty  
本文詳細(xì)介紹了Java中三種拷貝機(jī)制:淺拷貝、深拷貝和零拷貝,包括它們的核心概念、實(shí)現(xiàn)方式和適用場(chǎng)景,通過實(shí)戰(zhàn)案例和性能測(cè)試,幫助開發(fā)者根據(jù)具體需求選擇最優(yōu)的拷貝策略,需要的朋友可以參考下

本文系統(tǒng)梳理 Java 中三種拷貝機(jī)制的核心概念、實(shí)現(xiàn)方式及實(shí)戰(zhàn)案例,幫助開發(fā)者在不同場(chǎng)景下選擇最優(yōu)方案。

一、核心概念與本質(zhì)區(qū)別

1.1 三種拷貝的本質(zhì)對(duì)比

類型核心本質(zhì)復(fù)制粒度典型應(yīng)用性能特征
淺拷貝復(fù)制對(duì)象本身,不復(fù)制引用類型的內(nèi)部對(duì)象對(duì)象字段對(duì)象克隆、快速?gòu)?fù)制O(1)字段級(jí),極快
深拷貝完全復(fù)制整個(gè)對(duì)象圖,遞歸復(fù)制所有引用類型整個(gè)對(duì)象樹數(shù)據(jù)快照、隔離修改O(n)對(duì)象數(shù)量,內(nèi)存消耗大
零拷貝避免數(shù)據(jù)在內(nèi)核空間與用戶空間之間的復(fù)制數(shù)據(jù)傳輸指針高性能IO(文件、網(wǎng)絡(luò))極快,減少上下文切換

1.2 核心洞察

拷貝問題的本質(zhì)是內(nèi)存效率和數(shù)據(jù)一致性之間的權(quán)衡

  • 淺拷貝:犧牲一致性換取速度
  • 深拷貝:犧牲性能換取隔離
  • 零拷貝:從操作系統(tǒng)層面徹底繞過這個(gè)權(quán)衡

二、淺拷貝:字段級(jí)復(fù)制

2.1 核心機(jī)制

僅復(fù)制對(duì)象的字段,對(duì)于基本類型是值復(fù)制,對(duì)于引用類型只復(fù)制引用地址。

2.2 實(shí)現(xiàn)方式

方式一:Object.clone() - 需實(shí)現(xiàn) Cloneable 接口

public class ShallowCopy implements Cloneable {
    private int id;
    private List<String> data;
    
    @Override
    public ShallowCopy clone() throws CloneNotSupportedException {
        return (ShallowCopy) super.clone();
    }
}

方式二:拷貝構(gòu)造函數(shù)

public class ShallowCopy {
    private List<String> data;
    
    public ShallowCopy(ShallowCopy source) {
        this.data = source.data; // 引用復(fù)制
    }
}

2.3 關(guān)鍵陷阱

修改原對(duì)象的引用類型字段會(huì)影響克隆對(duì)象,兩者共享同一塊內(nèi)存。

三、深拷貝:對(duì)象圖完整復(fù)制

3.1 核心機(jī)制

遞歸復(fù)制所有引用對(duì)象,確保新對(duì)象與原對(duì)象完全獨(dú)立。

3.2 實(shí)現(xiàn)方式對(duì)比

方案優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景
重寫 clone() 遞歸不依賴外部庫代碼冗長(zhǎng),易漏遞歸簡(jiǎn)單對(duì)象樹
序列化/反序列化通用性強(qiáng),實(shí)現(xiàn)簡(jiǎn)單性能差,需實(shí)現(xiàn) Serializable不頻繁操作的場(chǎng)景
第三方工具(如 Kryo)高性能,易用引入外部依賴高性能要求

3.3 代碼示例

方式一:手動(dòng)遞歸 clone

public class DeepCopy implements Cloneable {
    private int id;
    private List<String> data;
    
    @Override
    public DeepCopy clone() throws CloneNotSupportedException {
        DeepCopy copy = (DeepCopy) super.clone();
        copy.data = new ArrayList<>(this.data); // 深度復(fù)制
        return copy;
    }
}

方式二:序列化方式

public static <T> T deepCopy(T obj) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(obj);
    
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bis);
    return (T) ois.readObject();
}

3.4 性能考慮

對(duì)象圖越大,深拷貝耗時(shí)和內(nèi)存消耗呈指數(shù)增長(zhǎng),需謹(jǐn)慎使用。

四、零拷貝:操作系統(tǒng)層面的極致優(yōu)化

4.1 核心機(jī)制

避免數(shù)據(jù)在內(nèi)核空間和用戶空間之間的冗余復(fù)制,直接在內(nèi)核空間完成數(shù)據(jù)傳輸。

4.2 典型應(yīng)用場(chǎng)景

  • 文件傳輸(FileChannel.transferTo)
  • 網(wǎng)絡(luò)傳輸(Netty的Zero-copy)
  • 內(nèi)存映射文件(MappedByteBuffer)

4.3 關(guān)鍵原理對(duì)比

傳統(tǒng) IO 拷貝流程

磁盤 → 內(nèi)核緩沖區(qū) → 用戶緩沖區(qū) → 內(nèi)核Socket緩沖區(qū) → 網(wǎng)絡(luò)
4次數(shù)據(jù)拷貝 + 4次上下文切換

零拷貝流程

磁盤 → 內(nèi)核緩沖區(qū) → 網(wǎng)絡(luò)
2次數(shù)據(jù)拷貝 + 2次上下文切換

4.4 代碼示例

// FileChannel.transferTo 實(shí)現(xiàn)零拷貝文件傳輸
FileChannel fromChannel = new FileInputStream("source.txt").getChannel();
FileChannel toChannel = new FileOutputStream("dest.txt").getChannel();

fromChannel.transferTo(0, fromChannel.size(), toChannel);

4.5 性能提升

在大文件傳輸場(chǎng)景下,零拷貝可提升數(shù)倍到數(shù)十倍性能。

五、實(shí)戰(zhàn)案例:如何選擇合適的拷貝方式

5.1 決策框架:三維評(píng)估矩陣

維度淺拷貝深拷貝零拷貝
對(duì)象是否需要完全隔離?? 共享引用? 獨(dú)立副本N/A(傳輸場(chǎng)景)
對(duì)象圖復(fù)雜度如何?簡(jiǎn)單/復(fù)雜皆可簡(jiǎn)單為宜N/A
操作頻率與性能要求?高頻/極速低頻/可接受延遲極高吞吐場(chǎng)景

5.2 實(shí)戰(zhàn)案例一:電商系統(tǒng)的商品快照

業(yè)務(wù)場(chǎng)景

訂單創(chuàng)建時(shí)需要保存商品信息的快照,避免后續(xù)商品編輯影響歷史訂單數(shù)據(jù)。

技術(shù)選型

public class ProductSnapshot {
    private Long productId;
    private String title;
    private BigDecimal price;
    private List<ProductSpec> specs; // 商品規(guī)格
    
    // 深拷貝實(shí)現(xiàn)
    public static ProductSnapshot fromProduct(Product product) {
        ProductSnapshot snapshot = new ProductSnapshot();
        snapshot.productId = product.getId();
        snapshot.title = product.getTitle();
        snapshot.price = product.getPrice();
        
        // 關(guān)鍵:規(guī)格列表必須深拷貝,否則后續(xù)規(guī)格修改會(huì)影響快照
        snapshot.specs = product.getSpecs().stream()
            .map(spec -> new ProductSpec(spec.getId(), spec.getName(), spec.getValue()))
            .collect(Collectors.toList());
            
        return snapshot;
    }
}

為什么選深拷貝?

  • ? 隔離性需求強(qiáng):訂單快照必須完全獨(dú)立
  • ? 對(duì)象圖可控:商品規(guī)格層級(jí)有限
  • ? 操作頻率低:只在訂單創(chuàng)建時(shí)執(zhí)行

5.3 實(shí)戰(zhàn)案例二:緩存層的對(duì)象復(fù)用

業(yè)務(wù)場(chǎng)景

高并發(fā)場(chǎng)景下,緩存商品信息供多個(gè)請(qǐng)求共享讀取。

技術(shù)選型

// 緩存層:淺拷貝返回
public class ProductCache {
    private LoadingCache<Long, Product> cache = CacheBuilder.newBuilder()
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build(new CacheLoader<Long, Product>() {
            @Override
            public Product load(Long productId) {
                return productDao.findById(productId);
            }
        });
    
    public Product getProduct(Long productId) {
        return cache.get(productId); // 直接返回緩存對(duì)象
    }
}

為什么選淺拷貝?

  • ? 只讀場(chǎng)景:多個(gè)請(qǐng)求只讀取不修改
  • ? 性能極致:避免了每請(qǐng)求都深拷貝的開銷
  • ? 緩存更新策略:定期刷新緩存

5.4 實(shí)戰(zhàn)案例三:文件服務(wù)的高性能傳輸

業(yè)務(wù)場(chǎng)景

用戶下載大文件(如視頻、安裝包),需要最小化服務(wù)器 CPU 和內(nèi)存壓力。

傳統(tǒng)方式的問題

// 傳統(tǒng) IO:4次拷貝,4次上下文切換
public void download(String path, HttpServletResponse response) throws IOException {
    byte[] buffer = new byte[8192];
    InputStream is = new FileInputStream(path);
    OutputStream os = response.getOutputStream();
    
    int bytesRead;
    while ((bytesRead = is.read(buffer)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
}

零拷貝優(yōu)化方案

// FileChannel 零拷貝:2次拷貝,2次上下文切換
public void downloadZeroCopy(String path, HttpServletResponse response) throws IOException {
    FileChannel fileChannel = new FileInputStream(path).getChannel();
    WritableByteChannel channel = Channels.newChannel(response.getOutputStream());
    
    fileChannel.transferTo(0, fileChannel.size(), channel);
    
    fileChannel.close();
}

為什么選零拷貝?

  • ? 數(shù)據(jù)量巨大:大文件傳輸,拷貝成本極高
  • ? 吞吐要求高:文件服務(wù)是典型 IO 密集型場(chǎng)景
  • ? 只讀傳輸:無需修改數(shù)據(jù)

六、實(shí)戰(zhàn)決策流程圖

開始
  │
  ├─ 是否涉及 IO 傳輸(文件/網(wǎng)絡(luò))?
  │   ├─ 是 → 零拷貝(FileChannel/Netty)
  │   └─ 否 ↓
  │
  ├─ 是否需要修改返回對(duì)象?
  │   ├─ 是 → 需要深拷貝
  │   │        ↓
  │   │    對(duì)象圖復(fù)雜嗎?
  │   │    ├─ 復(fù)雜 → 考慮序列化或 Kryo
  │   │    └─ 簡(jiǎn)單 → 手動(dòng)遞歸或 clone()
  │   │
  │   └─ 否(只讀) ↓
  │
  └─ 淺拷貝或直接返回引用

七、深拷貝與淺拷貝的對(duì)比測(cè)試

7.1 測(cè)試場(chǎng)景設(shè)計(jì)

設(shè)計(jì)一個(gè)包含多層引用的對(duì)象結(jié)構(gòu):

// 學(xué)生類(淺拷貝測(cè)試對(duì)象)
class Student implements Cloneable {
    private String name;
    private int age;
    private Address address; // 引用類型,測(cè)試淺拷貝問題
    private List<String> courses; // 集合類型,更貼近實(shí)際場(chǎng)景
    
    public Student(String name, int age, Address address, List<String> courses) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.courses = courses;
    }
    
    // 淺拷貝實(shí)現(xiàn)
    @Override
    public Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }
    
    // 深拷貝實(shí)現(xiàn)
    public Student deepClone() {
        Student copy = new Student(this.name, this.age, null, null);
        copy.setAddress(new Address(this.address.getCity(), this.address.getStreet()));
        copy.setCourses(new ArrayList<>(this.courses));
        return copy;
    }
    
    // Getters and Setters
    public String getName() { return name; }
    public int getAge() { return age; }
    public Address getAddress() { return address; }
    public List<String> getCourses() { return courses; }
    public void setName(String name) { this.name = name; }
    public void setAge(int age) { this.age = age; }
    public void setAddress(Address address) { this.address = address; }
    public void setCourses(List<String> courses) { this.courses = courses; }
    
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + 
               ", address=" + address + ", courses=" + courses + "}";
    }
}

// 地址類(用于測(cè)試引用拷貝)
class Address {
    private String city;
    private String street;
    
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
    
    public String getCity() { return city; }
    public String getStreet() { return street; }
    public void setCity(String city) { this.city = city; }
    public void setStreet(String street) { this.street = street; }
    
    @Override
    public String toString() {
        return "Address{city='" + city + "', street='" + street + "'}";
    }
}

7.2 機(jī)制對(duì)比測(cè)試:修改隔離性

public class CloneComparisonTest {
    
    @Test
    public void testShallowVsDeepCloneIsolation() throws CloneNotSupportedException {
        // 1. 創(chuàng)建原始對(duì)象
        Address address = new Address("北京", "中關(guān)村大街");
        List<String> courses = new ArrayList<>(Arrays.asList("Java", "Python"));
        Student original = new Student("張三", 20, address, courses);
        
        System.out.println("=== 原始對(duì)象 ===");
        System.out.println(original);
        
        // 2. 淺拷貝
        Student shallowCopy = original.clone();
        System.out.println("\n=== 淺拷貝后 ===");
        System.out.println("淺拷貝對(duì)象: " + shallowCopy);
        System.out.println("地址引用相同? " + (original.getAddress() == shallowCopy.getAddress()));
        System.out.println("課程列表引用相同? " + (original.getCourses() == shallowCopy.getCourses()));
        
        // 3. 深拷貝
        Student deepCopy = original.deepClone();
        System.out.println("\n=== 深拷貝后 ===");
        System.out.println("深拷貝對(duì)象: " + deepCopy);
        System.out.println("地址引用相同? " + (original.getAddress() == deepCopy.getAddress()));
        System.out.println("課程列表引用相同? " + (original.getCourses() == deepCopy.getCourses()));
        
        // 4. 修改原始對(duì)象的引用字段
        System.out.println("\n=== 修改原始對(duì)象后 ===");
        original.getAddress().setCity("上海");
        original.getCourses().add("Go");
        
        System.out.println("原始對(duì)象: " + original);
        System.out.println("淺拷貝對(duì)象: " + shallowCopy + " ← 受影響!");
        System.out.println("深拷貝對(duì)象: " + deepCopy + " ← 完全隔離");
    }
}

預(yù)期輸出

=== 原始對(duì)象 ===
Student{name='張三', age=20, address=Address{city='北京', street='中關(guān)村大街'}, courses=[Java, Python]}

=== 淺拷貝后 ===
淺拷貝對(duì)象: Student{name='張三', age=20, address=Address{city='北京', street='中關(guān)村大街'}, courses=[Java, Python]}
地址引用相同? true
課程列表引用相同? true

=== 深拷貝后 ===
深拷貝對(duì)象: Student{name='張三', age=20, address=Address{city='北京', street='中關(guān)村大街'}, courses=[Java, Python]}
地址引用相同? false
課程列表引用相同? false

=== 修改原始對(duì)象后 ===
原始對(duì)象: Student{name='張三', age=20, address=Address{city='上海', street='中關(guān)村大街'}, courses=[Java, Python, Go]}
淺拷貝對(duì)象: Student{name='張三', age=20, address=Address{city='上海', street='中關(guān)村大街'}, courses=[Java, Python, Go]} ← 受影響!
深拷貝對(duì)象: Student{name='張三', age=20, address=Address{city='北京', street='中關(guān)村大街'}, courses=[Java, Python]} ← 完全隔離

關(guān)鍵洞察:淺拷貝后修改原對(duì)象的引用字段,拷貝對(duì)象也被修改——這就是典型的"引用共享"陷阱。

7.3 性能對(duì)比測(cè)試:量化差異

public class ClonePerformanceTest {
    
    // 構(gòu)建復(fù)雜對(duì)象圖
    private static Student createComplexStudent() {
        Address address = new Address("北京", "中關(guān)村大街");
        List<String> courses = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            courses.add("Course-" + i);
        }
        return new Student("張三", 20, address, courses);
    }
    
    @Test
    public void testPerformanceComparison() throws CloneNotSupportedException {
        int iterations = 10000;
        
        // 預(yù)熱 JVM
        for (int i = 0; i < 1000; i++) {
            Student student = createComplexStudent();
            student.clone();
            student.deepClone();
        }
        
        // 測(cè)試淺拷貝性能
        long shallowStart = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            Student student = createComplexStudent();
            Student copy = student.clone();
        }
        long shallowEnd = System.nanoTime();
        double shallowTime = (shallowEnd - shallowStart) / 1_000_000.0;
        
        // 測(cè)試深拷貝性能
        long deepStart = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            Student student = createComplexStudent();
            Student copy = student.deepClone();
        }
        long deepEnd = System.nanoTime();
        double deepTime = (deepEnd - deepStart) / 1_000_000.0;
        
        System.out.println("=== 性能對(duì)比測(cè)試 ===");
        System.out.println("迭代次數(shù): " + iterations);
        System.out.printf("淺拷貝總耗時(shí): %.2f ms\n", shallowTime);
        System.out.printf("深拷貝總耗時(shí): %.2f ms\n", deepTime);
        System.out.printf("性能差距: %.2fx (深拷貝比淺拷貝慢)\n", deepTime / shallowTime);
        System.out.printf("單次淺拷貝: %.4f ms\n", shallowTime / iterations);
        System.out.printf("單次深拷貝: %.4f ms\n", deepTime / iterations);
    }
}

預(yù)期輸出(具體數(shù)值因硬件而異)

=== 性能對(duì)比測(cè)試 ===
迭代次數(shù): 10000
淺拷貝總耗時(shí): 12.34 ms
深拷貝總耗時(shí): 89.56 ms
性能差距: 7.26x (深拷貝比淺拷貝慢)
單次淺拷貝: 0.0012 ms
單次深拷貝: 0.0090 ms

關(guān)鍵洞察

  • 淺拷貝幾乎等同于對(duì)象創(chuàng)建速度,適合高頻場(chǎng)景
  • 深拷貝在對(duì)象圖復(fù)雜時(shí),性能差距可達(dá) 5-10 倍甚至更多

八、測(cè)試結(jié)果解讀指南

觀察點(diǎn)淺拷貝特征深拷貝特征實(shí)踐建議
引用地址原對(duì)象和拷貝對(duì)象共享引用獨(dú)立引用使用 == 判斷
修改傳播修改原對(duì)象影響拷貝對(duì)象完全隔離添加斷言驗(yàn)證
性能差異極快(μs級(jí))較慢(ms級(jí))量化對(duì)比
內(nèi)存占用低(共享引用)高(復(fù)制對(duì)象圖)使用 JProfiler 觀察

九、性能對(duì)比實(shí)測(cè)數(shù)據(jù)

場(chǎng)景數(shù)據(jù)量淺拷貝耗時(shí)深拷貝耗時(shí)零拷貝耗時(shí)
簡(jiǎn)單對(duì)象(10個(gè)字段)1次~1μs~50μsN/A
復(fù)雜對(duì)象圖(1000個(gè)對(duì)象)1次~1μs~15msN/A
100MB 文件傳輸1次N/AN/A800ms(傳統(tǒng)2500ms)

十、總結(jié)與最佳實(shí)踐

10.1 核心建議

  1. 默認(rèn)傾向淺拷貝:除非有明確的隔離性需求
  2. 深拷貝前三問
    • 對(duì)象圖多深?
    • 執(zhí)行多頻繁?
    • 是否有替代方案?
  3. 零拷貝是 IO 優(yōu)化的終極武器:一旦涉及大文件傳輸,優(yōu)先考慮

10.2 決策口訣

能用淺拷貝不用深拷貝,能用零拷貝不用傳統(tǒng)拷貝。

以上就是Java拷貝機(jī)制之深拷貝、淺拷貝與零拷貝詳解的詳細(xì)內(nèi)容,更多關(guān)于Java深拷貝、淺拷貝與零拷貝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?Web項(xiàng)目中如何添加Tomcat的Servlet-api.jar包(基于IDEA)

    Java?Web項(xiàng)目中如何添加Tomcat的Servlet-api.jar包(基于IDEA)

    servlet-api.jar是在編寫servlet必須用到的jar包下面這篇文章主要給大家介紹了基于IDEAJava?Web項(xiàng)目中如何添加Tomcat的Servlet-api.jar包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • JAVA如何刪除文件或者文件夾

    JAVA如何刪除文件或者文件夾

    文章介紹了Java中刪除文件和空文件夾的四種基本方法,包括File類的delete()、deleteOnExit()方法,以及Files類的delete(Path path)和deleteIfExists(Path path)方法,文章還講述了如何使用Files類的walkFileTree方法和FileVisitor接口來刪除整個(gè)目錄或目錄中的部分文件
    2025-01-01
  • Java實(shí)現(xiàn)簡(jiǎn)易HashMap功能詳解

    Java實(shí)現(xiàn)簡(jiǎn)易HashMap功能詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)易HashMap功能,結(jié)合實(shí)例形式詳細(xì)分析了Java實(shí)現(xiàn)HashMap功能相關(guān)原理、操作步驟與注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 詳解如何獨(dú)立使用ribbon實(shí)現(xiàn)業(yè)務(wù)客戶端負(fù)載均衡

    詳解如何獨(dú)立使用ribbon實(shí)現(xiàn)業(yè)務(wù)客戶端負(fù)載均衡

    這篇文章主要為大家介紹了詳解如何獨(dú)立使用ribbon實(shí)現(xiàn)業(yè)務(wù)客戶端負(fù)載均衡,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java SpringBoot高級(jí)用法詳解

    Java SpringBoot高級(jí)用法詳解

    這篇文章主要為大家詳細(xì)介紹了Java Spring Boot的一些高級(jí)用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • Spring?MVC的三種異常處理方式實(shí)例詳解

    Spring?MVC的三種異常處理方式實(shí)例詳解

    在SpringMVC 中,不管是編譯異常還是運(yùn)行時(shí)異常,都可以最終由 SpringMVC提供的異常處理器進(jìn)行統(tǒng)一處理,這樣就避免了隨時(shí)隨地捕獲處理的繁瑣性,這篇文章主要介紹了Spring?MVC的三種異常處理方式?,需要的朋友可以參考下
    2024-01-01
  • SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息的實(shí)例demo

    SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息的實(shí)例demo

    線程局部變量,創(chuàng)建一個(gè)線程變量后,針對(duì)這個(gè)變量可以讓每個(gè)線程擁有自己的變量副本,每個(gè)線程是訪問的自己的副本,與其他線程的相互獨(dú)立,本文介紹SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息,需要的朋友可以參考下
    2024-05-05
  • 解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況

    解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況

    這篇文章主要介紹了解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java實(shí)現(xiàn)選課系統(tǒng)

    java實(shí)現(xiàn)選課系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 使用spring mail發(fā)送html郵件的示例代碼

    使用spring mail發(fā)送html郵件的示例代碼

    本篇文章主要介紹了使用spring mail發(fā)送html郵件的示例代碼,這里整理了詳細(xì)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09

最新評(píng)論

广宗县| 太康县| 南和县| 旬阳县| 房山区| 从化市| 咸宁市| 东辽县| 凤庆县| 高阳县| 新蔡县| 霞浦县| 南京市| 西华县| 泰兴市| 株洲县| 阿坝县| 民乐县| 林口县| 沈丘县| 乐业县| 昆明市| 军事| 安达市| 罗田县| 沅江市| 安平县| 任丘市| 尚志市| 平遥县| 冀州市| 盐亭县| 荆州市| 东源县| 视频| 云林县| 城固县| 贡嘎县| 浦县| 富川| 叶城县|