.NET深入學習筆記(4):深拷貝與淺拷貝(Deep Copy and Shallow Copy)

今天繼續利用準備WSE安全開發文章的空閑時間,完善《.NET深入學習筆記》系列(基本都是.Net重要的知識點,我都做了詳細的總結,是什么、為什么、和怎么實現)。想必很多人也接觸過這兩個概念。做過C++的人對深淺拷貝的概念一定不會陌生。而其很多C#高級軟件工程師的面試里也會問到深淺拷貝相關的問題。我今天就在總結一下,并且添加了詳細的代碼實現,與大家分享。一起學習一下C#的深拷貝與淺拷貝(Deep Copy and Shallow Copy)的機制。全文還是分四部分:1.基本概念? 2.深拷貝與淺拷貝實現機制 3.代碼實現和分析 4.總結。下面我們來進入正式的學習。
1.基本概念:
首先我們應該了解一下什么叫深拷貝與淺拷貝(Deep Copy and Shallow Copy)。
a.淺拷貝(Shallow Copy影子克隆):只復制對象的基本類型,對象類型,仍屬于原來的引用。
????? b.深拷貝(Deep Copy 深度克隆):不緊復制對象的基本類,同時也復制原對象中的對象.完全產生新對象。
我們知道,在C++中有拷貝構造函數和拷貝賦值函數的概念。淺拷貝就是成員數據之間的一一賦值:把值賦給一一賦給要拷貝的值。但是可能會有這樣的情況:對象還包含資源,這里的資源可以指堆資源,或者一個文件。當值拷貝的時候,兩個對象就有用共同的資源,同時對資源可以訪問,這樣就會出問題。深拷貝就是用來解決這樣的問題的,它把資源也賦值一次,使對象擁有不同的資源,但資源的內容是一樣的。對于堆資源來說,就是在開辟一片堆內存,把原來的內容拷貝。??

