學了Java 你未必知道這些

    做爲一個正奔跑向編程完美天堂的朝聖者,本人以爲在日常的編程中,應該要作到如下幾點:算法

    一:汝應註釋,這樣作既方便別人,也方便本身去讀懂代碼的邏輯數據庫

    二:注重細節,爲本身寫的每行代碼負責,好比,在併發編程的過程當中,應該給那些可變的共享單元加「同步鎖」或把可變的共享變量的粒度降到每一個線程的級別編程

    三:注重效率,因爲本人的學校比較重視算法這一塊,因而不知不覺中就對程序執行效率這一塊比較執着,假如你和你的同事們都寫了一個相同功能的程序,而後老闆給大家                  各100萬條數據,你的同事的程序很快就把這100萬條數據執行完了,而後去喝了杯咖啡,回來時若是你的代碼還在跑,這不是......(後面的話大家都懂的)安全

    四:注重代碼的整潔性和盡力讓代碼的冗餘降到最低,這在代碼的重構上是要注意的地方。性能優化

  後續本人會寫一些本人讀到的比較好的算法例子,讀這些例子有利於咱們思惟活躍開來,固然,相信你也會像本人同樣爲這些算法解法的巧妙性而嘖嘖稱奇,以至使本身在之後的編程中更加註重這一塊,這些例子你們之後能夠查看這個網址 http://www.cnblogs.com/wanggangjia/來看看(後續會補上這些算法序列)
  好吧!前菜已了,正餐如今來了併發

      1.請你完善下列函數來實現這個功能:交換下面例子中A、B的值 函數

1 public class TestAdd {
2     public static void main(String[] args) {
3            int A = 100;
4            int B = 10;
5            .....   //在這裏寫下你的代碼,使A,B的值交換
6            System.out.println("A:" + A + "\t" + "B:" + B);  //輸出  A:10   B:100
7 }  
8 
9 }

    (1)大多數的咱們都會定義一個臨時變量temp,而後就以下面代碼同樣性能

int temp = A;
A = B;
B = temp;

    (2)又有人會說,定義一個變量多奢侈啊!看個人學習

A = A + B;
B = A - B;
A = A - B;

    (3)這確實比(1)解法好了一點,但咱們知道系統處理數據最快的是位操做,咱們能不能從這方面下手使咱們的程序更快呢?並且,把A+B賦值給A可能會產生越界,這不是不安全嗎?那怎麼辦才能兼顧安全、快速、簡潔呢?看碼以下(採用「異或」操做符):優化

A = A ^ B;
B = A ^ B;
A = A ^ B;

說明:異或運算是按照二進制位進行異或運算的,這個運算是最低級的CPU位運算,運行速度快,並且不會產生進位。

拓展:位操做符因爲它們具備運行速度快的特色(思考一下它們快的緣由),因此常常被使用,特別是「>>」或「<<」位運算符,這點讀者能夠看看jdk中有關hashcode這一塊的源碼

拓展例子:編程實現2 * 8,直接給碼以下:

2<<3;  //假設每一個變量的存儲是8位,則2的二進制是0000 0010,向左偏移3位後,可得0001 0000,轉換成十進制爲16,不就是2 * 8,數3是由於2的3次方爲8

  2.這條語句:float i = 3.3;能編譯經過嗎?

float i = 3.3;不能經過編譯,由於常數 3.3 Java默認是double類型,而float類型的範圍是比double小的,把3.3賦值給i 是向下轉型,會損失精度,若是真的須要賦值給i,需強制轉型float i = (float)3.3;

拓展:short i = 1,i = i + 1;這也是不能經過編譯的,由於Java默認常數1位int類型,理由同上,可是short i = 1,i += 1;倒是能夠的,這是由於jdk在編譯的時候,會隱式的將類型強制轉換成i = (short)(i + 1);

  3.Java中int類型和Integer類型有什麼區別?

 首先,int類型是Java的基本數據類型,而Integer是一個對象,是一個引用,它們在內存邏輯就不一樣,關於內存邏輯,能夠看看本人所寫的「一個大三學生的學習之悟」這篇文章,下面給出這兩個類型的內存結構,既然Integer是一個對象,那麼它相對於int這基本類型來講就有不少額外的方法,具體可自查Java的API,要特別說明的是:在jdk1.5引入了「自動拆箱和裝箱」,使得基本數據類型和其對應的封裝對象可以隱式的轉換。

綜合例子:涵蓋的知識點包括自動裝箱和拆箱、內存結構分析、自動裝箱和拆箱背後的相似「對象池」的思想

 1 public class BoxingTest {
 2     public static void main(String[] args) {
 3           Integer i = new Integer(300);
 4           Integer j = 300;  //自動裝箱,內部機制是調用Integer的valueOf(int)方法
 5           int z = 300;
 6           System.out.println(i == j);  //false  由於它們的內存地址不一樣
 7           System.out.println(z == j); //true  由於j自動拆箱,內部機制是調用Integer的intValue()方法,它們比較的都是數值300
 8     }
 9 
10 }

讀到這裏,若是你沒有一種去讀Integer的valueOf(int)方法的源碼的衝動,那麼你將失去挺多東西的,由於它裏面包含着Java在性能優化的一些蛛絲馬跡,算了,我仍是講講吧!若是你沒有去看這個方法的源碼,相信把下面這道題徹底作對的應該不太可能,先炫代碼:

 1 public class ValueOfTest {   //使用駝峯形式命名
 2 
 3       public static void main(String[] args) {
 4              Integer i = 50;
 5              Integer j = 50;
 6              Integer x = 200;
 7              Integer y = 200;
 8            
 9              System.out.println(i == j);  //true
10              System.out.println(x == y); //false
11        }
12 
13 }

分析以下:

1  public static Integer valueOf(int i) {   //注意這裏是靜態方法,隸屬於類,因此能夠直接使用 「Integer.方法名」 來調用該方法
2  
3          if (i >= IntegerCache.low && i <= IntegerCache.high)  //這裏的IntegerCache.low默認值爲-128   IntegerCache.high默認值爲127
4              return IntegerCache.cache[i + (-IntegerCache.low)];  //這些Integer對象,默認範圍在[-128~127],已經被建立,被放在常量池裏
5  
6          return new Integer(i);
7 
8     }

 

因爲Java的操做不外乎是建立對象---使用對象----銷燬(回收)對象,由於建立對象比較耗時間,損失了系統的性能,因此咱們通常都會在程序開始時對一些比較耗時但在咱們的程序又常用的對象先會初始化一些實例,對象池的對象是如此,線程池的線程是如此,數據庫鏈接池的Connection對象也是如此,供咱們在程序中調用,以達到對象的重用及快速引用,這是優化程序功能的一個方法。好吧!迴歸本題,範圍在[-128~127]的Integer對象已經被初始化在常量池裏了,因此在這區間的Integer對象建立時都會指向常量池中相對應的對象,這也是上面代碼中爲何第一個輸出爲true的緣由,在這個範圍以外的,它會本身建立一個Integer對象,因此根據內存邏輯可知它們並不相等,因此爲false

  其實,有空讀讀Java源代碼也是有好處的,在這裏,本人只是但願編程者們在日常的代碼編輯中,要時刻注重本身程序的安全性、代碼運行的效率性及項目的性能的優化等等

相關文章
相關標籤/搜索