Java經典用法總結(二)_java

來源:互聯網
上載者:User

接著上一篇再為大家介紹java應用和輸入輸出常用方法,供大家參考,具體內容如下

一、應用

1、使用StringBuilder或StringBuffer

// join(["a", "b", "c"]) -> "a and b and c"String join(List<String> strs) { StringBuilder sb = new StringBuilder(); boolean first = true; for (String s : strs) { if (first) first = false; else sb.append(" and "); sb.append(s); } return sb.toString();}
  • 不要像這樣使用重複的字串串連:s += item ,因為它的時間效率是O(n^2)。
  • 使用StringBuilder或者StringBuffer時,可以使用append()方法添加文本和使用toString()方法去擷取串連起來的整個文本。
  • 優先使用StringBuilder,因為它更快。StringBuffer的所有方法都是同步的,而你通常不需要同步的方法。

2、產生一個範圍內的隨機整數 

Random rand = new Random(); // Between 1 and 6, inclusiveint diceRoll() { return rand.nextInt(6) + 1;}
  • 總是使用Java API方法去產生一個整數範圍內的隨機數。
  • 不要試圖去使用 Math.abs(rand.nextInt()) % n 這些不確定的用法,因為它的結果是有偏差的。此外,它的結果值有可能是負數,比如當rand.nextInt() == Integer.MIN_VALUE時就會如此。

3、使用Iterator.remove()

void filter(List<String> list) { for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) { String item = iter.next(); if (...)  iter.remove(); }}

remove()方法作用在next()方法最近返回的條目上。每個條目只能使用一次remove()方法。

4、返轉字串

String reverse(String s) { return new StringBuilder(s).reverse().toString();}

這個方法可能應該加入Java標準庫。

5、啟動一條線程
下面的三個例子使用了不同的方式完成了同樣的事情。

實現Runnnable的方式: 

void startAThread0() { new Thread(new MyRunnable()).start();} class MyRunnable implements Runnable { public void run() { ... }}

繼承Thread的方式: 

void startAThread1() { new MyThread().start();} class MyThread extends Thread { public void run() { ... }}

匿名繼承Thread的方式:

void startAThread2() { new Thread() { public void run() {  ... } }.start();}

不要直接調用run()方法。總是調用Thread.start()方法,這個方法會建立一條新的線程並使建立的線程調用run()。

6、使用try-finally
I/O流例子:

void writeStuff() throws IOException { OutputStream out = new FileOutputStream(...); try { out.write(...); } finally { out.close(); }}

鎖例子:

void doWithLock(Lock lock) { lock.acquire(); try { ... } finally { lock.release(); }}
  • 如果try之前的語句運行失敗並且拋出異常,那麼finally語句塊就不會執行。但無論怎樣,在這個例子裡不用擔心資源的釋放。
  • 如果try語句塊裡面的語句拋出異常,那麼程式的運行就會跳到finally語句塊裡執行儘可能多的語句,然後跳出這個方法(除非這個方法還有另一個外圍的finally語句塊)。

二、輸入/輸出

1、從輸入資料流裡讀取位元組資料

InputStream in = (...);try { while (true) { int b = in.read(); if (b == -1)  break; (... process b ...) }} finally { in.close();}

read()方法要麼返回下一次從流裡讀取的位元組數(0到255,包括0和255),要麼在達到流的末端時返回-1。

2、從輸入資料流裡讀取塊資料 

InputStream in = (...);try { byte[] buf = new byte[100]; while (true) { int n = in.read(buf); if (n == -1)  break; (... process buf with offset=0 and length=n ...) }} finally { in.close();}

要記住的是,read()方法不一定會填滿整個buf,所以你必須在處理邏輯中考慮返回的長度。

3、從檔案裡讀取文本

BufferedReader in = new BufferedReader( new InputStreamReader(new FileInputStream(...), "UTF-8"));try { while (true) { String line = in.readLine(); if (line == null)  break; (... process line ...) }} finally { in.close();}
  • BufferedReader對象的建立顯得很冗長。這是因為Java把位元組和字元當成兩個不同的概念來看待(這與C語言不同)。
  • 你可以使用任何類型的InputStream來代替FileInputStream,比如socket。
  • 當達到流的末端時,BufferedReader.readLine()會返回null。
  • 要一次讀取一個字元,使用Reader.read()方法。
  • 你可以使用其他的字元編碼而不使用UTF-8,但最好不要這樣做。

4、向檔案裡寫文本 

PrintWriter out = new PrintWriter( new OutputStreamWriter(new FileOutputStream(...), "UTF-8"));try { out.print("Hello "); out.print(42); out.println(" world!");} finally { out.close();}
  • Printwriter對象的建立顯得很冗長。這是因為Java把位元組和字元當成兩個不同的概念來看待(這與C語言不同)。
  • 就像System.out,你可以使用print()和println()列印多種類型的值。
  • 你可以使用其他的字元編碼而不使用UTF-8,但最好不要這樣做。

以上就是本文的全部內容,希望對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.