11. Java常用類
1. Scanner類
1.1 基本語法
java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。
Scanner s = new Scanner(System.in);
1.2 next方法
import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 從鍵盤接收數據 //next方式接收字符串 System.out.println("next方式接收:"); // 判斷是否還有輸入 if(scan.hasNext()){ String str1 = scan.next(); System.out.println("輸入的數據為:"+str1); } } }
輸出結果:
$ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
rimi com
輸入的數據為:rimi
可以看到 com 字符串並未輸出
1.3 nextLine方法
import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 從鍵盤接收數據 //nextLine方式接收字符串 System.out.println("nextLine方式接收:"); // 判斷是否還有輸入 if(scan.hasNextLine()){ String str2 = scan.nextLine(); System.out.println("輸入的數據為:"+str2); } } }
執行以上程序輸出結果為:
$ javac ScannerDemo.java
$ java ScannerDemo
nextLine方式接收:
rimi com
輸入的數據為:rimi com
可以看到 com 字符串輸出。
1.4 next與nextLine()的區別
next():
1、一定要讀取到有效字符後才可以結束輸入。
2、對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。
3、只有輸入有效字符後才將其後面輸入的空白作為分隔符或者結束符。
4、next() 不能得到帶有空格的字符串。
nextLine():
1、以Enter為結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。 2、可以獲得空白。
1.5 使用Scanner輸入多種數據類型
如果要輸入 int 或 float 類型的數據,在 Scanner 類中也有支持,但是在輸入之前最好先使用 hasNextXxx() 方法進行驗證,再使用 nextXxx() 來讀取
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 從鍵盤接收數據
int i = 0 ;
float f = 0.0f ;
System.out.print("輸入整數:");
if(scan.hasNextInt()){
// 判斷輸入的是否是整數
i = scan.nextInt() ;
// 接收整數
System.out.println("整數數據:" + i) ;
}else{
// 輸入錯誤的信息
System.out.println("輸入的不是整數!") ;
}
System.out.print("輸入小數:");
if(scan.hasNextFloat()){
// 判斷輸入的是否是小數
f = scan.nextFloat() ;
// 接收小數
System.out.println("小數數據:" + f) ;
}else{
// 輸入錯誤的信息
System.out.println("輸入的不是小數!") ;
}
}
}
輸出結果:
$ javac ScannerDemo.java
$ java ScannerDemo
輸入整數:12
整數數據:12
輸入小數:1.2
小數數據:1.2
1.6 練習
1. 請輸入需要累加的整數,直到輸入 0 結束累加。
2. Number和Math類
2.1 什麽是包裝類
一般地,當需要使用數字的時候,我們通常使用內置數據類型,如:byte、int、long、double 等
int a = 5000;
float b = 13.65f;
byte c = 0x4a;
然而,在實際開發過程中,我們經常會遇到需要使用對象,而不是內置數據類型的情形。為了解決這個問題,Java 語言為每一個內置數據類型提供了對應的包裝類。
所有的包裝類(Integer、Long、Byte、Double、Float、Short)都是抽象類 Number 的子類。
這種由編譯器特別支持的包裝稱為裝箱,所以當內置數據類型被當作對象使用的時候,編譯器會把內置類型裝箱為包裝類。相似的,編譯器也可以把一個對象拆箱為內置類型。Number 類屬於 java.lang 包。
public class Test{
public static void main(String args[]){
Integer x = 5;
x = x + 10;
System.out.println(x);
}
}
當 x 被賦為整型值時,由於x是一個對象,所以編譯器要對x進行裝箱。然後,為了使x能進行加運算,所以要對x進行拆箱。
關於拆箱封箱
/**
*
* java中的自動裝箱與拆箱
* 簡單一點說,裝箱就是自動將基本數據類型轉換為包裝器類型;拆箱就是自動將包裝器類型轉換為基本數據類型。
*/
public class NumberDemo {
public static void main(String[] args) {
/*
Integer i1 = 128; // 裝箱,相當於 Integer.valueOf(128);
int t = i1; //相當於 i1.intValue() 拆箱
System.out.println(t);
*/
/*
對於–128到127(默認是127)之間的值,被裝箱後,會被放在內存裏進行重用
但是如果超出了這個值,系統會重新new 一個對象
*/
Integer i1 = 200;
Integer i2 = 200;
/*
註意 == 與 equals的區別
== 它比較的是對象的地址
equlas 比較的是對象的內容
*/
if(i1==i2) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
2.2 Math類
Java 的 Math 包含了用於執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函數。
Math 的方法都被定義為 static 形式,通過 Math 類可以在主函數中直接調用。
public class Test {
public static void main (String []args)
{
System.out.println("90 度的正弦值:" + Math.sin(Math.PI/2));
System.out.println("0度的余弦值:" + Math.cos(0));
System.out.println("60度的正切值:" + Math.tan(Math.PI/3));
System.out.println("1的反正切值: " + Math.atan(1));
System.out.println("π/2的角度值:" + Math.toDegrees(Math.PI/2));
System.out.println(Math.PI);
}
}
結果如下:
90 度的正弦值:1.0
0度的余弦值:1.0
60度的正切值:1.7320508075688767
1的反正切值: 0.7853981633974483
π/2的角度值:90.0
3.141592653589793
2.3 number和Math類的方法
1 xxxValue()
將 Number 對象轉換為xxx數據類型的值並返回。
2 compareTo()
將number對象與參數比較。
3 equals()
判斷number對象是否與參數相等。
4 valueOf()
返回一個 Number 對象指定的內置數據類型
5 toString()
以字符串形式返回值。
6 parseInt()
將字符串解析為int類型。
7 abs()
返回參數的絕對值。
8 ceil()
對整形變量向左取整,返回類型為double型。
9 floor()
對整型變量向右取整。返回類型為double類型。
10 rint()
返回與參數最接近的整數。返回類型為double。
11 round()
返回一個最接近的int、long型值。
12 min()
返回兩個參數中的最小值。
13 max()
返回兩個參數中的最大值。
14 exp()
返回自然數底數e的參數次方。
15 log()
返回參數的自然數底數的對數值。
16 pow()
返回第一個參數的第二個參數次方。
17 sqrt()
求參數的算術平方根。
18 sin()
求指定double類型參數的正弦值。
19 cos()
求指定double類型參數的余弦值。
20 tan()
求指定double類型參數的正切值。
21 asin()
求指定double類型參數的反正弦值。
22 acos()
求指定double類型參數的反余弦值。
23 atan()
求指定double類型參數的反正切值。
24 atan2()
將笛卡爾坐標轉換為極坐標,並返回極坐標的角度值。
25 toDegrees()
將參數轉化為角度。
26 toRadians()
將角度轉換為弧度。
27 random()
返回一個隨機數。
舉例
/**
* abs求絕對值
*/
System.out.println(Math.abs(-10.4)); //10.4
System.out.println(Math.abs(10.1)); //10.1
/**
* ceil天花板的意思,就是返回大的值,註意一些特殊值
*/
System.out.println(Math.ceil(-10.1)); //-10.0
System.out.println(Math.ceil(10.7)); //11.0
System.out.println(Math.ceil(-0.7)); //-0.0
System.out.println(Math.ceil(0.0)); //0.0
System.out.println(Math.ceil(-0.0)); //-0.0
/**
* floor地板的意思,就是返回小的值
*/
System.out.println(Math.floor(-10.1)); //-11.0
System.out.println(Math.floor(10.7)); //10.0
System.out.println(Math.floor(-0.7)); //-1.0
System.out.println(Math.floor(0.0)); //0.0
System.out.println(Math.floor(-0.0)); //-0.0
/**
* max 兩個中返回大的值,min和它相反,就不舉例了
*/
System.out.println(Math.max(-10.1, -10)); //-10.0
System.out.println(Math.max(10.7, 10)); //10.7
System.out.println(Math.max(0.0, -0.0)); //0.0
/**
* random 取得一個大於或者等於0.0小於不等於1.0的隨機數
*/
System.out.println(Math.random()); //0.08417657924317234
System.out.println(Math.random()); //0.43527904004403717
/**
* rint 四舍五入,返回double值
* 註意.5的時候會取偶數
*/
System.out.println(Math.rint(10.1)); //10.0
System.out.println(Math.rint(10.7)); //11.0
System.out.println(Math.rint(11.5)); //12.0
System.out.println(Math.rint(10.5)); //10.0
System.out.println(Math.rint(10.51)); //11.0
System.out.println(Math.rint(-10.5)); //-10.0
System.out.println(Math.rint(-11.5)); //-12.0
System.out.println(Math.rint(-10.51)); //-11.0
System.out.println(Math.rint(-10.6)); //-11.0
System.out.println(Math.rint(-10.2)); //-10.0
/**
* round 四舍五入,float時返回int值,double時返回long值
*/
System.out.println(Math.round(10.1)); //10
System.out.println(Math.round(10.7)); //11
System.out.println(Math.round(10.5)); //11
System.out.println(Math.round(10.51)); //11
System.out.println(Math.round(-10.5)); //-10
System.out.println(Math.round(-10.51)); //-11
System.out.println(Math.round(-10.6)); //-11
System.out.println(Math.round(-10.2)); //-10
3. Character類
3.1 Character類的用法
Character 類用於對單個字符進行操作。
Character 類在對象中包裝一個基本類型 char 的值
// 單個字符
char ch = ‘a‘;
// Unicode 字符表示形式
char uniChar = ‘\u039A‘;
// 字符數組
char[] charArray ={ ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘ };
// 包裝類 Character
Character ch = new Character(‘a‘);
在某些情況下,Java編譯器會自動創建一個Character對象。
例如,將一個char類型的參數傳遞給需要一個Character類型參數的方法時,那麽編譯器會自動地將char類型參數轉換為Character對象。 這種特征稱為裝箱,反過來稱為拆箱。
public static void main(String[] args) {
// 原始字符 ‘a‘ 裝箱到 Character 對象 character 中
Character character = ‘a‘;
// 原始字符 ‘x‘ 用 test 方法裝箱
// 返回拆箱的值到 ch
char ch = test(‘x‘);
}
public static char test(Character c) {
return c;
}
3.2 轉義序列
前面有反斜杠(\)的字符代表轉義字符,它對編譯器來說是有特殊含義的。
\t 在文中該處插入一個tab鍵
\b 在文中該處插入一個後退鍵
\n 在文中該處換行
\r 在文中該處插入回車
\f 在文中該處插入換頁符
\‘ 在文中該處插入單引號
\" 在文中該處插入雙引號
\\ 在文中該處插入反斜杠
3.3 Character類的方法
1 isLetter() 是否是一個字母
2 isDigit() 是否是一個數字字符
3 isWhitespace() 是否是一個空格
4 isUpperCase() 是否是大寫字母
5 isLowerCase() 是否是小寫字母
6 toUpperCase() 指定字母的大寫形式
7 toLowerCase() 指定字母的小寫形式
8 toString() 返回字符的字符串形式,字符串的長度僅為1
4. String類
字符串廣泛應用 在Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來創建和操作字符串。
4.1 創建字符串
創建字符串最簡單的方式如下:
String greeting = "睿峰科技";
在代碼中遇到字符串常量時,這裏的值是 "睿峰科技"",編譯器會使用該值創建一個 String 對象。 和其它對象一樣,可以使用關鍵字和構造方法來創建 String 對象。 String 類有 11 種構造方法,這些方法提供不同的參數來初始化字符串,比如提供一個字符數組參數:
public class StringDemo{
public static void main(String args[]){
char[] nameArray = { ‘r‘, ‘i‘, ‘m‘, ‘i‘};
String nameString = new String(nameArray);
System.out.println(nameString);
}
}
註意:String 類是不可改變的,所以你一旦創建了 String 對象,那它的值就無法改變了。
如果需要對字符串做很多修改,那麽應該選擇使用 StringBuffer & StringBuilder 類。
String 類是不可改變的解析,例如:
String s = "Google";
System.out.println("s = " + s);
s = "Rimi";
System.out.println("s = " + s);
結果為:
Google
Rimi
從結果上看是改變了,但為什麽門說String對象是不可變的呢?
原因在於實例中的 s 只是一個 String 對象的引用,並不是對象本身,當執行 s = "Rimi"; 創建了一個新的對象 "Rimi",而原來的 "Google" 還存在於內存中。
4.2 字符串長度
用於獲取有關對象的信息的方法稱為訪問器方法。
String 類的一個訪問器方法是 length() 方法,它返回字符串對象包含的字符數。
public class StringDemo {
public static void main(String args[]) {
String site = "www.rimiedu.com";
int len = site.length();
System.out.println( "睿峰教育網址長度 : " + len );
}
}
4.3 連接字符串
String 類提供了連接兩個字符串的方法:
string1.concat(string2);
更常用的是使用‘+‘操作符來連接字符串,如:
"Hello," + " rimi" + "!"
4.4 常用String類方法
1.字符串比較
compareTo
compareToIgnoreCase(//忽略大小寫)
2.查找字符串最後一次出現的位置
lastIndexOf
3.截取字符串出現
substring
4.字符串替換
replace
replaceFirst
replaceAll
5.字符串反轉
StringBuffer
6.字符串查找
indexOf
7.字符串分割
split
8.字符串小寫轉大寫
toUpperCase
9.測試兩個字符串區域是否相等
//參數說明:自己的起始位置,比較的 String, 比較的 String 的起始位置,比較長度。
regionMatches(11, second_str, 12, 9);
regionMatches(true, 11, second_str, 12, 9); //第一個參數 true 表示忽略大小寫區別
10.字符串性能比較測試
System.currentTimeMillis(); //利用獲取時間戳進行比較
//第一種創建形式
String s1 = "hello";
//第二種創建形式
String s2 = new String("hello");
11.字符串優化
1. 直接使用字符串
String str = "123";
String str1 = "123";
2. 使用 new 關鍵字
String str2 = new String("123");
字符串優化處理
12.連接字符串
字符串連接 - 使用 + 操作符
字符串連接 - 使用 StringBuffer/StringBuilder
StringBuffer
代碼示例:
StringBuilder sb = new StringBuilder ( "" );
for ( int i= 0 ;i< 10 ;i++){
sb.append(String.valueOf(i));
System.out.println(sb+",");
}
5. StringBuffer/StringBuilder類
當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。
public class Test{
public static void main(String args[]){
StringBuffer sBuffer = new StringBuffer("睿峰官網:");
sBuffer.append("www");
sBuffer.append(".rimi");
sBuffer.append(".com");
System.out.println(sBuffer);
}
}
StringBuffer方法:
1 public StringBuffer append(String s) 將指定的字符串追加到此字符序列。
2 public StringBuffer reverse() 將此字符序列用其反轉形式取代。
3 public delete(int start, int end) 移除此序列的子字符串中的字符。
4 public insert(int offset, int i) 將 int 參數的字符串表示形式插入此序列中。
5 replace(int start, int end, String str) 使用給定 String 中的字符替換此序列的子字符串中的字符。
Java 中 StringBuffer 和 String 是有一定的區別的
首先,String 是被 final 修飾的,他的長度是不可變的,就算調用 String 的 concat 方法,那也是把字符串拼接起來並重新創建一個對象,把拼接後的 String 的值賦給新創建的對象,
而 StringBuffer 的長度是可變的,調用StringBuffer 的 append 方法,來改變 StringBuffer 的長度,並且,相比較於 StringBuffer,String 一旦發生長度變化,是非常耗費內存的!
5. 數組類
java.util.Arrays 類能方便地操作數組,它提供的所有方法都是靜態的。
具有以下功能:
- 給數組賦值:通過 fill 方法。
- 對數組排序:通過 sort 方法,按升序。
- 比較數組:通過 equals 方法比較數組中元素值是否相等。
- 查找數組元素:通過 binarySearch 方法能對排序好的數組進行二分查找法操作。
常用方法:
1 public static int binarySearch(Object[] a, Object key)
用二分查找算法在給定數組中搜索給定值的對象(Byte,Int,double等)。數組在調用前必須排序好的。如果查找值包含在數組中,則返回搜索鍵的索引;否則返回 (-(插入點) - 1)。
2 public static boolean equals(long[] a, long[] a2)
如果兩個指定的 long 型數組彼此相等,則返回 true。如果兩個數組包含相同數量的元素,並且兩個數組中的所有相應元素對都是相等的,則認為這兩個數組是相等的。換句話說,如果兩個數組以相同順序包含相同的元素,則兩個數組是相等的。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。
3 public static void fill(int[] a, int val)
將指定的 int 值分配給指定 int 型數組指定範圍中的每個元素。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。
4 public static void sort(Object[] a)
對指定對象數組根據其元素的自然順序進行升序排列。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。
6. 時間日期
java.util 包提供了 Date 類來封裝當前的日期和時間。 Date 類提供兩個構造函數來實例化 Date 對象。
第一個構造函數使用當前日期和時間來初始化對象。
Date( )
第二個構造函數接收一個參數,該參數是從1970年1月1日起的毫秒數。
Date(long millisec)
6.1 常用Date方法
1 boolean after(Date date)
若當調用此方法的Date對象在指定日期之後返回true,否則返回false。
2 boolean before(Date date)
若當調用此方法的Date對象在指定日期之前返回true,否則返回false。
3 Object clone( )
返回此對象的副本。
4 int compareTo(Date date)
比較當調用此方法的Date對象和指定日期。兩者相等時候返回0。調用對象在指定日期之前則返回負數。調用對象在指定日期之後則返回正數。
5 int compareTo(Object obj)
若obj是Date類型則操作等同於compareTo(Date) 。否則它拋出ClassCastException。
6 boolean equals(Object date)
當調用此方法的Date對象和指定日期相等時候返回true,否則返回false。
7 long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。
8 int hashCode( )
返回此對象的哈希碼值。
9 void setTime(long time)
用自1970年1月1日00:00:00 GMT以後time毫秒數設置時間和日期。
10 String toString( )
轉換Date對象為String表示形式,並返回該字符串。
6.2 獲取當前時間
Java中獲取當前日期和時間很簡單,使用 Date 對象的 toString() 方法來打印當前日期和時間
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 使用 toString() 函數顯示日期時間
System.out.println(date.toString());
}
}
6.3 日期比較
Java使用以下三種方法來比較兩個日期:
- 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然後比較這兩個值。
- 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
- 使用 compareTo() 方法,它是由 Comparable 接口定義的,Date 類實現了這個接口。
6.4 使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何用戶自定義日期時間格式來運行
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd ‘at‘ hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
這一行代碼確立了轉換的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是時、分、秒。
註意:有的格式大寫,有的格式小寫,例如 MM 是月份,mm 是分;HH 是 24 小時制,而 hh 是 12 小時制。
6.5 日期和時間的格式化編碼
時間模式字符串用來指定時間格式。在此模式中,所有的 ASCII 字母被保留為模式字母,定義如下:
G 紀元標記 AD
y 四位年份 2001
M 月份 July or 07
d 一個月的日期 10
h A.M./P.M. (1~12)格式小時 12
H 一天中的小時 (0~23) 22
m 分鐘數 30
s 秒數 55
S 毫秒數 234
E 星期幾 Tuesday
D 一年中的日子 360
F 一個月中第幾周的周幾 2 (second Wed. in July)
w 一年中第幾周 40
W 一個月中第幾周 1
a A.M./P.M. 標記 PM
k 一天中的小時(1~24) 24
K A.M./P.M. (0~11)格式小時 10
z 時區 Eastern Standard Time
‘ 文字定界符 Delimiter
" 單引號 `
6.6 測量時間
System.currentTimeMillis(); //獲取當前時間戳
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
6.7 Calendar類
我們現在已經能夠格式化並創建一個日期對象了,但是我們如何才能設置和獲取日期數據的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要復雜一些。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可。
6.7.1 創建Calendar類對象
-
創建一個代表系統當前日期的Calendar對象
Calendar c = Calendar.getInstance();//默認是當前日期
-
創建一個指定日期的Calendar對象
使用Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後再設定該對象中的年月日參數來完成。
//創建一個代表2009年6月12日的Calendar對象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
6.7.2 Calendar類對象字段
Calendar類中用一下這些常量表示不同的意義,jdk內的很多類其實都是采用的這種思想
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意義完全相同
Calendar.HOUR 12小時制的小時
Calendar.HOUR_OF_DAY 24小時制的小時
Calendar.MINUTE 分鐘
Calendar.SECOND 秒
Calendar.DAY_OF_WEEK 星期幾
6.7.3 Calendar類對象的獲取
Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(註意(這個與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);
11. Java常用類