[轉載] java中的經典問題:傳值與傳引用

參考鏈接: 有關Java中數組分配的有趣事實

參數傳遞的秘密??

知道方法參數如何傳遞嗎??

?

記得剛開始學編程那會兒,老師教導,所謂參數,有形式參數和實際參數之分,參數列表中寫的那些東西都叫形式參數,在實際調用的時候,它們會被實際參數所替代。?

?

編譯程序不可能知道每次調用的實際參數都是什么,于是寫編譯器的高手就出個辦法,讓實際參數按照一定順序放到一個大家都可以找得到的地方,以此作為方法調用的一種約定。所謂“沒有規矩,不成方圓”,有了這個規矩,大家協作起來就容易多了。這個公共數據區,現在編譯器的選擇通常是“棧”,而所謂的順序就是形式參數聲明的順序。?

?

顯然,程序運行的過程中,作為實際參數的變量可能遍布于內存的各個位置,而并不一定要老老實實的呆在棧里。為了守“規矩”,程序只好將變量復制一份到棧中,也就是通常所說的將參數壓入棧中。?

?

打起精神,謎底就要揭曉了。?

?

我剛才說什么來著?將變量復制一份到棧中,沒錯,“復制”!?

?

這就是所謂的值傳遞。??

??

C語言的曠世經典《The C Programming Language》開篇的第一章中,談到實際參數時說,“在C中,所有函數的實際參數都是傳‘值’的”。? 馬上會有人站出來,“錯了,還有傳地址,比如以指針傳遞就是傳地址”。? 不錯,傳指針就是傳地址。在把指針視為地址的時候,是否考慮過這樣一個問題,它也是一個變量。前面的討論中說過了,參數傳遞必須要把參數壓入棧中,作為地址的指針也不例外。所以,必須把這個指針也復制一份。函數中對于指針操作實際上是對于這個指針副本的操作。? Java的reference等于C的指針。所以,在Java的方法調用中,reference也要復制一份壓入堆棧。在方法中對reference的操作就是對這個reference副本的操作。? 謎底揭曉? 好,讓我們回到最初的問題上。? 在changeReference中對于reference的賦值實際上是對這個reference的副本進行賦值,而對于reference的本尊沒有產生絲毫的影響。? 回到調用點,本尊醒來,它并不知道自己睡去的這段時間內發生過什么,所以只好當作什么都沒發生過一般。就這樣,副本消失了,在方法中對它的修改也就煙消云散了。? ?也許你會問出這樣的問題,“聽了你的解釋,我反而對changeInteger感到迷惑了,既然是對于副本的操作,為什么changeInteger可以運作正常?”? 呵呵,很有趣的大腦短路現象。? 好,那我就用前面的說法解釋一下changeInteger的運作。? 所謂復制,其結果必然是副本完全等同于本尊。reference復制的結果必然是兩個reference指向同一塊內存空間。? 雖然在方法中對于副本的操作并不會影響到本尊,但對內存空間的修改確實實實在在的。? 回到調用點,雖然本尊依然不知道曾經發生過的一切,但它按照原來的方式訪問內存的時候,取到的確是經過方法修改之后的內容。? 于是方法可以把自己的影響擴展到方法之外。? ?

??

1.所有的參數傳遞都是 傳值,從來沒有 傳引用 這個事實; 2. 所有的參數傳遞都會在 程序運行棧上 新分配一個 值 的復制品;?

3.java只有按值傳遞,所謂的按地址(引用)傳遞,也屬于按值傳遞,只不過這個“值”是個地址;?

4.對于引用類型的傳參也是傳值的,傳的是引用類型的值,其實就是對象的地址;? 1.java參數是傳遞值的。 2.java所有對像變量都是對像的引用;??

5.或者說:傳遞過去的都是拷貝,區別在于拷貝的是基本數據類型還是引用;?

