JAVA2核心技術第1卷 筆記 01

  

關鍵字strictfp

自Java2以來,Java語言增加了一個關鍵字strictfp,雖然這個關鍵字在大多數場合比較少用,但是還是有必要了解一下。

strictfp的意思是FP-strict,也就是說精確浮點的意思。在Java虛擬機進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運行環境在對浮點運算的表達式是採取一種近似於我行我素的行爲來完成這些操作,以致於得到的結果往往無法令你滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那麼所聲明的範圍內Java的編譯器以及運行環境會完全依照浮點規範IEEE-754來執行。因此如果你想讓你的浮點運算更加精確,而且不會因爲不同的硬件平臺所執行的結果不一致的話,那就請用關鍵字strictfp。

你可以將一個類、接口以及方法聲明爲strictfp,但是不允許對接口中的方法以及構造函數聲明strictfp關鍵字,例如下面的代碼:

1. 合法的使用關鍵字strictfp

strictfp interface A {}

public strictfp class FpDemo1 {
    strictfp void f() {}
}

2. 錯誤的使用方法

interface A {
    strictfp void f();
}

public class FpDemo2 {
    strictfp FpDemo2() {}
}

一旦使用了關鍵字strictfp來聲明某個類、接口或者方法時,那麼在這個關鍵字所聲明的範圍內所有浮點運算都是精確的,符合IEEE-754規範的。例如一個類被聲明爲strictfp,那麼該類中所有的方法都是strictfp的

 

--------------------------------------------------------------------------------


const,goto

正確識別java語言的關鍵字(keyword)和保留字(reserved word)是十分重要的。Java的關鍵字對java的編譯器有特殊的意義,他們用來表示一種數據類型,或者表示程序的結構等。保留字是爲java預留的關鍵字,他們雖然現在沒有作爲關鍵字,但在以後的升級版本中有可能作爲關鍵字。

  關鍵字列表

  abstract boolean break byte case
  catch char class continue default
  do double else extends false
  final finally float for if
  implements import instanceof int interface
  long native new null package
  private protected public return short
  static super switch synchronized this
  throw throws transient true try
  void volatile while
  
  保留字
  const,goto

  注意點

  識別java語言的關鍵字,不要和其他語言如c/c++的關鍵字混淆。

  const和goto是java的保留字。
  所有的關鍵字都是小寫
  friendly,sizeof不是java的關鍵字

 


--------------------------------------------------------------------------------


關於檢測一個數是否爲NaN。不是使用

if (x == Double.NaN)

而是

if (Double.isNaN(x))

 

 


--------------------------------------------------------------------------------


StrictMath

在Java 2的1.3版本中增加了StrictMath類。這個類定義一個與Math中的數學方法類似的一套完整的數學方法。兩者的區別在於StrictMath中的方法對所有Java工具保證產生精確一致的結果,而Math中的方法更大程度上是爲了提高性能。

在Math類裏面的函數利用計算機浮點單元的例程來達到最快的性能。如果得到完全的可預測的結果,比最快的性能更重要的話,應該使用StrictMath方法。它從“自由分佈數學庫”(fdlibm)實現其運算法則,這樣保證了在所有平臺上都可以得到相同的結果。

 

 

--------------------------------------------------------------------------------

 

移位操作符:

無符號右移位操作符“>>>”在將bit串右移位時,從bit串的最左邊填充0,這 和帶符號右移位操作符“>>”不同。“>>”在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就是說,bit串 原來最左邊的位是符號位,如果爲1,則在帶符號右移時最左邊始終填充1;如果爲0,則在帶符號右移時最左邊始終填充0。
)?2{$r l ~)s `(T I3  移位操作符的例子見下表。

操作 結果 說明


00110010 << 2 11001000 右邊始終填充0

結果一樣
00110010 >> 2 00001100
00110010 >>> 2 00001100


結果不同
10110010 >> 2 11101100
10110010 >>> 2 00101100

 

 

 

--------------------------------------------------------------------------------


概念上講,Java字符串就是Unicode字符序列。例如,字符串"Java/u2122"由5個Unicode字符J,a,v,a和™組成。Java沒有內建的string類型。但是,標準Java庫提供了一個類,很自然的,叫做String。每個被引起來的字符串就是一個String實例:

Java字符串是以char值序列的方式實現的。如我們在41頁中提到的,char數據類型是一個表示UTF-16編碼中各個Unicode代碼點的代碼單元。最常用的Unicode字符可以用一個單獨的代碼單元表示。增補字符需要一對代碼單元。


length方法返回指定的UTF-16編碼字符串所需代碼單元的數量,例如:

String greeting = "Hello";

int n = greeting.length(); // is 5.

 

要得到真實的長度,即代碼點的數量,調用:

int cpCount = greeting.codePointCount(0, greeting.length());


 
s.charAt(n) 返回位置n對應的代碼單元,這裏n介於0和s.length()-1之間。例如:

char first = greeting.charAt(0); // first is 'H'

char last = greeting.charAt(4); // last is 'o'

 

要獲得第i個代碼點,使用語句:

int index = greeting.offsetByCodePoints(0, i);

int cp = greeting.codePointAt(index);


在UTF-16編碼中,增補字符需要兩個代碼單元,調用

char ch = sentence.charAt(i)  時如果碰到增補字符
並不返回一個空格,而是其第二個代碼單元。要避免這個問題,你不應當使用char類型。這個類型太低級。

如果你的代碼遍歷一個字符串,並且你想逐個查看每個代碼單元,請使用下面的語句:

int cp = sentence.codePointAt(i);

if (Character.isSupplementaryCodePoint(cp)) i += 2;

else i++;

幸運的是,codePointAt方法可以告訴我們何處是一個輔助字符的前一半或者後一半,並且對於任一一種都可以返回正確的結果。也就是說,你也可以用下面的語句進行回退操作

i--;

int cp = sentence.codePointAt(i);

if (Character.isSupplementaryCodePoint(cp)) i--;

 

offsetByCodePoints(int index, int codePointOffset)
          返回此 String 中從給定的 index 處偏移 codePointOffset 個代碼點的索引。

codePointAt(int index)
          返回指定索引處的字符(Unicode 代碼點)。


codePointCount(int beginIndex, int endIndex)
          返回此 String 的指定文本範圍中的 Unicode 代碼點數。

offsetByCodePoints(int index, int codePointOffset)
          返回此 String 中從給定的 index 處偏移 codePointOffset 個代碼點的索引。


isSupplementaryCodePoint(int codePoint)
          確定指定字符(Unicode 代碼點)是否在增補字符範圍內。

 

 

--------------------------------------------------------------------------------


 

 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章