1. 程式人生 > >JAVA進階(03)常用類

JAVA進階(03)常用類

一、包裝類

1、包裝類概述

  • 8種基本型別對應8種包裝類,除了 Integer 和 Character 類以外,其他只是類名首字母大寫;
  • 除了 Character 和 Boolean,其他都是數字型,繼承自 Number 類,重寫過 intValue()、longValue()、floatValue()、doubleValue() 方法,可以相互轉換;
  • 包裝類的用途:物件陣列和集合操作;包裝物件包含方法可以為基本型別、包裝類和字串之間的轉換提供方便;

2、自動裝箱和拆箱

(1)自動裝箱:基本型別的資料處於需要物件的環境中時,會自動轉為物件

(2)自動拆箱:每當需要一個值時,物件會自動轉成基本資料型別

(3)實現:通過呼叫包裝類的 valueof()和 intValue()方法分別實現 裝 拆 箱,整個過程有編譯器自動完成

(4)程式碼:注意包裝類的空指標問題

Integer b = 23; // 自動裝箱
int a = new Integer(20); //自動拆箱
// 下面的問題我們需要注意:
Integer c = null;
int d = c; // 此處其實就是:c.intValue(),因此拋空指標異常。

3、包裝類快取問題

(1)包裝類在自動裝箱時為了提高效率,對於-128~127之間的值會進行快取處理

(2)快取的本質就是包裝類在載入時,自動建立這個範圍內的物件,後面用的話直接引用,不會在 new 物件

(3)超過範圍後,物件之間不能再使用==進行數值的比較,而是使用equals方法

 

二、String類

1、String 類概述

(1)String 類物件是不可變的Unicode字元序列(不可變物件),其內部的成員變數用 final 修飾,其值無法改變

(2)字串常量拼接時的優化

public class TestString2 {
    public static void main(String[] args) {
        //編譯器做了優化,直接在編譯的時候將字串進行拼接
        String str1 = "hello" + " java";//相當於str1 = "hello java";
        String str2 = "hello java";
        System.out.println(str1 == str2);//true
        String str3 = "hello";
        String str4 = " java";
        //編譯的時候不知道變數中儲存的是什麼,所以沒辦法在編譯的時候優化
        String str5 = str3 + str4;
        System.out.println(str2 == str5);//false
    }
}

(3)常用方法總結:

  • 這些方法會返回一個新的 String,而不改變原來 String 的值:concat()、 replace()、substring()、 toLowerCase()、 toUpperCase()、trim()
  • 提供查詢功能的有關方法: endsWith()、 startsWith()、 indexOf()、lastIndexOf()
  • 提供比較功能的方法: equals()、equalsIgnoreCase()、compareTo()
  • 其它方法: charAt() 、length()

2、StringBuffer和StringBuilder

(1)概念

  • tringBuffer 和 StringBuilder 均代表可變的字元序列
  • 都是抽象類 AbstractStringBuilder 的子類,方法幾乎一模一樣
  • 二者內部字元陣列未用 final 修飾,是可變的
  • 字串的多次拼接可以用這兩個類,多用於迴圈中,可以減少資源的浪費

(2)二者區別

  • StringBuffer 執行緒安全, 效率較低
  • StringBuilder 執行緒不安全,效率較高,建議採用該類;

(3)常用方法

  • append("  ")
  • delete(int start,int end)
  • deleteCharAt(int index)
  • insert(index,"  ")
  • reverse()
  • 此外還有:indexOf()、substring()、length()、charAt()等方法

 

三、時間類

1、毫秒值

  • 把1970 年 1 月 1 日 00:00:00定為基準時間,每個度量單位是毫秒(1秒的千分之一);
  • 毫秒值為 long 型:long now = System.currentTimeMillis();

2、date類

(1)構造器

  • 空參:new Date() 時間預設當前時間
  • 有參:new Date(100) 引數為毫秒值

(2)方法

  • long getTime():得到時間的毫秒值
  • 判斷時間前後:before、after、equals
  • toString:格式化輸出

