math類
- java.lang.Math提供了一系列靜態方法用於科學計算。其封裝了很多與數學有關的屬性和方法。
Math中方法的調用方式
- Math類中無構造方法,但內部的方法都是靜態的,則可以通過:類名.進行調用
Math類的常用方法
代碼舉例:
package demo04;
/*
java.util.Math類是數學相關的工具類,裏面提供了大量的靜態方法,完成與數學運算相關的操作。
public static double abs(double num):獲取絕對值。有多種重載。
public static double ceil(double num):向上取整。
public static double floor(double num):向下取整。
public static long round(double num):四捨五入。
Math.PI代表近似的圓周率常量(double)。
*/
public class Demo03Math {
public static void main(String[] args) {
// 獲取絕對值
System.out.println(Math.abs(3.14)); // 3.14
System.out.println(Math.abs(0)); // 0
System.out.println(Math.abs(-2.5)); // 2.5
System.out.println("================");
// 向上取整
System.out.println(Math.ceil(3.9)); // 4.0
System.out.println(Math.ceil(3.1)); // 4.0
System.out.println(Math.ceil(3.0)); // 3.0
System.out.println("================");
// 向下取整,抹零
System.out.println(Math.floor(30.1)); // 30.0
System.out.println(Math.floor(30.9)); // 30.0
System.out.println(Math.floor(31.0)); // 31.0
System.out.println("================");
System.out.println(Math.round(20.4)); // 20
System.out.println(Math.round(10.5)); // 11
}
}
需求:
計算在-10.8到5.9之間,絕對值大於6或者小於2.1的整數有多少個?
package demo04;
/*
題目:
計算在-10.8到5.9之間,絕對值大於6或者小於2.1的整數有多少個?
分析:
1. 既然已經確定了範圍,for循環
2. 起點位置-10.8應該轉換成爲-10,兩種辦法:
2.1 可以使用Math.ceil方法,向上(向正方向)取整
2.2 強轉成爲int,自動捨棄所有小數位
3. 每一個數字都是整數,所以步進表達式應該是num++,這樣每次都是+1的。
4. 如何拿到絕對值:Math.abs方法。
5. 一旦發現了一個數字,需要讓計數器++進行統計。
備註:如果使用Math.ceil方法,-10.8可以變成-10.0。注意double也是可以進行++的。
*/
public class Demo04MathPractise {
public static void main(String[] args) {
int count = 0; // 符合要求的數量
double min = -10.8;
double max = 5.9;
// 這樣處理,變量i就是區間之內所有的整數
for (int i = (int) min; i < max; i++) {
int abs = Math.abs(i); // 絕對值
if (abs > 6 || abs < 2.1) {
System.out.println(i);
count++;
}
}
System.out.println("總共有:" + count); // 總共有:9
}
}
System類
System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。 該類位於java.lang包。 由於該類的構造器是private的,所以無法創建該類的對象,也就是無法實例化該類。其內部的成員變量和成員方法都是static的,所以也可以很方便的進行調用。
成員變量
- System類內部包含in、out和err三個成員變量,分別代表標準輸入流 (鍵盤輸入),標準輸出流(顯示器)和標準錯誤輸出流(顯示器)。
常用成員方法
- native long currentTimeMillis(): 該方法的作用是返回當前的計算機時間,時間的表達格式爲當前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數。
- void exit(int status): 該方法的作用是退出程序。其中status的值爲0代表正常退出,非零代表異常退出。使用該方法可以在圖形界面編程中實現程序的退出功能等。
- void gc(): 該方法的作用是請求系統進行垃圾回收。至於系統是否立刻回收,則取決於系統中垃圾回收算法的實現以及系統執行時的情況。
- String getProperty(String key): 該方法的作用是獲得系統中屬性名爲key的屬性對應的值。
代碼舉例
import java.util.Arrays;
/*
java.lang.System類中提供了大量的靜態方法,可以獲取與系統相關的信息或系統級操作,在System類的API文檔中,常用的方法有:
public static long currentTimeMillis():返回以毫秒爲單位的當前時間。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):將數組中指定的數據拷貝到另一個數組中。
*/
public class Demo01System {
public static void main(String[] args) {
demo02();
StringBuilder sb = new StringBuilder();
}
/*
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):將數組中指定的數據拷貝到另一個數組中。
參數:
src - 源數組。
srcPos - 源數組中的起始位置(起始索引)。
dest - 目標數組。
destPos - 目標數據中的起始位置。
length - 要複製的數組元素的數量。
練習:
將src數組中前3個元素,複製到dest數組的前3個位置上
複製元素前:
src數組元素[1,2,3,4,5],dest數組元素[6,7,8,9,10]
複製元素後:
src數組元素[1,2,3,4,5],dest數組元素[1,2,3,9,10]
*/
private static void demo02() {
//定義源數組
int[] src = {1,2,3,4,5};
//定義目標數組
int[] dest = {6,7,8,9,10};
System.out.println("複製前:"+ Arrays.toString(dest));
//使用System類中的arraycopy把源數組的前3個元素複製到目標數組的前3個位置上
System.arraycopy(src,0,dest,0,3);
System.out.println("複製後:"+ Arrays.toString(dest));
}
/*
public static long currentTimeMillis():返回以毫秒爲單位的當前時間。
用來程序的效率
驗證for循環打印數字1-9999所需要使用的時間(毫秒)
*/
private static void demo01() {
//程序執行前,獲取一次毫秒值
long s = System.currentTimeMillis();
//執行for循環
for (int i = 1; i <=9999 ; i++) {
System.out.println(i);
}
//程序執行後,獲取一次毫秒值
long e = System.currentTimeMillis();
System.out.println("程序共耗時:"+(e-s)+"毫秒");//程序共耗時:106毫秒
}
}
Object類
java.lang.Object類是類層次結構的根(父)類。每個類(Person,Student...)都使用 Object 作爲超(父)類。所有對象(包括數組)都實現這個類的方法。
public class MyClass /*extends Object*/ { // ... }
根據JDK源代碼及Object類的API文檔,Object類當中包含的方法有11個。
其中的常用的方法有:
toString方法:public String toString()
- 詳解:toString方法返回該對象的字符串表示,其實該字符串內容就是對象的類型+@+內存地址值由於toString方法返回的結果是內存地址,而在開發中,經常需要按照對象的屬性得到相應的字符串表現形式,因此也需要重寫它。在我們直接使用輸出語句輸出對象名的時候,其實通過該對象調用了其toString()方法。
覆蓋重寫 :如果不希望使用toString方法的默認行爲,則可以對它進行覆蓋重寫。在IntelliJ IDEA中,可以點擊 Code 菜單中的 Generate... ,也可以使用快捷鍵 alt+insert ,點擊 toString() 選 項。選擇需要包含的成員變量並確定。舉例:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
// 省略構造器與Getter Setter
}
equals方法 :public boolean equals(Object obj) :指示其他某個對象是否與此對象“相等”。 調用成員方法equals並指定參數爲另一個對象,則可以判斷這兩個對象是否是相同的。這裏的“相同”有默認和自定義兩種方式。
默認地址比較
- 如果沒有覆蓋重寫equals方法,那麼Object類中默認進行 == 運算符的對象地址比較,只要不是同一個對象,結果必然爲false。
對象內容比較
- 如果希望進行對象的內容比較,即所有或指定的部分成員變量相同就判定兩個對象相同,則可以覆蓋重寫equals方法。
重寫equals方法的場景:
- 不希望比較對象的地址值,想要結合對象屬性進行比較的時候。
大多數IDE都可以自動生成equals方法的代碼內容。在IntelliJ IDEA中,可以使用 Code 菜單中的 Generate… 選項,也可以使用快捷鍵 alt+insert ,並選擇 equals() and hashCode() 進行自動代碼生成。舉例:
import java.util.Objects;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// 如果對象地址一樣,則認爲相同
if (this == o) return true;
// 如果參數爲空,或者類型信息不一樣,則認爲不同
if (o == null || getClass() != o.getClass()) return false;
// 轉換爲當前類型
Person person = (Person) o;
// 要求基本類型相等,並且將引用類型交給java.util.Objects類的equals靜態方法取用結果
return age == person.age && Objects.equals(name, person.name);
}
}
這段代碼充分考慮了對象爲空、類型一致等問題,但方法內容並不唯一。
Objects類
在JDK7添加了一個Objects工具類,它提供了一些方法來操作對象,它由一些靜態的實用方法組成,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),用於計算對象的hashcode、返回對象的字符串表 示形式、比較兩個對象。 在比較兩個對象的時候,Object的equals方法容易拋出空指針異常,而Objects類中的equals方法就優化了這個問題。常用方法如下:
- public static boolean equals(Object a, Object b) :判斷兩個對象是否相等。
我們可以查看一下源碼,學習一下:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
代碼舉例
package demo01.Object;
import java.util.Objects;
public class Demo03Objects {
public static void main(String[] args) {
String s1 = null;
String s2 = "abc";
//boolean b = s1.equals(s2); // NullPointerException null是不能調用方法的,會拋出空指針異常
//System.out.println(b);
boolean b2 = Objects.equals(s1, s2);
System.out.println(b2);//false
}
}
Arrays類
java.util.Arrays類即爲操作數組的工具類,包含了用來操作數組(比如排序和搜索)的各種方法。
工具類設計思想
- 構造方法用 private 修飾
- 成員用 public static 修飾
常用方法
代碼舉例:
import java.util.Arrays;
/*
題目:
請使用Arrays相關的API,將一個隨機字符串中的所有字符升序排列,並倒序打印。
*/
public class Demo02ArraysPractise {
public static void main(String[] args) {
String str = "asv76agfqwdfvasdfvjh";
// 如何進行升序排列:sort
// 必須是一個數組,才能用Arrays.sort方法
// String --> 數組,用toCharArray
char[] chars = str.toCharArray();
Arrays.sort(chars); // 對字符數組進行升序排列
// 需要倒序遍歷
for (int i = chars.length - 1; i >= 0; i--) {
System.out.println(chars[i]);
}
}
}