6.函數的形式參數,是傳入參數的拷貝;引用變量之間拷貝的是【地址】,基本變量之間拷貝的是 內存中的值 (被稱為直接量); 7.對象本身,與對象的地址 是2個東西,函數之間如果想【傳遞對象】,只能通過傳遞對象的地址來實現;??

程序1:?

?

public class Test

{

? ? String a = "123";

? ? public static void test(Test test)

? ? {

? ? ? ? test.a = "abc";

? ? }

?

? ? public static void main(String[] args)

? ? {

? ? ? ? Test test1 = new Test();

? ? ? ? test1.a = "567";

? ? ? ? System.out.println(test1.a); //567

? ??????

? ? ? ? test(test1);

? ? ? ? System.out.println(test1.a); //abc

? ??????

? ? }

}

?程序2:?

?

?

public class Test

{

? ? public static void test(String str)

? ? {

? ? ? ? str = "word";

? ? }

?

? ? public static void main(String[] args)

? ? {

? ? ? ? String string = "hello";

? ? ? ? System.out.println(string);? //hello

? ? ? ? test(string);

? ? ? ? System.out.println(string);? //hello

? ? }

}

?

?程序3:?

?

?

public class Test

{

? ? public static void test(StringBuffer str)

? ? {

? ? ? ? str.append("world");

? ? }

? ? public static void main(String[] args)

? ? {????

? ? ? ? StringBuffer str = new StringBuffer("hello");

? ? ? ? System.out.println(str);? //hello

? ? ? ? test(str);

? ? ? ? System.out.println(str);? //helloworld

? ? }

}?

??

程序4:?

?

public class Test

{

? ? public static void test(StringBuffer str)

? ? {

? ? ? ? str = new StringBuffer("world");

? ? }

? ? public static void main(String[] args)

? ? {????

? ? ? ? StringBuffer str = new StringBuffer("hello");

? ? ? ? System.out.println(str);? //hello

? ? ? ? test(str);

? ? ? ? System.out.println(str);? //hello

? ? }

}

?

?

?

1.傳遞的參數“值” 會在 函數當前運行棧上 復制一份。所有的 操作和賦值 都是對那個 參數“值”副本 進行的。操作能夠 改變成員變量,因為參數“值”副本 是一個 地址,能夠正確指向成員變量的位置。而賦值 則根本沒用,因為只是改變了當前函數棧內 參數“值”副本 的內容,而沒有改變上一層函數棧內的 對應“值”;?

2.=和.??

=(等號)操作的是變量的值; .(句點)操作的是引用的值;

?

?

?

3.關于傳參的問題只要把棧和堆搞明白了就應該很容易理解了:?

java傳參都是傳值,也就是把棧里面的值復制一份傳給參數; 當然如果是原始類型就是棧內原始類型值復制了一份傳遞; 如果是對象或者數組這樣的引用類型,那么棧里面的值就是該對象的引用的值具體說就是地址了,把這個值復制一份傳給方法,也就是復制了一個引用給方法去使用;??

?

?例如:

?public void func1(int a){}

?

?int i = 10;

?func1(i);? 的時候,實際上是作了a=i的操作

?而對象

?public void fun2(Object o){}

?

Object m = new Object();

?func2(m);的時候,也其實是作了o=m的操作

? 另一個程序:

??

?import java.io.Console;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.PrintWriter;

import java.util.*;?

?

class People

{? ?

? ? public int age;??

? ? public static void Swap(People a1, People a2)

? ? {? ? ?

? ? ? ? People tem;? ?

? ? ? ? tem = a1;? ??

? ? ? ? a1 = a2;? ? ?

? ? ? ? a2 = tem;?

? ? }??

? ? public static void Change(People a1, People a2)

? ? {? ? ??

? ? ? ? a1.age = 250;??

? ? ? ? a2.age = 250;? ?

? ? }

}

public class Empty