??? 如果你拷貝的對象中引用了某個外部的內容(比如分配在堆上的數據),那么在拷貝這個對象的時候,讓新舊兩個對象指向同一個外部的內容,就是淺拷貝;如果在拷貝這個對象的時候為新對象制作了外部對象的獨立拷貝,就是深拷貝??
?? 這個C#里的概念與C++類似。我們可以參考以前的概念理解。?深拷貝與淺拷貝之間的區別基本可以從定義看出。首先淺拷貝是指將對象中的數值類型的字段拷貝到新的對象中,而對象中的引用型字段則指復制它的一個引用到目標對象。如果改變目標對象中引用型字段的值他將反映在原是對象中,也就是說原始對象中對應的字段也會發生變化。
深拷貝拷貝不同的是對于引用拷貝的處理,深拷貝將會在新對象中創建和原是對象中對應值類型的字段并且賦值。淺拷貝不會創建新引用類型,會返回相同的類型引用。深拷貝會重新創建新對象,返回新對象的引用字。C#中的觀察者模式就是淺拷貝的例子。我們保留的只是對象的副本。
? 2.深拷貝與淺拷貝實現機制:
從上面的概念我們了解了C#深拷貝與淺拷貝(Deep Copy and Shallow Copy)的不同之處。這個也就決定了兩者有不同的實現方式。
對于值類型:
??? a.淺拷貝:?通過賦值等操作直接實現,將對象中的值類型的字段拷貝到新的對象中。??????
??? b.深拷貝:通過賦值等操作直接實現,將對象中的值類型的字段拷貝到新的對象中。???和淺拷貝相同
對于引用類型:
??? a.淺拷貝:?MemberwiseClone 方法創建一個淺副本,方法是創建一個新對象,如果字段是值類型的,則對該字段執行逐位復制。如果字段是引用類型,則復制引用原始對象,與原對象引用同一對象。
b.深拷貝:拷貝對象應用,也拷貝對象實際內容,也就是創建了一個新的改變新對象 不會影響到原始對象的內容??
這種情況需要為其實現ICloneable接口中提供的Clone方法。
差別就是在對于引用類型的實現深拷貝和淺拷貝的時候的機制不同,前者是MemberwiseClone 方法實現,后者是通過繼承實現ICloneable接口中提供的Clone方法,實現對象的深拷貝。
3.代碼實現和分析:
下面我們來看看具體的代碼實現部分,首先介紹的還是值類型的。
a.值類型淺拷貝的實現。代碼如下:
/// <summary>?
InBlock.gif????????????????///????數組的=賦值(直接拷貝),也就是引用傳遞,指向的是同一個地址:?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodShallowCopyDirectly()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????int[] ArrayInt = { 0, 1, 2, 3 };?
InBlock.gif?
InBlock.gif????????????????????????//所以改變其中任意一個變量的值,另一個也會被改變?
InBlock.gif????????????????????????int[] NewArrayInt = ArrayInt;?
InBlock.gif????????????????????????//改變新的數組變量:?
InBlock.gif????????????????????????NewArrayInt[0] = 8;?
InBlock.gif????????????????????????Console.WriteLine("數組的復制(直接拷貝),改變新數組第一值為8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);?
InBlock.gif????????????????}?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?ArrayInt.CopyTo,創建以個新數組,不影響原來的值?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodShallowCopyArrayCopyTo()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????int[] ArrayInt = { 0, 1, 2, 3 };????????????
InBlock.gif?
InBlock.gif????????????????????????//CopyTo()方法?
InBlock.gif????????????????????????int[] NewArrayInt =?new?int[5];//創建以個新數組,按值拷貝,不影響原來的值?
InBlock.gif????????????????????????ArrayInt.CopyTo(NewArrayInt, 0);?
InBlock.gif????????????????????????NewArrayInt[0] = 8;?
InBlock.gif????????????????????????Console.WriteLine("Array.CopyTo,改變新數組第一值為8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);?
InBlock.gif?????????????????
InBlock.gif????????????????}?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?Array.Copy淺拷貝,值類型的淺拷貝,創建以個新數組,按值拷貝,不影響原來的值?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodShallowCopyArrayCopy()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????int[] ArrayInt = { 0, 1, 2, 3 };?
InBlock.gif????????????????????????//Copy()方法?
InBlock.gif????????????????????????int[] NewArrayInt =?new?int[4];?
InBlock.gif????????????????????????Array.Copy(ArrayInt, NewArrayInt, 0);//創建以個新數組,按值拷貝,不影響原來的值?
InBlock.gif????????????????????????NewArrayInt[0] = 8;?
InBlock.gif????????????????????????Console.WriteLine("Array.Copy,改變新數組第一值為8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);?
InBlock.gif?
InBlock.gif????????????????}?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?Array.Clone(),淺拷貝?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodShallowCopyArrayClone()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????int[] ArrayInt = { 0, 1, 2, 3 };?
InBlock.gif????????????????????????//Array Clone()方法?
InBlock.gif????????????????????????int[] NewArrayInt = ArrayInt.Clone()?as?int[];//按值拷貝,不影響原來的值?
InBlock.gif????????????????????????NewArrayInt[0] = 8;?
InBlock.gif????????????????????????Console.WriteLine("Array.Clone(),改變新數組第一值為8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);?
InBlock.gif????????????????}?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///?.淺拷貝:(引用類型),數組中的元素是引用類型,復制的是它的一個引用,改變新拷貝會改變原對象?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodShallowCopyStringArrayCopyTo()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????string[] sArray ={?"string0",?"string1",?"string2"?};?
InBlock.gif????????????????????????string[] sNewArray = sArray;?
InBlock.gif????????????????????????//淺拷貝一個新對象?
InBlock.gif????????????????????????sArray.CopyTo(sNewArray, 0);?
InBlock.gif?
InBlock.gif????????????????????????//改變新對象的值這個時候源對象中的值也會被改變?
InBlock.gif????????????????????????sNewArray[0] =?"FrankXuLei";?
InBlock.gif????????????????????????Console.WriteLine("數組的淺拷貝:(引用類型),改變第一值為FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]);?
InBlock.gif????????????????}?
InBlock.gif????????????????/// <summary>?
InBlock.gif????????????????///????//字符串數組的深拷貝,如果需要包含引用類型的數組的深副本,就必須迭代數組,創建新對象?
InBlock.gif????????????????/// </summary>?
InBlock.gif????????????????public?void?MethodDeepCopyStringArray()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????string[] sArray =?new?string[] {?"string0",?"string1",?"string2",?"string3"?};?
InBlock.gif????????????????????????string[] sNewArray =?new?string[4];//迭代數組,創建新對象?
InBlock.gif????????????????????????for?(int?i = 0; i < sArray.Length; i++)?
InBlock.gif????????????????????????{?
InBlock.gif????????????????????????????????string?sTemp =?string.Empty;?
InBlock.gif????????????????????????????????sTemp = sArray[i];?
InBlock.gif????????????????????????????????sNewArray[i] = sTemp;?
InBlock.gif????????????????????????}?
InBlock.gif????????????????????????sNewArray[0] =?"FrankXuLei";?
InBlock.gif????????????????????????Console.WriteLine("數組的復制(直接拷貝),改變新數組第一值為FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]);?
InBlock.gif????????????????}?
數組的=賦值(直接拷貝),也就是引用傳遞,指向的是同一個地址,所以改變其中任意一個變量的值,另一個也會被改變。ArrayInt.CopyTo,創建以個新數組,改變新的數組變量不影響原來的值。Array.Copy淺拷貝,值類型的淺拷貝,創建以個新數組,按值拷貝,不影響原來的值。?.淺拷貝:(引用類型),數組中的元素是引用類型,復制的是它的一個引用,改變新拷貝會改變原對象.
b.引用類型的深拷貝實現:
定義了以個汽車類,繼承接口繼承接口ICloneable。
InBlock.gifpublic?class?CarDeepClone : ICloneable?
InBlock.gif????????{?
InBlock.gif????????????????//名稱,引用類型?
InBlock.gif????????????????public?string?_name =?string.Empty;?
InBlock.gif????????????????//價格,值得類型?
InBlock.gif????????????????public?int?_price = 0;?
InBlock.gif????????????????//構造函數?
InBlock.gif????????????????public?CarDeepClone()?
InBlock.gif????????????????{?
InBlock.gif????????????????}?
InBlock.gif????????????????//重載構造函數?
InBlock.gif????????????????public????CarDeepClone(string?name,?int?price)?
InBlock.gif????????????????{?
InBlock.gif????????????????????????_name = name;?
InBlock.gif????????????????????????_price = price;?
InBlock.gif????????????????}?
InBlock.gif????????????????//深拷貝,需要重新生成對象,返回的新對象的實例?
InBlock.gif????????????????public?object?Clone()?
InBlock.gif????????????????{?
InBlock.gif?
InBlock.gif????????????????????????//深復制?????
InBlock.gif????????????????????????CarDeepClone obj =?new?CarDeepClone();//重新創建 CarDeepClone的對象?
InBlock.gif????????????????????????//obj.Member=???? (ClassA)Member.Clone();?????
InBlock.gif????????????????????????return?obj;?
InBlock.gif????????????????}?
InBlock.gif????????}?
c.引用類型的淺拷貝實現:
淺拷貝實現的方法是this.MemberwiseClone();創建當前對象的淺副本 ,返回相同的對象引用。而深拷貝的實現代碼是通過?CarDeepClone obj = new CarDeepClone();重新創建 CarDeepClone的對象。這個是兩者在實現上不同的地方。
InBlock.gifpublic?class?CarShallowClone : ICloneable?
InBlock.gif????????{?
InBlock.gif????????????????//名稱,引用類型?
InBlock.gif????????????????public?string?_name =?string.Empty;?
InBlock.gif????????????????//價格,值得類型?
InBlock.gif????????????????public?int?_price = 0;?
InBlock.gif????????????????//構造函數?
InBlock.gif????????????????public????CarShallowClone(string?name,?int?price)?
InBlock.gif????????????????{?
InBlock.gif????????????????????????_name = name;?
InBlock.gif????????????????????????_price = price;?
InBlock.gif????????????????}?
InBlock.gif????????????????//淺拷貝,MemberwiseClone方式返回對象的淺副本?
InBlock.gif????????????????public?object?Clone()?
InBlock.gif????????????????{?
InBlock.gif????????????????????????return?this.MemberwiseClone();//創建當前對象的淺副本 ,返回相同的對象引用?
InBlock.gif????????????????}?
InBlock.gif????????}
d.客戶端測試代碼實現:
包括值類型的淺拷貝和string類型數組的深拷貝的實現測試。以及對象的深拷貝和淺拷貝的測試。具體代碼如下:
InBlock.gifValueTypeCopy _ShallowCopy =?new?ValueTypeCopy();?
InBlock.gif????????????????????????Console.WriteLine("Value Type Shallow Copy Demo 值類型淺拷貝。。。。。。。。。。。。。。。。。。");?
InBlock.gif????????????????????????_ShallowCopy.MethodShallowCopyDirectly();//直接賦值?
InBlock.gif????????????????????????_ShallowCopy.MethodShallowCopyArrayClone();//調用數組的Clone()方法,淺副本?
InBlock.gif????????????????????????_ShallowCopy.MethodShallowCopyArrayCopy();//ArrayCopy方法?
InBlock.gif????????????????????????_ShallowCopy.MethodShallowCopyArrayCopyTo();//ArrayCopyTo()方法?
InBlock.gif????????????????????????_ShallowCopy.MethodShallowCopyStringArrayCopyTo();//ArrayCopyTo()方法?
InBlock.gif????
InBlock.gif????????????????????????_ShallowCopy.MethodDeepCopyStringArray();//深拷貝字符數組?
InBlock.gif?
InBlock.gif????
InBlock.gif?
InBlock.gif????????????????????????//DeepCopy Test深拷貝,重新生成對象,對新對象的修改不會改變原來對象的值?
InBlock.gif????????????????????????Console.WriteLine("Object Deep????????Copy Demo????對象深拷貝。。。。。。。。。。。。。。。。。。。。。");?
InBlock.gif????????????????????????CarDeepClone _CarDeepClone1 =?new?CarDeepClone("Benz700",700);?
InBlock.gif????????????????????????//深拷貝?
InBlock.gif????????????????????????Console.WriteLine("DeepCopy Test深拷貝,原對象名字{0}", _CarDeepClone1._name);?
InBlock.gif????????????????????????CarDeepClone _CarDeepClone2 = _CarDeepClone1.Clone()?as?CarDeepClone;?
InBlock.gif?
InBlock.gif????????????????????????Console.WriteLine("DeepCopy Test深拷貝,新對象名字{0}", _CarDeepClone2._name);?
InBlock.gif????????????????????????//修改新對象的名字?
InBlock.gif????????????????????????_CarDeepClone2._name =?"Benz800";?
InBlock.gif????????????????????????Console.WriteLine("DeepCopy Test深拷貝,新對象名字修改為{0}", _CarDeepClone2._name);?
InBlock.gif????????????????????????//輸出對象信息?
InBlock.gif????????????????????????Console.WriteLine("DeepCopy Test深拷貝,原對象名字為{0},新對象名字為{1}", _CarDeepClone1._name, _CarDeepClone2._name);?
InBlock.gif?
InBlock.gif????????????????????????//ShallowCopy Test淺拷貝,新對象的修改會改變原來對象的值得?
InBlock.gif????????????????????????Console.WriteLine("Object Shallow Copy Demo????對象淺拷貝。。。。。。。。。。。。。。。。。。。。。");?
InBlock.gif????????????????????????CarShallowClone _CarShallowClone1 =?new?CarShallowClone("BMW3", 300);?
InBlock.gif????????????????????????Console.WriteLine("ShallowCopy Test淺拷貝,原對象名字{0}", _CarShallowClone1._name);?
InBlock.gif????????????????????????//淺拷貝對象?
InBlock.gif????????????????????????CarShallowClone _CarShallowClone2 = _CarShallowClone1.Clone()?as?CarShallowClone;?
InBlock.gif????????????????????????Console.WriteLine("ShallowCopy Test淺拷貝,新對象名字{0}", _CarShallowClone2._name);?
InBlock.gif????????????????????????//修改新對象名字?
InBlock.gif????????????????????????_CarShallowClone2._name =?"BMW7";?
InBlock.gif????????????????????????Console.WriteLine("ShallowCopy Test淺拷貝,新對象名字修改為{0}", _CarShallowClone2._name);?
InBlock.gif????????????????????????//輸出對象信息?
InBlock.gif????????????????????????Console.WriteLine("ShallowCopy Test淺拷貝,原對象名字{0},新對象名字{1}", _CarShallowClone1._name, _CarShallowClone2._name);?
首先測試的值類型的不同的淺拷貝方法,實例化類ValueTypeCopy _ShallowCopy = new ValueTypeCopy();
????進行 值類型淺拷測試貝。分別包括:?? _ShallowCopy.MethodShallowCopyDirectly();直接賦值拷貝,
??????????? _ShallowCopy.MethodShallowCopyArrayClone();調用數組的Clone()方法,淺副本
??????????? _ShallowCopy.MethodShallowCopyArrayCopy();ArrayCopy方法
??????????? _ShallowCopy.MethodShallowCopyArrayCopyTo();ArrayCopyTo()方法
??????????? _ShallowCopy.MethodShallowCopyStringArrayCopyTo();ArrayCopyTo()方法
???????????? _ShallowCopy.MethodDeepCopyStringArray();深拷貝字符數組后面代碼主要是對對象深淺拷貝的不同測試。
運行結果如下圖:
4.總結
通過以上內容的學習,希望大家對C#中的深拷貝與淺拷貝(Deep Copy and Shallow Copy)的機制能有更深入的了解。我在總結這個文章的時候也查閱了MSDN及C#書籍等資料。與大家一起分享。有問題的也可以留言一起交流~共同學習進步~(最后附上本次實現的代碼。下載地址
/Files/frank_xl/CloneDemoFrankXuLei.zip?。前幾天忙碩士論文的事情,沒時間更新blog,現在抓緊時間繼續準備WSE3.0安全開發的文章,應該最近會寫出來。主要是涉及到的知識點很多,需要時間學習,而且開發環境配置比較復雜。代碼插入出了問題,有js錯誤,請大家下載代碼)