(3)說明:很多方法過時,現在一般用 calendar 類

3、DateFormat類和SimpleDateFormat類

(1)作用:實現字串和時間物件的相互轉換

// new 出 sdf 物件
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 將時間物件轉換成字串
System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
// 將符合指定格式的字串轉成成時間物件.字串格式需要和指定格式一致。
String time = "2007-10-7 20:15:30";
Date date = s1.parse(time);

(2)其他用途:獲取當前時間是今年第幾天

SimpleDateFormat s1 = new SimpleDateFormat("D");
String daytime = s1.format(new Date());
System.out.println(daytime);

4、calendar類

(1)概述

  • Calendar 類是一個抽象類,提供日期計算的相關功能
  • GregorianCalendar 是 Calendar 的一個具體子類
  • 注意月份的表示,一月是0,二月是1,以此類推,12月是11

(2)方法

  • calendar.get(Calendar.YEAR)
  • set(Calendar.YEAR, 2999)
  • add(Calendar.MONTH, -7)
  • calendar3.getTime():日曆轉時間
  • calendar4.setTime(new Date()):時間轉日曆

(3)某一月份日曆列印(練習)

(4)Clendar 類的常量

  • Calendar.YEAR
  • Calendar.MONTH
  • Calendar.DAY_OF_MONTH
  • Calendar.DATE
  • Calendar.DAY_OF_WEEK
  • Calendar.HOUR_OF_DAY
  • Calendar.MINUTE
  • Calendar.SECOND

 

四、Math類

1、常用方法

  • abs 絕對值、sqrt 平方根、pow(double a, double b) a的b次冪、random() 返回 0.0 到 1.0 的隨機數
  • ceil(double a) 大於a的最小整數、floor(double a) 小於a的最大整數、long round(double a) 四捨五入

2、關於隨機數

(1)Math.random():返回 0到 1的隨機數

(2)Random類:nextDouble()、nextInt(10)

(3)Math.random()底層呼叫的就是Random的nextDouble()方法

 

五、File類

1、基本用法

(1)說明: java.io.File類代表檔案和目錄,用於讀取檔案、生成檔案、刪除檔案、修改檔案的屬性

(2)構造方法

  • public File(String pathname):有相對路徑和絕對路徑

(3)建立檔案

File f = new File("a.txt"); //相對路徑:預設放到user.dir目錄下面
f.createNewFile();//建立檔案

(4)建立目錄

  • 一個目錄
File f2 = new File("d:/電影");
boolean flag = f2.mkdir(); //目錄結構中有一個不存在,則不會建立整個目錄樹
System.out.println(flag);//建立失敗
  • 多個目錄
File f2 = new File("d:/電影/華語/大陸");
boolean flag = f2.mkdirs();//目錄結構中有一個不存在也沒關係;建立整個目錄樹
System.out.println(flag);//建立成功

(5)訪問屬性

2、遞迴遍歷目錄

/**
     * 列印檔案資訊
     * @param file 檔名稱
     * @param level 層次數(實際就是:第幾次遞迴呼叫)
     */
    static void printFile(File file, int level) {
        //輸出層次數
        for (int i = 0; i < level; i++) {
            System.out.print("-");
        }
        //輸出檔名
        System.out.println(file.getName());
        //如果file是目錄,則獲取子檔案列表,並對每個子檔案進行相同的操作
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (File temp : files) {
                //遞迴呼叫該方法:注意等+1
                printFile(temp, level + 1);
            }
        }
    }

 

六、列舉類

1、概念

(1)定義格式

enum Season {
    SPRING, SUMMER, AUTUMN, WINDER 
}

(1)實質

  • 列舉實質上還是類,而每個被列舉的成員實質就是一個列舉型別的例項,預設都是public static final修飾的,可以通過類名直接呼叫

2、使用

  • 需要定義一組常量時,可以使用列舉型別
  • 儘量不要使用列舉的高階特性,事實上高階特性都可以使用普通類來實現