{?

? ? public static void main(String[]args)? ??

? ? {? ? ? ??

? ? ? ? People a1 = new People();? ??

? ? ? ? People a2 = new People();??

? ? ? ? a1.age = 1;??

? ? ? ? a2.age = 2;??

? ??????

? ? ? ? //這里沒能交換,看起來是按值傳遞? ? ? ?

? ? ? ? People.Swap(a1, a2);? ? ??

? ? ? ? System.out.printf("%d \t %d", a1.age, a2.age);? ? ? ? ? ? ?

? ? ? ? System.out.println();??

? ??????

? ? ? ? //這里修改了變量,看起來是按引用傳遞? ? ? ? People.Change(a1, a2);? ??

? ? ? ? System.out.printf("%d \t %d", a1.age, a2.age);?

? ? }

}

??

?

??

? 看上圖,方法的參數可以看做是另一個變量:a1_和a2_

? 它們只是和傳入參數擁有相同的對象地址而已;

? 對于交換對象也只是對a1_和a2_這兩個做交換罷了,不會影響a1,a2;

? 但如果是通過內存地址去修改對象內部,如改變age的值,則會影響a1,a2;

??

??

?

?

?

??

??

?

首先,推薦對Java有一定理解的同仁一本書《Practical Java》。在《Practical Java》中也有一個章節介紹Java中關于傳值和傳引用的問題,堪稱經典。《Practical Java》在Java中,事實上底層工作原理不存在傳引用的概念,這也象《Practical Java》中所說的那樣,Java中只有傳值。這句話理解起來需要費一定的周折。?

熟悉C的程序員都用過指針,對指針可謂愛之深恨之切。指針是指向一塊內存地址的內存數據(有些拗口),也就是說指針本身是一個占用4字節內存的int(32 位系統內),而這個int值恰恰又是另一塊內存的地址。比如"hello"這個字串,存放在@0x0000F000這個地址到@0x0000F005這段內存區域內(包括0x00的結束字節)。而在@0x0000FFF0到@0x0000FFF03這四個字節內存放著一個int,這個int的值是 @0x0000F000。這樣就形成了一個指向"hello"字串的指針。?

在Java中,很多人說沒有指針,事實上,在Java更深層次里,到處都是大師封裝好的精美絕倫的指針。為了更容易的講解Java中關于類和類型的調用,Java中出現了值與引用的說法。淺顯的來說,我們可以認為Java中的引用與C中的指針等效(其實差別非常非常大,但是為了說明我們今天的問題,把他們理解為等效是沒有任何問題的)。?

所謂傳引用的說法是為了更好的講解調用方式。基于上面對指針的理解,我們不難看出,指針其實也是一個int值,所謂傳引用,我們是復制了復制了指針的int值進行傳遞。為了便于理解,我們可以姑且把指針看作一種數據類型,透明化指針的int特性,從而提出傳引用的概念。?

重申一遍:Java中只有傳值。?

1所謂傳值和傳引用?

傳值和傳引用的問題一直是Java里爭論的話題。與C++不同的,Java里面沒有指針的概念,Java的設計者巧妙的對指針的操作進行了管理。事實上,在懂C++的Java程序員眼中,Java到處都是精美絕倫的指針。 下面舉個簡單的例子,說明什么是傳值,什么是傳引用。 //例1 void method1(){ int x=0; this.change(x); System.out.println(x); }?

void change(int i){ i=1; }?

很顯然的,在mothod1中執行了change(x)后,x的值并不會因為change方法中將輸入參數賦值為1而變成1,也就是說在執行change(x)后,x的值z依然是0。這是因為x傳遞給change(int i)的是值。這就是最簡單的傳值。 同樣的,進行一點簡單的變化。 //例2 void method1(){ StringBuffer x=new StringBuffer("Hello"); this.change(x); System.out.println(x); }?

void change(StringBuffer i){ i.append(" world!"); } 看起來沒什么變化,但是這次mothed1中執行了change (x)后,x的值不再是"Hello"了,而是變成了"Hello world!"。這是因為x傳遞給change(i)的是x的引用。這是最經典的傳引用。 似乎有些奇怪了,兩段程序沒有特別的不同,可是為什么一個傳的是值而另一個傳的是引用呢?......?

