day15_常用API(math類丶System類丶Object類丶Objects類丶Arrays類)

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類內部包含inouterr三個成員變量,分別代表標準輸入流 (鍵盤輸入),標準輸出流(顯示器)和標準錯誤輸出流(顯示器)

常用成員方法

  • native long currentTimeMillis()該方法的作用是返回當前的計算機時間,時間的表達格式爲當前計算機時間和GMT時間(格林威治時間)197011000秒所差的毫秒數。
  • 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、返回對象的字符串表 示形式、比較兩個對象。 在比較兩個對象的時候,Objectequals方法容易拋出空指針異常,而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]);
        }
    }

}

 

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