1. 程式人生 > 實用技巧 >java自學第5期——Object、Date、Calender、System、StringBuilder、基本型別包裝類

java自學第5期——Object、Date、Calender、System、StringBuilder、基本型別包裝類

一、Object類


  • 作用:物件操作
  • 位置:java.lang.Object
  • 方法:
    public String toString() :返回物件的字串表示形式。
    public boolean equals(Object obj): 指示是否有其他物件“等於”這一個。
  • 注意:Object類裡的toString方法
    Object類是所有類的終極父類。
    person類預設繼承了Object類,所以可以使用Objcct類裡的方法,返回該物件的字串表示。通常,toString 方法會返回一個“以文字方式表示”此物件的字串。
    結果應是一個簡明但易於讀懂的資訊表示式。建議所有子類都重寫此方法。
    Object 類的 toString 方法返回一個字串,
    該字串由類名(物件是該類的一個例項)、at 標記符“@”和此物件雜湊碼的無符號十六進位制表示組成。
    換句話說,該方法返回一個字串,它的值等於:
    getClass().getName() + '@' + Integer.toHexString(hashCode())

    列印地址值沒有意義,所以要重寫toString方法,列印物件屬性
  • equals方法原始碼:
public boolean equals(Object obj){
    return(this == obj);
}
//this指呼叫equals方法的那個物件

  • == : 對於基本資料型別,比較的是數值;對於引用資料型別,比較的是地址值。
    比較地址值無意義,所以要重寫equals方法,比較兩個物件的屬性。
  • 程式碼示範:
public class Demo02Equals {
    private String name;
    private int age;

    public static void main(String[] args) {
        Demo03Class obj1 = new Demo03Class();
        Demo03Class obj2 = new Demo03Class();
        //列印obj1地址值
        System.out.println(obj1);
        //列印obj2地址值
        System.out.println(obj2);
        //列印二者地址值對比結果,false
        System.out.println(obj1.equals(obj2));
        //將obj2地址值賦給obj1
        obj1 = obj2;
        //列印true
        System.out.println(obj1.equals(obj2));
    }

//    @Override
//    public boolean equals(Object obj) {
//        //將equals原始碼中Object型別的obj向下轉型為子類Demo03Class
//        //目的是為了呼叫子類Demo03Class裡的方法。
//        Demo03Class p = (Demo03Class) obj;
//        //比較兩個物件的屬性,this(Demo03Class-p)和obj(Demo03Class-)
//        boolean a = this.name.equals(p.name) && this.age == p.age;
//        return a;
//    }
}

二、Date類


  • 作用:表示時間和日期的類
  • 位置:java.util.Date
  • 注意:
    類Date表示特定的瞬間,精確到毫秒(千分之一秒)。
    毫秒值的作用:可以對時間和日期進行計算:
    1、 獲取當前計算機系統時間到英國格林威治時間【1970年1月1日00:00:00】經歷了多少毫秒——System.currentTimeMillis方法
    2、一天 24h = 86400*1000 ms
    3、將毫秒的差值轉換為日期

注意:中國為東八區,時間加8個小時,中國此時為1月1日08:00:00.

  • 方法:
    public Date(): 空參構造方法,獲得當前系統時間
    public Date(long date):實參構造方法,傳遞毫秒值,把毫秒值轉換為日期
    public long getTime()
    :成員方法,返回原點時間到目前系統時間的毫秒差值,相當於之前的System.currentTimeMillis()方法。
public static void main(String[] args) {
        //獲取當前計算機系統時間到【1970年1月1日00:00:00】經歷了多少毫秒
        System.out.println(System.currentTimeMillis());
    }