2非要搞清楚傳值還是傳引用的問題嗎??

搞清楚這自然是有必要的,不然我也不需要寫這么多了,不過的確沒有到"非要"的地步。?

?首先,如果我們不太關心什么是傳值什么是傳引用,我們一樣能寫出漂亮的代碼,但是這些代碼在運行過程中可能會存在著極大的隱患。全局變量是讓大家深惡痛絕(又難以割舍)的東西,原因就是使用全局變量要特別注意數據的保護。如果在多線程的程序里使用全局變量簡直就等于跟自己過不去。不了解傳值和傳引用的問題,跟使用全局變量不考慮數據保護的罪過是不相上下下的,甚至有時候比它還要糟。你會莫名其妙,為什么我的返回參數沒有起作用,為什么我傳進去的參數變成了這樣......? 一個例子: //例3 void mothed1(){ int x=0; int y=1; switchValue(x,y); System.out.println("x="+x); System.out.println("y="+y); } void switchValue(int a,int b){?

int c=a; a=b; b=c; } 上面是一個交換a,b值的函數,看起來似乎蠻正確的,但是這個函數永遠也不會完成你想要的工作。 還有一個例子: //例4 StringBuffer a=new StringBuffer("I am a "); StringBuffer b=a; a.append("after append"); a=b; System.out.println("a="+a); 在編程過程中,經常會遇到這種情況,一個變量的值要被臨時改變一下,等用完之后再恢復到開始的值。就好像上面的例子,a為了保持它的值,使用b=a做賦值,之后a被改變,再之后a把暫存在b里面的值取回來。這是我們一廂情愿的想法,而事實上,這段代碼執行后,你會發現a的值已經改變了。 以上是兩個最簡單的例子,真正的程序開發過程中,比這要復雜的情況每天都會遇到。?

3類型和類?

Java 提出的思想,在Java里面任何東西都是類。但是Java里面同時還有簡單數據類型int,byte,char,boolean,與這些數據類型相對應的類是Integer,Byte,Character,Boolean,這樣做依然不會破壞Java關于任何東西都是類的提法。這里提到數據類型和類似乎和我們要說的傳值和傳引用的問題無關,但這是我們分辨傳值和傳引用的基礎。?

4試圖分辨傳值還是傳引用?

為什么是"試圖分辨"呢?很簡單,傳值和傳引用的問題無處不在,但是似乎還沒有人能正統的給出標準,怎樣的就是值拷貝調用,怎樣的就是引用調用。面對這個問題,我們更多的應該是來自平時積累對Java的理解。 回過頭來,我們分析一下上面的幾個例子: 先看例1,即使你不明白為什么,但是你應該知道這樣做肯定不會改變x的值。為了方便說明,我們給例子都加上行號。 //例1 1 void method1(){ 2 int x=0; 3 this.change(x); 4 } 5 6 void change(int i){ 7 i=7; 8} 讓我們從內存的存儲方式看一下x和I之間到底是什么關系。 在執行到第2行的時候,變量x指向一個存放著int 0的內存地址。?

變量x---->[存放值0]?

執行第3行調用change(x)方法的時候,內存中是這樣的情形:x把自己值在內存中復制一份,然后變量i指向這個被復制出來的0。?

變量x---->[存放值0] ↓進行了一次值復制 變量x---->[存放值0]?

這時候再執行到第7行的時候,變量i的被賦值為7,而這一步的操作已經跟x沒有任何關系了。?

變量x---->[存放值0]? 變量x---->[存放值7]?

