I want to fly higher
          programming Explorer
          posts - 114,comments - 263,trackbacks - 0
          1.內(nèi)存分配
               1.寄存器-最快的存儲(chǔ)區(qū),位于處理器內(nèi)部,無法直接控制
               2.堆棧:位于RAM,隨機(jī)訪問存儲(chǔ)器中,可通過堆棧指針從處理器那里獲得直接支持;堆棧指針,向上移動(dòng),則分配內(nèi)存;向下移動(dòng), 則釋放內(nèi)存;不過創(chuàng)建程序時(shí),Java系統(tǒng)必須知道存儲(chǔ)在堆棧內(nèi)所有項(xiàng)的生命周期,以便上下移動(dòng)堆棧指針;這一約束,限制了程序的靈活性;
               Java對(duì)象引用存儲(chǔ)于堆棧中;而Java對(duì)象不存儲(chǔ)于其中
               3.:一種通用的內(nèi)存區(qū),也位于RAM區(qū),用于存放所有的Java對(duì)象;堆不同于堆棧的好處是:編譯器不需要知道存儲(chǔ)的數(shù)據(jù)在堆里存活多長(zhǎng)時(shí)間;因此在堆里存儲(chǔ)有很大的靈活性;當(dāng)需要一個(gè)對(duì)象時(shí),只需要new寫一行簡(jiǎn)單的代碼,當(dāng)執(zhí)行這行代碼時(shí),會(huì)自動(dòng)在堆里進(jìn)行存儲(chǔ)分配;
               用堆進(jìn)行存儲(chǔ)分配和清理可能比堆棧進(jìn)行存儲(chǔ)分配需要更多的時(shí)間;
               4.常量存儲(chǔ):常量值通常存儲(chǔ)在程序代碼內(nèi)部,這樣做是安全的,因?yàn)樗麄冇肋h(yuǎn)不會(huì)被改變;
               5.非RAM存儲(chǔ):  
                如流對(duì)象和持久化對(duì)象;在流對(duì)象中,對(duì)象轉(zhuǎn)換成字節(jié)流,通常被發(fā)送給另一臺(tái)機(jī)器;在“持久化”對(duì)象中,對(duì)象被存放于磁盤上;這種存儲(chǔ)方式的技巧在于把對(duì)象可以轉(zhuǎn)化為其他媒介上的事物,他們?nèi)钥梢员3肿约旱臓顟B(tài),在需要時(shí),可以恢復(fù)成常規(guī)的,基于RAM的對(duì)象;Java提供了對(duì)輕量級(jí)持久化的支持,而諸如JDBC和HIBERNATE這樣的機(jī)制提供了更加復(fù)雜的對(duì)在數(shù)據(jù)庫(kù)存儲(chǔ)和讀取對(duì)象信息的支持.

          2.基本類型是特例:
               小,簡(jiǎn)單;不用new來創(chuàng)建變量,而是創(chuàng)建一個(gè)并非引用的“自動(dòng)”變量,這個(gè)變量直接存儲(chǔ)值,并置于堆棧中,因此更加高效;
            因?yàn)閚ew將對(duì)象存儲(chǔ)在“堆”中,故用new創(chuàng)建一個(gè)對(duì)象,特別是小的簡(jiǎn)單的變量,往往不是很有效;

          3.所有數(shù)值類型都有正負(fù)號(hào)-每種基本類型所占存儲(chǔ)空間的大小都是不變的
           char:16bits
           byte:8bits
           short:16bits
           int:32bits
           long:64bits
           float:32bits
           double:64bits

          4.數(shù)組:當(dāng)創(chuàng)建一個(gè)數(shù)組對(duì)象時(shí),其實(shí)是創(chuàng)建了一個(gè)引用數(shù)組;并且每個(gè)引用會(huì)被自動(dòng)初始化為一個(gè)特定值,null
           對(duì)于用來存放基本類型的數(shù)組,編譯器也能確保這種數(shù)組的初始化,因?yàn)樗鼤?huì)將會(huì)這種數(shù)組所占的內(nèi)存全部置0

          5.二進(jìn)制碼補(bǔ)充學(xué)習(xí)
              2 二進(jìn)制 為10
               其實(shí)全部顯示為00000000000000000000000000000010,高位為0,表示為正

              -2 二進(jìn)制為11111111111111111111111111111110
               其計(jì)算方法為:
                    1.首先是找到正數(shù)2的二進(jìn)制形式00000000000000000000000000000010
                    2.按位取反->111111111111111111111111111111101
                    3.加1->11111111111111111111111111111110
            
              將11111111111111111111111111111110變?yōu)檎麛?shù)
                   1.首先判斷其為負(fù)數(shù),按位取反->0000000000000000000000000000001
                   2.加1->00000000000000000000000000000010
                   3.2步驟后,得結(jié)果為2,然后因?yàn)槭秦?fù)數(shù),所以加一個(gè)符號(hào),得-2

              所以補(bǔ)碼的設(shè)計(jì)目的是:

                  ⑴ 使符號(hào)位能與有效值部分一起參加運(yùn)算,從而簡(jiǎn)化運(yùn)算規(guī)則。補(bǔ)碼機(jī)器數(shù)中的符號(hào)位,并不是強(qiáng)加上去的,是數(shù)據(jù)本身的自然組成部分,可以正常地參與運(yùn)算。
                  ⑵ 使減法運(yùn)算轉(zhuǎn)換為加法運(yùn)算,進(jìn)一步簡(jiǎn)化計(jì)算機(jī)中運(yùn)算器的線路設(shè)計(jì)。
                  (3)為了統(tǒng)一正0和負(fù)0

              有符號(hào)數(shù):
                  最高位是符號(hào)位,0表示正,1表示負(fù)

                  反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
                  補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。

                  原碼表示雖然很簡(jiǎn)單,用原碼來進(jìn)行加減運(yùn)算會(huì)出問題,
                      問題出在帶符號(hào)位的負(fù)數(shù)上
                  反碼表示,將加減數(shù)都表示成反碼后,減法可以直接表示成加法
                      問題出在(+0)和(-0)上,在人們的計(jì)算概念中零是沒有正負(fù)之分的,于是就出現(xiàn)了補(bǔ)碼,正數(shù)的補(bǔ)碼不變,負(fù)數(shù)的補(bǔ)碼是將其反碼加1


                  原碼和反碼中,+0與-0的表示并不相同,所以計(jì)算機(jī)中一般使用補(bǔ)碼。還有利用高位溢出,將減法運(yùn)算變成加法運(yùn)算

                  模的概念:把一個(gè)計(jì)量單位稱之為模或模數(shù)。例如,時(shí)鐘是以12進(jìn)制進(jìn)行計(jì)數(shù)循環(huán)的,即以12為模。在時(shí)鐘上,時(shí)針加上(正撥)12的整數(shù)位或減去(反撥)12的整數(shù)位,時(shí)針的位置不變。14點(diǎn)鐘在舍去模12后,成為(下午)2點(diǎn)鐘(14=14-12=2)。從0點(diǎn)出發(fā)逆時(shí)針撥10格即減去10小時(shí),也可看成從0點(diǎn)出發(fā)順時(shí)針撥2格(加上2小時(shí)),即2點(diǎn)(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射為+2。由此可見,對(duì)于一個(gè)模數(shù)為12的循環(huán)系統(tǒng)來說,加2和減10的效果是一樣的;因此,在以12為模的系統(tǒng)中,凡是減10的運(yùn)算都可以用加2來代替,這就把減法問題轉(zhuǎn)化成加法問題了(注:計(jì)算機(jī)的硬件結(jié)構(gòu)中只有加法器,所以大部分的運(yùn)算都必須最終轉(zhuǎn)換為加法)。10和2對(duì)模12而言互為補(bǔ)數(shù)。
            
                  同理,計(jì)算機(jī)的運(yùn)算部件與寄存器都有一定字長(zhǎng)的限制(假設(shè)字長(zhǎng)為8),因此它的運(yùn)算也是一種模運(yùn)算。當(dāng)計(jì)數(shù)器計(jì)滿8位也就是256個(gè)數(shù)后會(huì)產(chǎn)生溢出,又從頭開始計(jì)數(shù)。產(chǎn)生溢出的量就是計(jì)數(shù)器的模,顯然,8位二進(jìn)制數(shù),它的模數(shù)為8=256。在計(jì)算中,兩個(gè)互補(bǔ)的數(shù)稱為“補(bǔ)碼”。

              a. 采用補(bǔ)碼后,可以方便地將減法運(yùn)算轉(zhuǎn)化成加法運(yùn)算,運(yùn)算過程得到簡(jiǎn)化。正數(shù)的補(bǔ)碼即是它所表示的數(shù)的真值,而負(fù)數(shù)的補(bǔ)碼的數(shù)值部份卻不是它所表示的數(shù)的真值。采用補(bǔ)碼進(jìn)行運(yùn)算,所得結(jié)果仍為補(bǔ)碼。   
              b. 與原碼、反碼不同,數(shù)值0的補(bǔ)碼只有一個(gè),即 [0]補(bǔ)=00000000B。   
              c. 若字長(zhǎng)為8位,則補(bǔ)碼所表示的范圍為-128~+127;進(jìn)行補(bǔ)碼運(yùn)算時(shí),應(yīng)注意所得結(jié)果不應(yīng)超過補(bǔ)碼所能表示數(shù)的范圍。

          6.部分源碼

          package com.book.chap2.operator;
          /**
           *
           *直接常量
           *<p>byte,short,int,long均有符號(hào)和無符號(hào)之分,如byte[-128-127]</p>
           *<p>Integer.toBinaryString</p>
           *
           *@author landon
           *@since JDK1.6
           *@version 1.0 2012-3-21
           *
           
          */

          public class Literals
          {
              
          public static void main(Stringargs)
              
          {
                  
          //0x-16進(jìn)制
                  int i1 = 0x2f;//f 小寫
                  
          //轉(zhuǎn)為2進(jìn)制
                  System.out.println("i1:" + Integer.toBinaryString(i1));
                  
          //轉(zhuǎn)為16進(jìn)制
                  System.out.println("i1:" + Integer.toHexString(i1));
                  
          //轉(zhuǎn)為8進(jìn)制
                  System.out.println("i1:" + Integer.toOctalString(i1));
                  System.out.println(i1);
                  
                  
          //0x-16進(jìn)制
                  int i2 = 0x2F;//F 大寫
                  System.out.println("i2:" + Integer.toBinaryString(i1));
                  System.out.println(i2);
                  
                  
          //0-8進(jìn)制
                  int i3 = 0177;
                  System.out.println("i3:" + Integer.toBinaryString(i3));
                  
                  
          //char能表示的16進(jìn)制的最大值,char,2個(gè)字節(jié),因?yàn)槭亲址?>0-2的16次方-1
                  char c = 0xffff;
                  System.out.println("c:" + Integer.toBinaryString(c));
                  
                  
          //byte的16進(jìn)制表示的最大值,因?yàn)閎yte1個(gè)字節(jié),-128-127
                  byte b = 0x7f;
                  System.out.println("b:" + Integer.toBinaryString(b));
                  
                  
          //short的16進(jìn)制表示的最大值
                  short s = 0x7fff;
                  System.out.println("s:" + Integer.toBinaryString(s));
                  
                  
          //long的后綴--小寫l容易和1混淆
                  long n1 = 200L;
                  
          long n2 = 200l;
                  
                  
          //float的后綴
                  float f1 = 1;
                  
          float f2 = 1f;
                  
          float f3 = 1F;
                  
                  
          //double的后綴
                  double d1 = 1;
                  
          double d2 = 1d;
                  
          double d3 = 1D;
                  
                  
          //TODO 此會(huì)編譯錯(cuò)誤,因?yàn)?.2默認(rèn)為double,應(yīng)該改為0.2f
          //        float f4 = 0.2;
                  float f5 = 0.2f;
                  
                  
          //TODO 試圖向一個(gè)變量賦值超過自身范圍的數(shù)值,編譯器會(huì)報(bào)錯(cuò)
                  
          //byte b2 = 128;Type mismatch: cannot convert from int to byte
                  byte b2 = 127;
                  
                  
          //TODO 輸出各數(shù)據(jù)類型的最大值/最小值
                  System.out.println("byte:" + Byte.MIN_VALUE + "-" + Byte.MAX_VALUE + 
                          
          " " + Integer.toHexString(Byte.MIN_VALUE) + "-" + Integer.toHexString(Byte.MAX_VALUE));
                  System.out.println("char:" + Character.MIN_VALUE + "-" + Character.MAX_VALUE + 
                          
          " " + Integer.toHexString(Character.MIN_VALUE) + "-" + Integer.toHexString(Character.MAX_VALUE));
                  System.out.println("short:" + Short.MIN_VALUE + "-" + Short.MAX_VALUE + 
                          
          " " + Integer.toHexString(Short.MIN_VALUE) + "-" + Integer.toHexString(Short.MAX_VALUE));
                  System.out.println("int:" + Integer.MIN_VALUE + "-" + Integer.MAX_VALUE + 
                          
          " " + Integer.toHexString(Integer.MAX_VALUE) + "-" + Integer.toHexString(Integer.MIN_VALUE));
                  System.out.println("long:" + Long.MIN_VALUE + "-" + Long.MAX_VALUE + 
                          
          " " + Long.toHexString(Long.MAX_VALUE) + "-" + Long.toHexString(Long.MIN_VALUE));
                  
                  
          //TODO 將float或者double轉(zhuǎn)為整型的時(shí)候,總會(huì)截尾
                  System.out.println((int)0.1);
                  System.out.println((int)0.9f);
                  
                  
          //TODO 如果需要舍入,則需Math.round
                  System.out.println(Math.round(0.9));
                  System.out.println(Math.round(0.4));
              }

          }


           

          package com.book.chap2.operator;

          //TODO 靜態(tài)導(dǎo)入,這樣就不必每次都敲System.out了
          import static java.lang.System.out;
          /**
           *
           *循環(huán)標(biāo)簽-標(biāo)簽是后面跟有冒號(hào)的標(biāo)識(shí)符
           *<p>
           *    1.java中,標(biāo)簽起作用的唯一地方是剛好在迭代語句之前:即在標(biāo)簽和迭代語句之間置入任何語句都不好
           * 2.在迭代之前設(shè)置標(biāo)簽的唯一理由是:我們希望在其中嵌套另一個(gè)迭代或者一個(gè)開關(guān)switch;break和continue只能中斷當(dāng)前循環(huán),與標(biāo)簽一起使用,則會(huì)中斷循環(huán),直到標(biāo)簽所在地方
           * 3.注意:在java中使用標(biāo)簽的理由就是因?yàn)橛星短椎拇嬖冢蚁霃亩鄬忧短字衎reak或者continue
           *</p>
           *
           *@author landon
           *@since JDK1.6
           *@version 1.0 2012-3-21
           *
           
          */

          public class LoopLabel
          {
              
          public static void main(Stringargs)
              
          {
                  
          int i = 0;
                  
          //label
                  OUTER:
                      
          while(true)
                      
          {
                          System.out.println("outter while loop");
                          
          while(true)
                          
          {
                              i++;
                              System.out.println("i = " + i);
                              
                              
          if(i == 1)
                              
          {
                                  out.println("continue");
                                  
          continue;
                              }

                              
                              
          //TODO 帶標(biāo)簽的continue回達(dá)到標(biāo)簽的位置,然后并重新進(jìn)入緊接在那個(gè)標(biāo)簽后面的循環(huán)
                              if(i == 3)
                              
          {
                                  out.println("continue outer");
                                  
          continue OUTER;
                              }

                              
                              
          if(i == 5)
                              
          {
                                  out.println("break");
                                  
          break;
                              }

                              
                              
          //TODO 帶標(biāo)簽的break會(huì)中斷并跳出標(biāo)簽所指的循環(huán)
                              if(i == 7)
                              
          {
                                  out.println("break outer");
                                  
          break OUTER;
                              }

                          }

                      }

              }

          }

           

          package com.book.chap2.operator;


          /**
           *
           *移位
           *<pre>
           *    1.左移<<,按照操作符右側(cè)指定的位數(shù)將操作符左側(cè)的操作數(shù)向左移動(dòng),低位補(bǔ)0
           *    2.“有符號(hào)”右移>>,按照操作符右側(cè)指定的位數(shù)將操作符左側(cè)的操作數(shù)向右移動(dòng);“有符號(hào)”操作符>>使用符號(hào)擴(kuò)展:若符號(hào)為正,則在高位插入0;若符號(hào)為負(fù),則在高位插入1
           * 3."無符號(hào)"右移,Java新增,它使用零擴(kuò)展,無論正負(fù),都在高位插入0
           *</pre>
           *
           *@author landon
           *@since JDK1.6
           *@version 1.0 2012-3-21
           *
           
          */

          public class ShiftBit
          {
              
          public static void main(Stringargs)
              
          {
                  
          int j = 2;
                  
                  
          //正-左移
                  System.out.println("before shift:"+ j + " " + Integer.toBinaryString(j));
                  
          int shitfJ1 = j << 5;
                  System.out.println("after shift:"+ shitfJ1 + " " + Integer.toBinaryString(shitfJ1));
                  
                  
          int k = -2;
                  
                  
          //負(fù)-左移
                  System.out.println("before shift:"+ k + " " + Integer.toBinaryString(k));
                  
          int shitfk1 = k << 5;
                  System.out.println("after shift:"+ shitfk1 + " " + Integer.toBinaryString(shitfk1));
                  
                  
          int i = 128;
                  
                  
          //正-右移
                  System.out.println("before shift:"+ i + " " + Integer.toBinaryString(i));
                  
          int shitfI1 = i >> 5;
                  System.out.println("after shift:"+ shitfI1 + " " + Integer.toBinaryString(shitfI1));
                  
                  
          //負(fù)-右移,符號(hào)為負(fù),右移的時(shí)候,高位插入1
                  int m = -128;
                  System.out.println("before shift:"+ m + " " + Integer.toBinaryString(m));
                  
          int shitfm1 = m >> 5;
                  System.out.println("after shift:"+ shitfm1 + " " + Integer.toBinaryString(shitfm1));
                  
                  
          int n = 128;
                  
                  
          //正-無符號(hào)右移,無論正負(fù),高位均插入0
                  System.out.println("before shift:"+ n + " " + Integer.toBinaryString(n));
                  
          int shitn1 = n >>> 5;
                  System.out.println(
          "after shift:"+ shitn1 + " " + Integer.toBinaryString(shitn1));
                  
                  
          //負(fù)-無符號(hào)右移,無論正負(fù),高位均插入0-->這樣一個(gè)負(fù)數(shù)就變成了正數(shù)
                  int o = -128;
                  System.out.println(
          "before shift:"+ o + " " + Integer.toBinaryString(o));
                  
          int shitfo1 = o >>> 5;
                  System.out.println(
          "after shift:"+ shitfo1 + " " + Integer.toBinaryString(shitfo1));
              }

          }

              

          posted on 2013-01-08 16:54 landon 閱讀(1256) 評(píng)論(0)  編輯  收藏 所屬分類: ProgramBook
          主站蜘蛛池模板: 鄱阳县| 望奎县| 冕宁县| 灌南县| 汕头市| 乐平市| 石景山区| 林芝县| 德惠市| 高台县| 安图县| 焦作市| 乌兰察布市| 扎兰屯市| 星座| 北碚区| 进贤县| 织金县| 霸州市| 娄底市| 陕西省| 遂川县| 定陶县| 永平县| 云阳县| 丰都县| 措勤县| 孟村| 澄迈县| 广州市| 凤阳县| 清流县| 东海县| 东台市| 陈巴尔虎旗| 井研县| 庆城县| 灵寿县| 武平县| 久治县| 钟祥市|