public static void main(String[] args) {
        method1();
    }

        private static void method1() {
            Date date1 = new Date();//導包後建立Date類的物件(Date()空參構造方法)
            System.out.println(date1);//獲得當前系統時間Sat Aug 24 17:43:27 CST 2019
            //(CST指中國的標準時間)

            Date date2 = new Date(0L);
            System.out.println(date2);//Thu Jan 01 08:00:00 CST 1970 原點時間
            Date date3 = new Date(1566041013344L);
            System.out.println(date3);//原點時間加毫秒差值 得出現在時間

            Date date4 = new Date();
            long time = date4.getTime();//使用成員方法
            System.out.println(time);//返回原點時間到目前系統時間的毫秒差值

        }
  • DateFormat是一個[抽象類]的子類格式的日期/時間格式化和解析日期或獨立於語言的方式時間。
    日期時間格式的子類,如 SimpleDateFormat,允許的格式(例如,日期→文字),分析(文字→日期),和標準化。
    日期表示為 Date物件或自1970年1月1日00:00:00 GMT毫秒,
    DateFormat提供的分類方法很多,用於獲取預設日期/時間基於預設或指定的場所和一系列的格式樣式格式化。
    抽象類無法直接建立物件,我們使用它的子類SimpleDateFormat.

  • 構造方法:
    SimpleDateFormat(String pattern):用給定的模式和預設語言環境的日期格式符號構造:
    引數String pattern: 傳遞指定的格式,詳細見api文件
    區分大小寫:
    y:年 M:月 d:日 H:時 m:分 s:秒
    例如:"yyyy-MM-dd HH:mm:ss"
    注意模式中的字母不可改變,但是連線符號可以更改。例如:
    "yyyy年MM月dd日 HH時mm分ss秒"

  • 成員方法:
    String format(Date date): 按照指定的格式,將Data日期格式化為符合模式的字串。
    Date parse(String source): 把符合模式的字串解析為Date日期

  • parse方法聲明瞭一個異常ParseException,當要轉換的字串格式與構造方法規定的不同時便會報此異常
    兩種解決方法:throws繼續丟擲這個異常:滑鼠移動至異常處,按Alt+Enter宣告該異常,交給虛擬機器處理。
    或者try catch自己處理

public static void main(String[] args) throws ParseException {
        method2();
    }

    /*
    建立SimpleDateFormat物件,構造方法中傳遞指定的模式。
    呼叫SimpleDataFormat物件中的方法format(),把Date日期格式化為符合模式的字串(文字)。
     */
    private static void method2() throws ParseException {
        //建立SimpleDateFormat類的物件
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat();

        Date date = new Date();//建立date
        //date作為引數傳給SimpleDataFormat物件的format方法
        String format = simpleDateFormat1.format(date);
        System.out.println(date);//輸出Sat Aug 17 21:11:50 CST 2019
        System.out.println(format);//輸出2019/8/17 下午9:11

        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat();
        Date parse = simpleDateFormat2.parse("2019/8/17 下午9:11");
//        Date parse = simpleDateFormat2.parse("2019/8/17 下午9:"); 刪掉秒,發現解析異常ParseException
        System.out.println(parse);//輸出 2019/8/17 下午9:11
    }

三、Calender類


  • 作用:calendar是一個抽象類,裡面提供了很多提供操作日曆欄位的方法

  • 位置:java.lang.Object

  • 注意:
    西方月份是0-11月
    日曆類calendar
    calendar是一個抽象類,calendar無法直接建立物件,
    主要使用【getInstance】靜態方法,靜態方法直接呼叫,不用建立物件
    該方法返回了calendar類的子類物件。

  • 靜態方法:
    getInstance:靜態方法直接呼叫,不用建立物件
    該方法返回了calendar類的子類物件。
    public static final int MONTH;返回月份
    public static final int YEAR
    public static final int MINUTE
    public static final int SECONDE

  • Calendar類常用的成員方法:
    public int get(int field):返回給定日曆欄位的值。
    public void set(int field,int value):將給定的日曆欄位設定為給定值。
    public abstract void add(int field,int amount):根據日曆規則,為給定的日曆欄位新增或者減去指定的時間量。
    public Date getTime():返回一個表示此Calendar時間值(從曆元到現在的毫秒偏量)的Date物件。
    引數:
    int field :日曆類的字元段,可以使用calendar類的靜態成員變數獲取。
    int value: 要設定的數值
    int value: 正數增加,負數減少

private static void method4(){
        //使用getInstance直接返回日曆物件
        Calendar calendar1 = Calendar.getInstance();
        //呼叫物件的get方法,引數為Calendar類的靜態方法YEAR,得到年)
        int i = calendar1.get(Calendar.YEAR);
        System.out.println(i);//輸出2019
        int momth = calendar1.get(Calendar.MONTH);
        System.out.println(momth);//列印7,在中國即為8月。
        int day = calendar1.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);//輸出17
    }

    private static void method5(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,9999);//設定年份
        calendar.set(Calendar.MONTH,11);//設定月份

        int year = calendar.get(Calendar.YEAR);
        System.out.println(year);//輸出年份9999

        int month = calendar.get(Calendar.MONTH);
        System.out.println(month);//輸出月份11

        // 使用另一個不同引數列表的set方法,同時設定年月日。
        calendar.set(2019,1,3);

        Calendar calendar3 = Calendar.getInstance();
        calendar3.add(Calendar.YEAR,1);//增加1年

        //由2019年變成了2020年。
        System.out.println(calendar3.get(Calendar.YEAR));

        calendar3.add(Calendar.YEAR,-2);//減少2年
        //2018年
        System.out.println(calendar3.get(Calendar.YEAR));

        Calendar calendar5 = Calendar.getInstance();
        //把日曆變成日期
        Date time = calendar5.getTime();
        //輸出Sat Aug 17 22:36:45 CST 2019
        System.out.println(time);
        
    }