本文轉自 frankxulei 51CTO博客,原文鏈接:http://blog.51cto.com/frankxulei/318538,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VIM一般模式操作

2019獨角獸企業重金招聘Python工程師標準>>> vim介紹 vim和vi幾乎是一樣的&#xff0c;唯一的區別就是當編輯一個文本時&#xff0c;使用vi不會顯示顏色&#xff0c;而使用vim會顯示顏色。 vim有三個模式&#xff1a;一般模式&#xff0c;編輯模式&#xff0c;命令模…

[轉載] 解析Java的JNI編程中的對象引用與內存泄漏問題

參考鏈接&#xff1a; Java對象如何存儲在內存中 JNI&#xff0c;Java Native Interface&#xff0c;是 native code 的編程接口。JNI 使 Java 代碼程序可以與 native code 交互——在 Java 程序中調用 native code&#xff1b;在 native code 中嵌入 Java 虛擬機調用 Java 的…

[轉載] java中創建對象的方式

參考鏈接&#xff1a; 用Java創建對象的不同方法 java中的4種創建對象的方式&#xff1a; 在這片博文中和大家簡單分享一下常見的幾種創建java對象的方式 1.使用 new 的方式&#xff0c;這也是我們最常見的一種方式 我們以 Person 類來舉例說明 例&#xff1a; Person p…