說到這里應該已經理解為什么change(x)不能改變x的值了吧?因為這個例子是傳值的。 那么,試著分析一下為什么例三中的switchValue()方法不能完成變量值交換的工作? 再看例2。 //例2 1void method1(){ 2 StringBuffer x=new StringBuffer("Hello"); 3 this.change(x); 4} 5 6void change(StringBuffer i){ 7 i.append(" world!"); 8} 例2似乎和例1從代碼上看不出什么差別,但是執行結果卻是change(x)能改變x的值。依然才從內存的存儲角度來看看例2的蹊蹺在哪里。 在執行到第2行時候,同例1一樣,x指向一個存放"Hello"的內存空間。?

變量x---->[存放值"Hello"]?

接下來執行第三行change(x),注意,這里就與例1有了本質的不同:調用change(x)時,變量i也指向了x指向的內存空間,而不是指向x的一個拷貝。?

變量x \ -->[存放值"Hello"] 變量x /?

于是,第7行對i調用append方法,改變i指向的內存空間的值,x的值也就隨之改變了。?

變量x \ -->[追加為"Hello World!"] 變量x /?

為什么x值能改變呢?因為這個例子是傳引用的。 這幾個例子是明白了,可是很多人會開始有另一個疑問了:這樣看來,到底什么時候是傳的值什么時候是傳得引用呢?于是,我們前面講到的類型和類在這里就派上了用場:對于參數傳遞,如果是簡單數據類型,那么它傳遞的是值拷貝,對于類的實例它傳遞的是類的引用。需要注意的是,這條規則只適用于參數傳遞。為什么這么說呢?我們看看這樣一個例子: //例5 String str="abcdefghijk"; str.replaceAll("b","B"); 這兩句執行后,str的內容依然是"abcdefghijk",但是我們明明是對str操作的,為什么是這樣的呢?因為str的值究竟會不會被改變完全取決于replaceAll這個方法是怎么實現的。類似的,有這樣一個例子: //例6 1 void method1() { 2 StringBuffer x = new StringBuffer("Hello"); 3 change1(x); 4 System.out.println(x); 5 } 6 7 void method2() { 8 StringBuffer x = new StringBuffer("Hello"); 9 change2(x); 10 System.out.println(x); 11 } 12 13 void change1(StringBuffer sb) { 14 sb.append(" world!"); 15 } 16 17 void change2(StringBuffer sb) { 18 sb = new StringBuffer("hi"); 19 sb.append(" world!"); 20 } 調用method1(),屏幕打印結果為:"Hello world!" 調用method2(),我們認為結果應該是"hi world",因為sb傳進來的是引用。可是實際執行的結果是"Hello"! 難道change2()又變成傳值了?!其實change1()和change2()的確都是通過參數傳入引用,但是在方法內部因為處理方法的不同而使結果大相徑庭。我們還是從內存的角度分析: 執行method1()和change1()不用再多說了,上面的例子已經講解過,這里我們分析一下method2()和change2()。 程序執行到第8行,x指向一個存放著"Hello"的內存空間。?

變量x---->[存放值"Hello"]?

第9行調用change2,將sb指向x指向的內存空間,也就是傳入x的引用。?

變量x \ -->[存放值"Hello"] 變量x /?

到這里為止還沒有什么異樣,接下來執行18行,這里就出現了類似傳入值拷貝的變化:new 方法并沒有改變sb指向內存的內容,而是在內從中開辟了一塊新的空間存放串"hi",同時sb指向了這塊空間。?

變量x---->[存放值"Hello"] ×原有的引用被切斷 變量x---->[另一塊存放"hi"的空間]?

接下來再對sb進行append已經和x沒有任何關系了。 所以,還有一條不成規則的規則:對于函數調用,最終效果是什么完全看函數內部的實現。比較標準的做法是如果會改變引用的內容,則使用void作為方法返回值,而不會改變引用內容的則在返回值中返回新的值。 雖然已經說了這么多,但是感覺傳值還是傳引用的問題依然沒有完全說清楚。因為這個問題本身就是很難歸納總結的問題,所以更多的理解要靠平時的積累和形成。下面幾個例子,給大家嘗試進行分析。 //例7,打印結果是什么? public static void main(String[] args) { int a; int b; StringBuffer c; StringBuffer d; a = 0; b = a; c = new StringBuffer("This is c"); d = c;?