四、System類


  • 作用:由System類提供的設施包括標準輸入、標準輸出和錯誤輸出流;訪問外部定義的屬性和環境變數;載入檔案和庫的方法;和一種快速複製陣列的一部分的實用方法。

  • 位置:java.lang.System

  • 方法:
    public static long currentTimeMillis()
    返回當前時間以毫秒為單位。請注意,返回值的時間單位為毫秒,則值的粒度取決於底層作業系統,並且可能更大。例如,許多作業系統測量單位為幾十毫秒的時間。
    public static void arraycopy(Object src, int srcPos, Object dest,int destPos,int length)
    從指定的源陣列中複製一個數組,開始在指定的位置,到目標陣列的指定位置。
    src: 源陣列
    srcPos:源陣列中的起始位置
    dest:目標陣列
    destPos:目標陣列中的起始位置
    length:要複製的陣列元素的數量

private static void method1(){
        long time1 = System.currentTimeMillis();
        //得到原點1970.1.1到現在所差的毫秒值1566371047409
        System.out.println(time1);
    }
public static void main(String[] args) {
        int src[] = {1,2,3,4,5};
        int desk[] = {6,7,8,9,10};
        System.arraycopy(src,0,desk,0,3);
        //輸出[1,2,3,9,10]
        System.out.println(Arrays.toString(desk));

    }

五、StringBuilder類


  • 作用:StringBuilder類,字串緩衝區,可以提高字串的操作效率。
    可以看作一個長度可以變化的字串。
  • 位置:java.lang.StringBuilder
  • 注意:
    字串是常量,它們的值不能被建立後改變。支援可變字串字串緩衝區。
    字串的底層是被final修飾的陣列private final byte[] value;
    因為字串物件是不可改變的,所以它們可以被共享。
    進行字串的相加,記憶體中是多個字串相加,佔用記憶體多,效率低下。
    StringBuilder類,字串緩衝區,可以提高字串的操作效率。
    可以看作一個長度可以變化的字串。
    該類底層也是一個數組,但是無final修飾,因此可以改變長度。
    byte[] value = new byte[16];
    初始長度16。
    字串會依次填入StringBuider陣列中,容量不夠時會自動擴容,因此始終佔據一個數組
    記憶體佔用小,效率高。
  • 構造方法:
  1. public StringBuilder()
    構造一個沒有字元的字串生成器,並構造了16個字元的初始容量。
  2. public StringBuilder(String str)
    構造一個初始化為指定字串的內容的字串生成器。該字串生成器的初始容量是 16加字串的長度。
    引數 str :緩衝區的初始內容。
  • 成員方法:
  1. public StringBuilder append(...) 新增任意型別的字串,並返回當前物件自身。
    由於返回的是物件本身,因此無需接受返回值
    鏈式程式設計:
    方法返回值是一個物件,因此可以繼續呼叫方法:
    a.append(1).append("e")...

  2. public String toString()
    返回表示該序列中的資料的字串。一個新的 String物件被初始化為包含目前代表這個物件的字元序列。
    這 String然後返回。這個序列的後續變化不影響內容的 String。

  • String 和 StringBuilder相互轉換
    String 到 StringBuilder: 使用StringBuilder的構造方法 StringBuilder(String str)
    StringBuilder 到 String :使用StringBuider中的toString方法.
public static void main(String[] args) {
        //空構造方法
        StringBuilder stringBuilder1 = new StringBuilder();
        System.out.println(stringBuilder1);//空的
        //有參構造方法
        StringBuilder stringBuilder2 = new StringBuilder("我是引數");
        System.out.println(stringBuilder2);

    }
 public static void main(String[] args) {
        StringBuilder stringBuilder1 = new StringBuilder("kiana");
//      該寫法不對,無需接受返回值
//      StringBuilder stringBuilder2 = stringBuilder1.append(" love 芽衣");
        stringBuilder1.append(" 喜歡 芽衣");
        //輸出: kiana love 芽衣
        System.out.println(stringBuilder1);

        //鏈式程式設計
        stringBuilder1.append(", 而我").append("喜歡").append("所有人");
        //輸出: kiana 喜歡 芽衣, 而我喜歡所有人
        System.out.println(stringBuilder1);

        //String 轉換 StringBuilder
        String str = "love";
        StringBuilder stringBuilder3 = new StringBuilder(str);
        //輸出love
        System.out.println(stringBuilder3);

        //StringBuilder轉為String
        StringBuilder stringBuilder6 = new StringBuilder("女武神Valkykie");
        stringBuilder6.toString();
        //輸出女武神Valkykie
        System.out.println(stringBuilder6);

    }