Exchange 2007 SP1 如何定時清理日志???

Exchange 2007 SP1 如何定時清理日志&#xff1f;&#xff1f;&#xff1f; 時間:2011-12-31 11:00Tag標簽&#xff1a;來源:未知 作者:達思科技 點擊: 93次此文章出自&#xff1a; 專業數據恢復 問&#xff1a;Exchange 2007 SP1 如何定時清理日志&#xff1f;&#xff1f;&am…

[轉載] java-繼承和多態

參考鏈接&#xff1a; Java中的繼承 繼承&#xff1a; 繼承就是保持已有類的特性而構造新類的過程。繼承后&#xff0c;子類能夠利用父類中定義的變量和方法&#xff0c;就像它們屬于子類本身一樣。 單繼承&#xff1a;在類層次中&#xff0c;子類只繼承一個父類的數據結構…

走進SQL Server 2005:備份與恢復功能

每當有任何新的軟件發布的時候&#xff0c;你通常都會發現一些你從來不知道或者從來不知道你需要的新的特性。SQL Server 2000中存在的許多的備份和恢復特性都同樣保留在了SQL Server 2005中&#xff0c;但是有一些新的提高同樣值得你的關注。 鏡像備份 SQL Server 2005讓你可以…

[轉載] Java對返回值的封裝

