你是否也曾有過被c a a b b c支配的恐懼

2021-10-07 04:15:08 字數 1646 閱讀 4212

先看下面這段**

c = a;

a = b;

b = c;

剛學程式設計那會兒,完全不知道這段**到底在幹嘛?!現在大家應該都能看懂這段**的意義,就是實現了a和b值的互換,c作為乙個過渡變數而存在。用人的思維去理解這段**就是:第一步,將a的值給到c。此時c就等於是a的乙個備份。因為a有了備份,就可以對a進行操作,所以有第二步,將b的值給到a。此時a的值已經是b。我們完成了互換的一半。因為b的值已經給到a了,所以我們可以對b進行操作,所以有第三步,將c的值給到b。因為c的值就是a,所以此時b的值就是a。我們完成了a和b值得互換。

原本挺簡單的**,讓我解釋了這麼多,似乎有點畫蛇添足。如果你真的覺得簡單,咱們再接著看。

下面是很經典的氣泡排序

for(i=0;inumbers[j+1])

}}

啊哈,好像也沒什麼難度。就是實現了陣列numbers的j和j+1位置的互換。再接著看。

下面是jdk 1.7 hashmap transfer方法的一段**

for (entrye : table) 

int i = indexfor(e.hash, newcapacity);

e.next = newtable[i];

newtable[i] = e;

e = next;

}}

這段**到底幹了啥?!簡單來說,就是將hashmap舊陣列中的元素移動到新陣列中。table是個entry陣列,e代表乙個entry,entry又是個列表。當然這不是我們關注的重點,我們此時值關注**3,8,9,10行。這個似乎跟我們上面的有點不一樣了。不一樣的地方:一是變成了四個變數,包括e,e.next,next和newtable[i];二是變數之間是有關聯的;三也是最重要的不同,此時的變數儲存的不再是簡單的數值,而是位址引用。最後一點有什麼不同呢?在這一點上就是我們不能再將等於簡單理解成是賦值(當然其實還是賦值,不過賦值的是位址引用),而是應該將等於認為是引用的變更。接著我們試著去理解這段**的意義。

當我們執行第3行**,我們的意思是將e的下乙個節點賦值給next。此時next就是e.next的備份。我們就可以對e.next做一些操作了。看第8行,我們果然將newtable[i]賦值給e.next。newtable[i]代表新陣列中索引為i的entry鍊錶的首節點。真正的含義就是e.next的指向變成了entry鍊錶的首節點所指向的位址。當是第一次while迴圈的時候,首節點為null,也就是說將e.next指向null。之後再看,我們會知道e會變成新陣列entry鍊錶的尾結點,它的next節點應該指向null;當是大於第一次while迴圈的時候,首節點為當前e節點的前乙個節點。這句話有點繞,其實就是e和e.next的值進行了互換,或者說讓e指向了e.next,同時讓e.next指向了e。接著看第9行,我們將e賦值給newtable[i],或者說讓首節點指向了e,形成了首節點->e,e.next->原首節點。這個也就是註明的頭插法(1.8的時候已經棄用了),因為我們總是將新節點放在entry鍊錶的頭結點。第11號,就是將next賦值給e,作為下次迴圈的開始。

是不是覺得有點難度了,我們再接著看乙個。

do  while (pred.waitstatus > 0);
出自aqs的shouldparkafte***iledacquire。

你是否也有過這種迷茫

我的建議 標題中有迷茫兩個字。對,你沒看錯。熟悉我的人都知道我是乙個正能量的女孩兒 好吧,其實已經是 90後的老阿姨了 我寫了不少引導青少年 比我小的都是青少年 走出迷茫的文章。最典型的要數這篇 職業規劃 it方向 超詳細,超具體 也許你要問,難道大名鼎鼎 容我自誇一下 的杏子姐也會陷入迷茫嗎。人生...

你也被to date 函式欺騙了嗎?

我們可以用to date函式來構造自己想要的任何時間。當省略了hh,mi,ss時,oracle預設置為0,即 取整到日。當省略了dd時,oracle預設置為1,即 取整到月。當省略了mm時,oracle會取整到年嗎?我們都會慣性的認為 會。然,非也!oracle不會取整到年,他會取整到當前月!下面我...

你也被to date 函式欺騙了嗎?

我們可以用to date函式來構造自己想要的任何時間。當省略了hh,mi,ss時,oracle預設置為0,即 取整到日。當省略了dd時,oracle預設置為1,即 取整到月。當省略了mm時,oracle會取整到年嗎?我們都會慣性的認為 會。然,非也!oracle不會取整到年,他會取整到當前月!下面我...