六、基本型別包裝類


  • 作用:基本型別的資料效率高,但功能少,為了將其當作物件使用,可以使用基本資料型別對應的包裝類。
    除了int 為 Integer,char 為 Character外,其他只是首字母大寫即可。
  • 裝箱:把基本資料型別的資料包裝到包裝類中
  • Integer的構造方法:
  1. Integer(int value)
    構建了一個新分配的 Integer表示指定的 int價值。
  2. Integer(String s)
    構建了一個新分配的 Integer表示 int值表示的 String引數。

注意,2中的引數字串必須是基本資料型別的字串,不可是其他型別,否則丟擲異常
例如:"123"對 , "一二三"錯誤

  • 兩個靜態方法:
    1.public static Integer valueOf(int i)
    返回一個 Integer例項表示指定的 int價值。
    如果一個新的 Integer例項是不需要的,這種方法一般應優先使用建構函式 Integer(int),
    這種方法可能會產生顯著更好的空間和時間,通過快取經常請求的價值表現。
    此方法將總是在範圍內的快取值- 128至127,包含,並可能快取在此範圍以外的其他值。
    引數
    i - int價值。
    結果
    一個 Integer例項代表 i。
  1. public static Integer valueOf(String s)
    throws NumberFormatException
    返回一個 Integer物件持有指定的 String值。引數的解釋是代表一個十進位制整數,
    就像爭論給 parseInt(java.lang.String)方法。其結果是一個 Integer表示的字串指定的整數值。
    換句話說,這個方法返回一個Integer物件相等的價值:
    new Integer(Integer.parseInt(s))
    引數
    s :被解析的字串。
    結果
    一個 Integer物件持有價值為代表的字串引數。
    異常
    NumberFormatException如果不能將字串解析為一個整數。

  • 拆箱:在包裝類中取出基本資料型別。
  • 拆箱成員方法:
    public int intValue()
    作為一個 int返回該 Integer價值。
    Specified by:
    intValue 方法重寫,繼承類 Number
    結果
    這代表的物件轉換為數值型 int後。
  • 自動裝箱與自動拆箱:基本資料型別和包裝類可以自已自動轉換。自jdk1.5開始。
    自動裝箱寫法:Integer value = 1;
    自動拆箱: 進行value + 1運算時自動將包裝類的value轉換為int型別。

  • 基本資料型別和字串型別的相互轉換。
    基本轉字串
    1.基本型別 + 空字串“”
    2.包裝類的靜態方法toString(引數),注意不是Object類的toString().
    static String toString(int i),返回一個表示指定整數的String物件。
    3.String類的靜態方法valueOf(int i)返回int引數的字串表示形式。
    static String valueOf(int i)
    字串轉基本
    1.使用包裝類的靜態方法parse***("數值型別的字串")
    Integer類: static int parseInt(String s)
    Double類: static double parseInt(String s)
public static void main(String[] args) {
        //構造方法示例:
        Integer integer1 = new Integer("123");
        Integer integer2 = new Integer(123);
        //123,重寫了toString方法
        System.out.println(integer1);
        //123,重寫了toString方法
        System.out.println(integer2);

        //靜態方法
        Integer integer3 = Integer.valueOf(123);
        Integer integer4 = Integer.valueOf("123");
        //123,都是將其變成了包裝類
        System.out.println(integer3);
        System.out.println(integer4);

        //拆箱:包裝類變成基本資料型別
        int int1 = integer3.intValue();
        int int2 = integer2.intValue();
        //123
        System.out.println(int1);
        System.out.println(int2);

    }
public static void main(String[] args){
        //基本轉字串3個方法
        int int1 = 1;
        //方法1
        String string1 = int1+"";
        //方法2
        String string2 = Integer.toString(int1);
        //方法3
        String string3 = String.valueOf(int1);
        //1
        System.out.println(string1);

        //字串轉基本,字串必須是數值型別
        int int2 = Integer.parseInt(string1);
        System.out.println(int2);//1

    }