參考鏈接&#xff1a; 用Java封裝 定義自己所需要的返回值類型 public class CodeMsg implements Cloneable { private int retCode; private String message; // 通用異常 public static CodeMsg SUCCESS new CodeMsg(0, "success"); public static CodeMsg EMP…

stateful set 學習筆記

2019獨角獸企業重金招聘Python工程師標準>>> 1、創建pv # cat pv.yaml kind: PersistentVolume apiVersion: v1 metadata:name: task-pv-volumelabels:type: local spec:capacity:storage: 3GiaccessModes:- ReadWriteOncehostPath:path: "/tmp/data" 2、…

[轉載] Java中對象數組的使用

參考鏈接&#xff1a; 如何在Java中交換或交換對象 Java對象數組使用 一、Java數組的使用二、Java的對象數組2.1 問題提出2.2 問題解析2.3 問題拆分2.4 代碼實現 一、Java數組的使用 對象數組其實和Java的數組類似的&#xff0c;所以要很清楚Java的數組是如何使用的&#xf…

Python自動化開發學習13-聯合唯一

聯合唯一 聯合唯一&#xff0c;就是一個表中的多個字段的組合需要唯一。 使用mysql語句創建 比如創建一張hosts表&#xff0c;記錄登錄的ip地址或者hostname&#xff08;表中對應字段host&#xff09;和 端口號&#xff08;表中對應字段port&#xff09;&#xff0c;要求host 和…