a = 2; c.append("!!");?

System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println("d=" + d); }?

//例8,打印結果是什么? public class Test{?

public static void main(String[] args) {?

StringBuffer sb = new StringBuffer("Hello ");?

System.out.println("Before change, sb = " + sb);?

changeData(sb);?

System.out.println("After changeData(n), sb = " + sb);?

}?

?

public static void changeData(StringBuffer strBuf) {?

StringBuffer sb2 = new StringBuffer("Hi ");?

strBuf = sb2;?

sb2.append("World!");?

}?

}?

?

?

??

??

文章部分參考自:?

Java基本功——Reference?

傳值還是傳引用

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

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

相關文章

[3/21]Windows Server 2008時鐘方面的改進展示

在Windows Server 2008中的時鐘顯示和以往Windows Server 2003及以前的版本顯示有很大的差別。如果要顯示并進行簡單的時間修改可以在時鐘上雙擊,會出現如下圖所示的界面。在上圖中可以調整但無法進行真正的修改,徹底修改需要點擊"更改日期和…

[轉載] 黑馬程序員_學習筆記8_C#基礎歸納之數組

參考鏈接: Java中的鋸齒數組Jagged array ---------------------- Windows Phone 7手機開發、.Net培訓、期待與您交流! ---------------------- 什么是數組? 數組是一組數據結構,它可以包含同一類型的多個元素。C#用特殊記號還…

2Python全棧之路系列之MysQl基本數據類型

Python全棧之路系列之MySQL基本數據類型 MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。 MySQL支持多種類型,大致可以分為三類: 數字類型 日期和時間類型 字符串類型 數字類型 類型大小用途BIT-二進制TINYINT1字節小整數值INT or INTEGER4字…

[轉載] JAVA筆記_(Day04,Day05)函數數組

