上一篇地址:持續總結中!2024年面試必問 100 道 Java基礎面試題(三十九)-CSDN博客
七十九、Java泛型中的T、R、K、V、E分別指什么?
在Java泛型中,T
、R
、K
、V
和 E
是類型參數的常見占位符,它們用來表示泛型類型中的類型變量。這些占位符通常用于泛型類、泛型接口或泛型方法的定義中,它們分別代表不同的類型,但在泛型的上下文中,它們是等價的,可以互換使用。以下是每個占位符的常見用法:
-
T
(Type):T
?是最常用的泛型類型參數占位符,代表任意類型。它通常用于表示泛型類或方法中的類型,可以是任何類或接口。
public class GenericClass<T> {private T value;public GenericClass(T value) {this.value = value;}public T getValue() {return value;} }
-
R
(Return Type):R
?通常用于泛型方法的返回類型。它代表方法返回值的類型,這個類型可以由方法的泛型參數決定。
public class UtilityClass {public static <R> R convertType(Object obj, Class<R> clazz) {// 轉換obj到Class<R>指定的類型return null;} }
-
K
和V
:K
?和?V
?常用于表示鍵(Key)和值(Value)的類型,特別是在定義關聯數組或映射(如?Map
)時。
public class Pair<K, V> {private final K key;private final V value;public Pair(K key, V value) {this.key = key;this.value = value;}// getters and other methods }
-
E
(Element):E
?通常用于表示元素類型,比如在定義一個可以存儲任意類型元素的集合類時。
public class ElementList<E> {private List<E> elements;public void addElement(E element) {elements.add(element);}// 其他方法 }
這些泛型類型參數占位符的使用約定并非強制性的,它們只是常見的用法,目的是為了讓代碼更具可讀性。開發者也可以使用其他任何有效的標識符作為泛型類型參數的名稱,例如MyType
、InputType
、OutputType
等。
示例代碼
public class Example<T, V> {private T id;private V name;public Example(T id, V name) {this.id = id;this.name = name;}public static <K, V> Map<K, V> createMap(K key, V value) {Map<K, V> map = new HashMap<>();map.put(key, value);return map;}public static void main(String[] args) {Example<Integer, String> example = new Example<>(1, "Example");Map<String, Integer> map = createMap("one", 1);}
}
在這個示例中,Example
類使用了 T
和 V
作為泛型類型參數,而 createMap
靜態方法使用了 K
和 V
來創建一個 Map
對象。
總結來說,泛型類型參數的名稱可以根據上下文和開發者的偏好來選擇,關鍵是保持代碼的清晰和一致性。
八十、Java金額計算怎么避免精度丟失?
在Java中進行金額計算時避免精度丟失是一個重要的考慮因素,因為錯誤的結果可能會導致財務錯誤或不準確的報告。以下是一些避免精度丟失的方法:
使用合適的數據類型
-
BigDecimal
:BigDecimal
?類是Java提供的一個用于進行精確小數運算的類,它允許進行多精度的定點數運算,非常適合用于金額計算。
-
double
和float
:double
?和?float
?類型是基于IEEE 754標準的浮點數,它們在表示非常大或非常小的數值時可能會有精度問題,因此不推薦用于精確的金額計算。
使用?BigDecimal
?的最佳實踐
-
避免使用構造器:
- 不推薦使用?
BigDecimal
?的構造器(如?BigDecimal(double)
)從?double
?或?float
?類型創建?BigDecimal
?實例,因為這可能會引入初始的精度問題。
- 不推薦使用?
-
使用字符串構造器:
- 使用?
BigDecimal(String)
?構造器從字符串創建?BigDecimal
?對象,這樣可以確保數值的精確表示。
- 使用?
-
鏈式操作:
- 使用?
BigDecimal
?的鏈式方法調用,如?add()
、subtract()
、multiply()
?和?divide()
?等,來進行運算。
- 使用?
-
設置小數點后的位數:
- 在進行除法運算時,可以使用?
setScale()
?方法設置小數點后的位數和舍入模式。
- 在進行除法運算時,可以使用?
示例代碼
import java.math.BigDecimal;
import java.math.RoundingMode;public class MonetaryCalculation {public static void main(String[] args) {// 使用字符串構造BigDecimal對象BigDecimal amount1 = new BigDecimal("100.5");BigDecimal amount2 = new BigDecimal("2.5");// 進行加法和減法運算BigDecimal sum = amount1.add(amount2);BigDecimal difference = amount1.subtract(amount2);// 進行乘法和除法運算,并設置結果的小數點后位數BigDecimal product = amount1.multiply(amount2);BigDecimal quotient = amount1.divide(amount2, 2, RoundingMode.HALF_UP);System.out.println("Sum: " + sum);System.out.println("Difference: " + difference);System.out.println("Product: " + product);System.out.println("Quotient: " + quotient);}
}
在這個示例中,我們使用 BigDecimal
類進行了金額的加法、減法、乘法和除法運算。注意,我們使用字符串構造器創建 BigDecimal
對象,并在除法運算后設置了小數點后的位數和舍入模式。
注意事項
- 避免類型轉換:在進行金額計算時,避免將?
BigDecimal
?轉換為?double
?或?float
?類型。 - 舍入模式:在設置小數點位數時,選擇合適的舍入模式非常重要,如?
RoundingMode.HALF_UP
?是最常用的模式之一。 - 維護精度:在設計財務系統時,始終保持足夠的精度以避免舍入誤差的累積。
總結來說,為了避免Java中的金額計算精度丟失,推薦使用 BigDecimal
類,并遵循最佳實踐,如使用字符串構造器創建對象,鏈式調用運算方法,并在需要時設置小數點后的位數和舍入模式。