[轉載] Java獲取泛型T的類型 T.class

參考鏈接&#xff1a; Java中的抽象 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main{ public static void main(String[] args) { Foo<String> foo new Foo<String>(){}; // 在類的外部這樣獲取 Type type ((…

自定義控件---重寫Listbox實現item圖標變換和item點擊事件

博客開通有一陣了&#xff0c;就是沒有時間寫&#xff0c;遺憾啊。&#xff01; 這幾天做了個排序的自定義控件&#xff0c;在listbox item里放是button 并支持圖標的交替變換 效果如下&#xff1a; 把代碼貼上&#xff1a;1using System; 2using System.Collections.…

[轉載] Spring面試題整理

參考鏈接&#xff1a; Java中的動態方法Dispatch和運行時多態 Spring面試題整理 2018年03月07日 21:11:46 hrbeuwhw 閱讀數&#xff1a;49116 Spring 概述 1. 什么是spring? spring 是個Java企業級應用的開源開發框架。Spring主要用來開發Java應用&#xff0c;但是有…

ansible: Linux批量管理神器

我們已經知道&#xff0c;基于集群可實現服務器橫向擴展slace out。可是&#xff0c;當上百臺主機集合成共同為一個站點提供web頁面訪問的形式時&#xff0c;怎么管理整個集群體呢&#xff1f; 一些小伙伴大概聽說過pxe等可實現自動安裝系統。可是&#xff0c;要我們一臺一臺主…

[轉載] Python numpy函數:all()和any()比較矩陣

參考鏈接&#xff1a; Python中的any和all 數組元素的比對&#xff0c;我們可以直接使用“”進行比較&#xff0c;比如&#xff1a; 但是當數組元素較多時&#xff0c;查看輸出結果便變得很麻煩&#xff0c;這時我們可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初識-架構-安裝-初始化-連接-管理工具-數據文件

MySQL架構和結構分析 官方架構圖 內部組件結構圖 MySQL安裝方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客戶端命令mysql> help # 獲取命令幫助 mysql> \? # 同上 mysql> \c # 取消命令執行 mysq…

[轉載] Java基礎——關聯、聚合、組合

參考鏈接&#xff1a; Java中的關聯 | 組合和聚合 一.引言 其實自己也不知道&#xff0c;在需求設計、架構設計、開發階段是否真正需要弄明白“關聯、聚合、組合”。原本計劃這篇博文寫“繼承“和”多態”&#xff0c;但是一翻閱資料&#xff0c;基本上都會把“繼承”和“組…

[轉載] WSDL2Java詳細使用說明【官方最全說明】

參考鏈接&#xff1a; Java中的this說明 WSDL to Java 命名 wsdl2java - 獲取WSDL文檔并生成完全帶注釋的Java代碼&#xff0c;并實現相關服務。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

這是prompt的擴展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按鈕和圖標import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 啟動程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[轉載] JAVA 構造函數及其重載

參考鏈接&#xff1a; Java重載Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…