參考鏈接: 了解Java中的數組IndexOutofbounds異常 文章目錄 函數定義練習誤區重載(overload)重載選擇題練習函數的內存調用問題 數組定義數組的內存圖解數組的常見問題應用求和最大值將數組轉成字符串查表法轉十六進制查表版(十六…

VDI序曲二 RemotoAPP部署

首先,我們需要準備如下角色:沿用VDI序曲一的2臺物理服務器以及角色我們在物理服務器1的hyper-v上,我們利用之前我介紹的“服務器虛擬化之準備母盤VHD”的方法再創建如下虛擬機:WIN-RDAPP;WIN-RDWA;WIN-RDCB…

[轉載] Java ArrayList toArray(T[] a) 解惑

參考鏈接&#xff1a; Java中的Array vs ArrayList 先看一個小的代碼片段 ArrayList<Integer> arrayList new ArrayList<>(); Collections.addAll(arrayList, 11, 21, 31, 41, 51); Integer[] a new Integer[0]; Integer[] b new Integer[arrayList.size()]; …

CentOS7使用firewalld打開關閉防火墻與端口(轉載)

1、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld 查看狀態&#xff1a; systemctl status firewalld 停止&#xff1a; systemctl disable firewalld 禁用&#xff1a; systemctl stop firewalld 2.systemctl是CentOS7的服務管理工具中主要的工具&#xff…

多任務管理類 MutilTaskManager

計算和計算所需的數據能被較為平均的非配到若干task的時候&#xff0c;下面的任務管理類可以提供在大數據大計算量的情況下非精確的控制task的執行數量來限制計算量和內存占用量.下面是代碼&#xff08;非線程安全版本&#xff09;&#xff1a; public class MutilTaskManager{…

[轉載] Scanner和bufferreader讀取控制臺字符的區別

參考鏈接&#xff1a; Java中Scanner和BufferReader類之間的區別 從開始學習Java就用了scanner&#xff0c;因為比較簡單每當遇到空格鍵或者換行鍵則讀取下一個字符&#xff0c;一般用法 while(input.hasNextInt()){ int n input.nextInt(); int t input.nextInt(); int c …

Node.js meitulu圖片批量下載爬蟲1.051

原有1.05版程序沒有斷點續傳模式&#xff0c;現在在最近程序基礎上改寫一版1.051. // // meitulu圖片批量下載爬蟲1.051 // 用最近的斷點續傳框架改寫原有1.05版程序 // 2017年11月21日 //// 內置https模塊 var httpsrequire("https");// 內置http模塊 var httprequi…

[轉載] Java實現歸并排序(超詳細,新手請進)

參考鏈接&#xff1a; Java中將數組合并為的新數組 歸并排序 大家好&#xff0c;這是我第一次在CSDN上寫東西&#xff0c;因為我一直覺得有需要就去找別人的blog看看就好&#xff0c;但我發現自己寫出來的東西確實能加深記憶。我半路出家&#xff0c;屬實是個菜鳥&#xff0…

centos6設置靜態IP

#編輯配置文件,添加修改以下內容 vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTOstatic #啟用靜態IP地址 ONBOOTyes #開啟開機自動啟用網絡連接 IPADDR192.168.21.129 #設置IP地址 NETMASK255.255.255.0 #設置子網掩碼 GATEWAY192.168…

[轉載] 1022 D進制的A+B (20分)【java題解】【80ms】

參考鏈接&#xff1a; Java流Stream 題解 使用 toUnsignedString&#xff08;&#xff09;即可 我有仔細讀過toUnsignedString&#xff08;&#xff09;&#xff0c;有興趣可以看看 第3章 java的基本程序設計結構【補缺學習】【注釋與數據類型】【核心技術卷I】 impor…

mysql 5.6.4以上版本innodb支持全文索引的測試

對于mysql 5.6.4以上版本innodb支持全文索引的測試 在mysql官網&#xff0c;innodb引擎在5.6.4版本提供了對全文索引的支持&#xff0c;筆者對此做了測試&#xff0c;發現對中文全文檢索的支持依然不理想&#xff0c;但卻確實提供了對英文的全文支持。 12.9.5 Full-Text Restri…

[轉載] Java字符串分割方法

參考鏈接&#xff1a; Java中的StringTokenizer方法的示例 2 [sizemedium]1.用split()方法進行分割&#xff0c;分割開的子字符串放入數組&#xff0c;然后進行處理。 示例代碼如下&#xff1a; public class SplitTest { /** * param args * author colin */ …

[轉載] Java StringBuilder StringJoiner

參考鏈接&#xff1a; 何時在StringBuilder上使用StringJoiner 1. StringBuilder Java編譯器對String做了特殊處理&#xff0c;使得我們可以直接用拼接字符串。 雖然可以直接拼接字符串&#xff0c;但是&#xff0c;在循環中&#xff0c;每次循環都會創建新的字符串對象&a…

EMC VMAX的磁盤構成,fast policy(重要)

首先是流程&#xff0c; 不同種類的磁盤&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后細看&#xff1a; 1&#xff09; 不同種類的磁盤叫做disk&#xff0c;這是可見的物…

[轉載] Java反射是什么?看這篇絕對會了!

參考鏈接&#xff1a; Java中的util.Arrays與Reflection.Array的示例 作者&#xff1a;火星十一郎 https://www.cnblogs.com/hxsyl 一.概念 反射就是把Java的各種成分映射成相應的Java類。 Class類的構造方法是private&#xff0c;由JVM創建。 反射是java語言的一個特性…

[精講-3]Offline Domain Join

從windows 2008 ,windows 7開始起就具備脫機加入域的功能,就是它們在未連接DC的情況下,也可以加入域. 假如環境lab.com ,一臺已加入域的PC (WIN7Client) 和即將加入域的PC(win7-2) 在win7client上run下面這個命令 DC已作了一次預先的動作:創建了computer object 在win7-2上,用本…