java 常用工具類的使用<一>


1. Java工具概述
很多人初學程序時,總是在想,那么多的算法該怎么寫呀?那么多的數據結構都不熟悉,該怎么實現呀?總是擔心英語不好程序學不精通,數學不好寫程序無法達到巔峰。學的程序越多,不懂的知識越多。

這種想法很正常,畢竟傳統的計算機教育都是從原理開始的,科學原理一般理解起來還能夠接受,但是實現起來都很難。計算機發展到了今天,能成為原理的基本已經有人實現了,今天我們學習任何知識都是站在巨人的肩膀上,只要理解程序運行原理,算法的功能即可。底層的各種算法,各種數據結構已經被“巨人們”實現了,一般都放在程序開發類庫中,程序員開發過程中直接調用即可。

比如現在木工做家具,已經不存在自己砍樹、加工木板、一點一點的雕刻了,如果需要木板,直接到市場上購買,需要各種圖案,直接到市場購買,木工的工作就是把這些木板修理一下組裝成一套家具即可。“工欲善其事,必先利其器”,在Java程序開發過程中,很多算法(比如:MD5加密算法)、很多數據結構(比如鏈表LinkedList)已經實現並且大多放在類庫的java.util包中,程序員只需要了解各種工具的功能就可以直接調用。比如對一個數組進行排序,程序員可以寫如下排序算法:

代碼演示:數組排序
public static void sort(int[] arrs) {
 boolean isSwap = false;
 for (int i = 0; i < arrs.length - 1; i++) {
  isSwap = false;
  for (int j = arrs.length - 1; j > i; j--) {
   if (arrs[j - 1] > arrs[j]) {
    isSwap = true;
    int tmp = arrs[j - 1];
    arrs[j - 1] = arrs[j];
    arrs[j] = tmp;
   }
  }  
 }
}

該排序算法中只能對整數數組排序,還有其他數據類型呢?就需要重載很多方法進行排序操作。而在Java類庫中有一個Arrays類的sort方法已經實現各種數據類型的排序算法。程序員只需要調用該類的方法即可。

代碼演示:Arrays實現排序
public static void main(String[] args) {
 int[] ages={23, 45,12,76,34,56,24};
 Arrays.sort(ages);
 for (int i = 0; i < ages.length; i++) {
  System.out.println(ages[i]);
 }
}

在Java開發類庫中,提供了很多工具類,我們即將學習最常見的工具類,比如對日期的操作,對集合的操作等。具體更多的工具類,請參考JavaDoc文檔。

2. java.util.Date類
Date類包裝了毫秒值,毫秒值表示自1970年1月1日00:00:00 GMT開始到現在經過的毫秒數。該類的大部分構造器和方法都已經過時,但是該類使用非常方便,因此目前使用還很普遍,該類的另一個主要功能是,在數據庫操作中,它允許將毫秒值表示為SQL DATE值,是數據庫操作中java.sql.Date的父類。關於數據庫操作,將在第八章開始講解。

該類目前推薦使用的構造方法有兩個:

構造方法 說明
Date() 按照當前系統時間構造一個Date對象。
Date(long date) 按照給定的時間毫秒值構造一個 Date 對象。
表1  java.util.Date類的構造方法

主要的方法有:

返回 異常 說明
boolean after(Date when) 測試當前對象表示的時間是否在指定時間之后。
boolean before(Date when) 測試當前對象表示的時間是否在指定時間之前。
long getTime() 返回當前對象對應的時間毫秒值
void setTime(long time) 設置時間
表2  java.util.Date類的主要方法

代碼演示:時間設置
public class Demo2 {
 public static void main(String[] args) {
  Date date=new Date();  ①
  date.setTime((10L*365+2)*24*60*60*1000);  ②
  System.out.println(date);  ③
 }
}
代碼解析:
① 構造當前系統時間。
② 設置時間值為1970年后10年的時間的毫秒值,10年間有2個閏年,10年的天數是:10*365+2,10L表示當前值是long類型。
③ 調用Date的toString方法輸出結果。

代碼輸出結果:
Tue Jan 01 08:00:00 CST 1980

  Q 老師,時間毫秒值從1970年1月1日0:00.000開始計算,上面示例中10年后應該是1980年1月1日0:00.000,為什么輸出結果是:1980年1月1日 8:00呢?
A java.util.Date類型表示的是GMT時間,本身輸出是國際化輸出,由於中國處於東八區時間,因此輸出結果是早上8點。而Date的其他構造方法和普通方法的API都不容易實現國際化,因此目前Date類的大多數方法都被標識為過時,表示更靈活的時間類請參考java.util.Calendar。

Date的輸出結果是按照國際通用格式輸出的,而中國更習慣於“年-月-日”的形式輸出,這種特殊格式的輸出需要用到Java格式化工具。

3. 格式化工具
格式化的目的是把一個對象以不同的格式表示,以滿足不同環境對格式的要求,比如:前面學習的Date對象實質是一個以毫秒值表示的時間,但是在不同的國家和地區表示方式不一樣。那么就需要對Date進行格式化處理。接下來主要學習Java對日期時間的格式化和對數字的格式化處理。

 日期時間格式化

Date類中包含了日期和時間,在Java編程中,日期通常指年、月、日,時間則指時、分、秒、毫秒。Java對Date進行格式化使用java.text.DateFormat類。在格式表示中,經常采用4種格式,這四種格式被定義為DateFormat類的常量。下表所示:

格式 說明
SHORT 以最短的格式表示,比如:09-8-20
MEDIUM 比short完整表示方式,比如:2009-8-20
LONG 比medium更完整的表示方式,比如:2009年8月20日
FULL 綜合的表示方式,比如:2009年8月20日 星期四
表3  DateFormat的四種表示格式

因為不同國家地區需要格式化的結果不同,Locale類的對象表示了不同的區域,Locale定義目前全世界幾乎所有地區的對象表示,比如:

格式 說明
Locale.CHINA 中國地區
Locale.US 美國地區
Locale.FRANCE 法國地區
Locale.CANADA 加拿大地區
表4  Locale對部分地區的表示

 DateFormat是一個抽象類,不能直接實例化,可以使用下表中的靜態方法得到DateFormat的對象。

方法 說明
getDateInstance() 返回默認地區,默認格式的關於日期的DateFormat對象。
getDateInstance(int) 返回指定格式下,默認地區的關於日期的DateFormat對象。
getDateInstance(int, Locale) 返回指定格式,指定地區的關於日期的DateFormat對象。
getTimeInstance() 返回默認地區,默認格式的關於時間的DateFormat對象。
getTimeInstance (int) 返回默認地區,指定格式的關於時間的DateFormat對象。
getTimeInstance (int, Locale) 返回指定地區,指定格式的關於時間的DateFormat對象。
getDateTimeInstance() 返回默認地區、默認日期格式、默認時間格式的關於日期和時間的DateFormat對象。
getDateTimeInstance (int,int) 返回默認地區、指定日期格式、指定時間格式的關於日期和時間的DateFormat對象。
getDateTimeInstance (int,int, Locale) 返回指定地區、指定日期格式、指定時間格式的關於日期和時間的DateFormat對象。
表5  獲取DateFormat對象的靜態方法

調用DateFormat對象的format方法可以把Date對象轉換成為指定格式的String類型數據。比如:

Date today=new Date();
DateFormat df=DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA);
String result=df.format(today);

代碼演示:日期的不同格式
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class Demo3 {
 public static void main(String[] args) {
  Date today = new Date();
  Locale[] locals = new Locale[] { Locale.CHINA, Locale.US, Locale.UK };
  for (int i = 0; i < locals.length; i++) {
   DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT,
     locals[i]);
   DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM,
     locals[i]);
   DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG,
     locals[i]);
   DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL,
     locals[i]);

   System.out.println(locals[i].getDisplayCountry() + "的日期形式:");
   System.out.println("\tShort格式:" + df1.format(today));
   System.out.println("\tMedium格式:" + df2.format(today));
   System.out.println("\tLong格式:" + df3.format(today));
   System.out.println("\tFull格式:" + df4.format(today));
  }
 }
}
代碼輸出結果:
中國的日期形式:
 Short格式:09-8-20
 Medium格式:2009-8-20
 Long格式:2009年8月20日
 Full格式:2009年8月20日 星期四
美國的日期形式:
 Short格式:8/20/09
 Medium格式:Aug 20, 2009
 Long格式:August 20, 2009
 Full格式:Thursday, August 20, 2009
英國的日期形式:
 Short格式:20/08/09
 Medium格式:20-Aug-2009
 Long格式:20 August 2009
 Full格式:20 August 2009

在Java程序設計過程中,對應日期和時間的格式化,還有一個簡單的格式化方式,就是java.text.SimpleDateFormat,該類中用字符串指定日期和時間的格式,字符串中的字符稱為模式字符,模式字符區分大小寫。常見的模式字符定義如下:




字母 日期或時間元素
y 年
M 年中的月份
w 年中的周數
W 月份中的周數
D 年中的天數
d 月份中的天數
F 月份中的星期
E 星期中的天數
a Am/pm 標記
H 一天中的小時數(0-23)
k 一天中的小時數(1-24)
K am/pm 中的小時數(0-11)
h am/pm 中的小時數(1-12)
m 小時中的分鍾數
s 分鍾中的秒數
S 毫秒數
表6  模式字符串

例如:

日期和時間模式 結果
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"yyyy-MM-dd HH:mm:ss" 2009-8-20 14:22
"yyyy年MM月dd HH:mm:ss" 2009年8月20  14:22:23
表7  模式字符串示例

SimpleDateFormat是DateFormat的子類,用法和DateFormat類基本一致,主要使用format()方法。

代碼演示:SimpleDateFormat進行日期轉換
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo4 {
 public static void main(String[] args) {
  Date today = new Date();
  SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
  SimpleDateFormat format2 
= new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
  SimpleDateFormat format3 = new SimpleDateFormat("HH:mm:ss");
  SimpleDateFormat format4 = new SimpleDateFormat("yyyy");
  System.out.println(format1.format(today));
  System.out.println(format2.format(today));
  System.out.println(format3.format(today));
  System.out.println(format4.format(today));
 }
}
代碼輸出結果:
2009-08-20
2009年08月20 14:25:58
14:25:58
2009

在程序設計時,界面上用戶輸入的基本上都是字符串,如果字符串輸入一個出生年月,如何把該字符串轉換成Date類型呢?可以使用SimpleDateFormat的parse()方法。

代碼演示:SimpleDateFormat解析日期
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo5 {
 public static void main(String[] args) {
  String birthday="1980-04-16";
  SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
  try {
   Date bir=format.parse(birthday);
   System.out.println(bir);
  } catch (ParseException e) {  ①
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}
代碼解析:
①  用SimpleDateFormat解析日期的時候需要處理其中的ParseException異常。

 數字格式化

對數字的格式化,在程序處理中也是非常常用的,數字格式化主要對小數點位數,表示的形式(比如:百分數表示)等格式處理。

NumberFormat 是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。若要格式化當前Locale的數值,可使用其中一個方法:
myString = NumberFormat.getInstance().format(myNumber);

若要格式化不同 Locale 的日期,可在調用getInstance方法時指定它。

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);

方法 說明
getInstance() 獲取常規數值格式。可以指定Local參數。
getNumberInstance() 獲取常規數值格式。可以指定Local參數。
getIntegerInstance() 獲取整數數值格式。可以指定Local參數。
getCurrencyInstance () 獲取貨幣數值格式。可以指定Local參數。格式化后的數據前面會有一個貨幣符號,比如:“¥”
getPercentInstance() 獲取顯示百分比的格式。可以指定Local參數。比如:小數 0.53 將顯示為 53%。
表8  獲取NumberFormat對象




代碼演示:NumberFormat進行數字格式化
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class Demo6 {
 public static void main(String[] args) {
  double mynum1 = 230456789;
  double mynum2 = 0.23;
  NumberFormat nf1 = NumberFormat.getInstance(Locale.CHINA);
  NumberFormat nf2 = NumberFormat.getCurrencyInstance(Locale.CHINA);
  NumberFormat nf3 = NumberFormat.getCurrencyInstance(Locale.US);
  NumberFormat nf4 = NumberFormat.getPercentInstance();

  System.out.println(nf1.format(mynum1));
  System.out.println(nf2.format(mynum1));
  System.out.println(nf3.format(mynum1));
  System.out.println(nf4.format(mynum2));
 }
}
代碼輸出結果:
230,456,789
¥230,456,789.00
$230,456,789.00
23%

 關於更復雜的數字格式化,可以使用java.text.DecimalFormat進行處理,該類通過模式字符串對數字格式化。

代碼演示:DecimalFormat進行數字格式化
import java.text.DecimalFormat;
public class Demo7 {
 public static void main(String[] args) {
  int num1=1234567;
  double num2=0.126543;  
  DecimalFormat df1=new DecimalFormat("#,###");  ①
  DecimalFormat df2=new DecimalFormat("#.00");  ②
  DecimalFormat df3=new DecimalFormat("00.#");  ③
  DecimalFormat df4=new DecimalFormat("0.##E0");  ④
  DecimalFormat df5=new DecimalFormat("0.##%");  ⑤  
  System.out.println(df1.format(num1));
  System.out.println(df2.format(num2));
  System.out.println(df3.format(num2));
  System.out.println(df4.format(num1));
  System.out.println(df5.format(num2));
 }
}
代碼解析:
① #:代表一個位置數字,如果該位置數字不存在,則省略不顯示。
,:代表數字中的分隔符,此示例用三位分隔一次。
② 0:代表一個數字位置,如果該位置不存在,則用0來補充。小數中多余部分四舍五入。
.:表示小數點。
#:當前位置是0,則省略不顯示。
③ #:小數部分只顯示1位小數,並且進行四舍五入。
④ E:科學計數法。
⑤ %:用百分數表示數字。

代碼輸出結果:
1,234,567
.13
00.1
1.23E6
12.65%

4. java.util.Calendar
Calendar類是一個抽象類,它為特定的值諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日歷字段之間的轉換和操作日歷字段(例如獲得下星期的日期)提供了豐富的方法。並且可以非常方便的與Date類型進行相互轉換。

使用靜態方法getInstance()和getInstance(Locale locale)獲取Calendar對象。Calendar定義了很多表示日期時間中各個部分的常量字段。

返回值 字段 說明
static int AM  指示從午夜到中午之前這段時間的 AM_PM 字段值。
static int DATE get 和 set 的字段,指示一個月中的某天。
static int DAY_OF_MONTH get 和 set 的字段,指示一個月中的某天。
static int DAY_OF_WEEK get 和 set 的字段,指示一個星期中的某天。
static int DAY_OF_YEAR get 和 set 的字段,指示當前年中的天數。
static int HOUR get 和 set 的字段,指示上午或下午的小時。
static int HOUR_OF_DAY get 和 set 的字段,指示一天中的小時。
static int MINUTE get 和 set 的字段,指示一小時中的分鍾。
static int MONTH 指示月份的 get 和 set 的字段。
static int PM 指示從中午到午夜之前這段時間的 AM_PM 字段值。
static int SECOND get 和 set 的字段,指示一分鍾中的秒。
static int WEEK_OF_MONTH get 和 set 的字段,指示當前月中的星期數。
static int WEEK_OF_YEAR get 和 set 的字段,指示當前年中的星期數。
static int YEAR 表示年的 get 和 set 的字段。
表9  Calendar類中的日期字段

Calendar類提供了豐富的操作方法,可以單獨對年、月、日、時、分、秒等字段單獨讀取,也可以對星期設置,常用方法如下:

返回 方法 說明
void add(int field, int amount) 根據日歷的規則,為給定的日歷字段添加或減去指定的時間量。
boolean after(Object when) 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之后,返回判斷結果。
boolean before(Object when) 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之前,返回判斷結果。
int get(int field) 返回給定日歷字段的值。
int getActualMaximum(int field) 給定此 Calendar 的時間值,返回指定日歷字段可能擁有的最大值。
int getActualMinimum(int field) 給定此 Calendar 的時間值,返回指定日歷字段可能擁有的最小值。
Date getTime() 返回一個表示此 Calendar 時間值(從歷元至現在的毫秒偏移量)的 Date 對象。
long getTimeInMillis() 返回此 Calendar 的時間值,以毫秒為單位。
void set(int field, int value) 將給定的日歷字段設置為給定值。
void set(int year, int month, int date) 設置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute) 設置日歷字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second) 設置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
void setTime(Date date) 使用給定的 Date 設置此 Calendar 的時間。
void setTimeInMillis(long millis) 用給定的 long 值設置此 Calendar 的當前時間值。
表10  Calendar類常用方法

代碼演示:Calendar的使用
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class Demo8 {
 public static void main(String[] args) {
  SimpleDateFormat sdf = 
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Calendar cale = Calendar.getInstance();
  cale.set(2009, 8, 20);// 年月日同時設置  ①
  cale.set(Calendar.DAY_OF_WEEK, 2);  ②
  Date date1 = cale.getTime();  ③
  System.out.println(sdf.format(date1));  
  cale.set(Calendar.MONTH, 3);  ④
  cale.set(Calendar.DAY_OF_MONTH, 28);  ⑤
  cale.set(Calendar.YEAR, 1978);  ⑥
  Date date2 = cale.getTime();
  System.out.println(sdf.format(date2));
 }
}
代碼解析:
① 可以使用set方法對年月日時分秒同時設置。
② 把天定位到星期一,Calendar中認為第一天是星期天,設置2就是星期一。
③ Calendar類型轉換為日期時間等價的Date類型。
④ 單獨設置月。
⑤ 單獨設置日。
⑥ 單獨設置年。

代碼輸出結果:
2009-09-21 17:21:37
1978-04-28 17:21:37

  Q 老師,為什么通過Calendar設置月與輸出差1個月?
A 不是差一個月,而是在Calendar中對月份的計算是從0開始的,因此設置月份11其實就是中國的十二月。

5. Java對集合的操作
Java中學習了集合的操作,比如:排序、搜索等,Java中用java.util.Arrays對數組操作,使用java.util.Collections對集合框架中List操作。他們都是工具類,類中的方法全部都是靜態方法。

 Arrays中的方法

1. void Arrays.sort(T[]) 
對數組中的元素按照升序進行排序。T代表某一數據類型。

代碼演示:binarySearch使用
public static void main(String[] args) {
 int[] arrs=new int[]{12,54,12,8765,123,34,54,23,67};
 Arrays.sort(arrs);
 for (int i : arrs) {
  System.out.print(i+"  ");
 }
}
代碼輸出結果:
 12  12  23  34  54  54  67  123  8765  

 在sort方法中,遇到對象數組的排序時,要給對象提供排序的依據,實現Comparator接口,可以在接口的compare方法中指定排序規則,實現Comparator接口的對象稱為比較器。
 
有一個Student類的數組,現在按照年齡進行升序排序,那么Comparator接口compare方法實現如下:

代碼演示:compare重新按年齡實現
class Student {
 String name;
 int age;
 public Student(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
     public String toString() {
  return name + "," + age;
 }
}


class StuCom implements Comparator<Student> {  ①
 public int compare(Student stu1, Student stu2) {  ②
  if (stu1.age > stu2.age) {
   return 1;
  } else if (stu1.age == stu2.age) {
   return 0;
  } else {
   return -1;
  }
 }
}


public static void main(String[] args) {
 Student[] stus = new Student[] { new Student("小美", 21),
   new Student("阿聰", 22), new Student("武大郎", 28),
   new Student("阮小七", 26), new Student("晁蓋", 30),
   new Student("魯智深", 29), new Student("孫二娘", 26),
   new Student("扈三娘", 23), new Student("武松", 24) };
 Arrays.sort(stus, new StuCom());
 for (Student student : stus) {
  System.out.println(student);
 }
}
代碼解析:
① 定義一個比較器,必須實現Comparator接口,否則系統無法對一個對象數組進行搜索規則。
② 實現Comparator接口的compare方法,對該方法中的兩個參數進行比較,就是制定了比較的規則。

代碼輸出結果:
小美,21
阿聰,22
扈三娘,23
武松,24
阮小七,26
孫二娘,26
武大郎,28
魯智深,29
晁蓋,30

2. List Arrays.asList(Object[] objs)
    把指定的數組轉換為List的對象。
代碼演示:asList使用
import java.util.Arrays;
import java.util.List;

public class Demo9 {
 public static void main(String[] args) {
  String[] strs={"aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj"};
  List list=Arrays.asList(strs);
  for (int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i));
  }
 }
}

3. int Arrays.binarySearch(T[] objs, key) 
在數組objs中查找key的位置,返回key的下標,如果查找不到key,則返回負值。

int Arrays.binarySearch(T[] objs,int fromIndex,int toIndex , key)
在數組objs中從fromIndex到toIndex位置上查找key,返回key的下標,如果查找不到,返回一個負值。

在binarySearch方法調用之前一定要保證數組已經是排序的,如果沒有排序,可以使用Arrays.sort(T[]) 進行排序,然后再進行查找。

代碼演示:binarySearch使用
public static void main(String[] args) {

 String[] strs={"aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj"};
 Arrays.sort(strs);
 System.out.println(Arrays.binarySearch(strs, "ccc"));
 System.out.println(Arrays.binarySearch(strs, 4,8,"ggg"));
 System.out.println(Arrays.binarySearch(strs, 4,8,"aaa"));
}

 如果數組是一個自定義的對象數組,那么搜索之前要先指定比較器。

代碼演示:binarySearch搜索對象使用
class StuCom implements Comparator<Student> {  ①
 public int compare(Student stu1, Student stu2) {  
  if (stu1.age > stu2.age) {
   return 1;
  } else if (stu1.age == stu2.age && stu1.name.equals(stu2.name)) {
   return 0;
  } else {
   return -1;
  }
 }
}

public static void main(String[] args) {

 Student[] stus = new Student[] { new Student("小美", 21),
   new Student("阿聰", 22), new Student("武大郎", 28),
   new Student("阮小七", 26), new Student("晁蓋", 30),
   new Student("魯智深", 29), new Student("孫二娘", 26),
   new Student("扈三娘", 23), new Student("武松", 24) };
 Student s = new Student("晁蓋", 30);
 System.out.println(Arrays.binarySearch(stus, s, new StuCom()));  ②
}
代碼解析:
① 該比較器規定了要比較的類型就是Student類型,因此這里使用泛型。
② 指定了對象數組,對象和比較器的方法進行搜索。結果返回搜索到的對象在數組中的下標。

 除了上面介紹Arrays的方法外,還有一些其它的方法:

方法 說明
T[] copyOf(T[] t,int length) 把一個數組賦值到長度是length的新數組中。T表示數據類型。
fill(T[] t,N newValue) 用一個固定值填充數組中所有元素。
表11 Arrays其他常用方法。

 Collections類

Collections類與Arrays類一樣都提供了一系列的靜態方法,只是Arrays主要操作數組,而Collections主要操作List集合,同時還有對Set的相關操作。

代碼演示:Collections操作
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo10 {

 static class Student implements Comparable {  ①
  String name;
  int age;
  public Student(String name, int age) {
   super();
   this.name = name;
   this.age = age;
  }
  public String toString() {
   return name + "," + age;
  }
  public int compareTo(Object o) {  ②
   Student stu = (Student) o;
   if (this.age > stu.age) {
    return 1;
   } else if (this.age == stu.age && this.name.equals(stu.name)) {
    return 0;
   } else {
    return -1;
   }
  }
 }

 public static void main(String[] args) {
  List<Student> list = new ArrayList<Student>();
  Student[] stus = new Student[] { new Student("小美", 21),
    new Student("阿聰", 22), new Student("武大郎", 28),
    new Student("阮小七", 26), new Student("晁蓋", 30),
    new Student("魯智深", 29), new Student("孫二娘", 26),
    new Student("扈三娘", 23), new Student("武松", 24) };

  Collections.addAll(list, stus);  ③
  Collections.sort(list);  ④

  for (Student student : stus) {
   System.out.println(student);
  }
  Student stu = new Student("魯智深", 29);
  int pos = Collections.binarySearch(list, stu);  ⑤
  System.out.println(pos);
 }
}
代碼解析:
① 在List中查找一個對象時,該對象必須實現Comparable接口。
② compareTo方法中使用當前對象與參數對象進行比較。
③ 把一個數組對象復制到List對象中用方法Collections.addAll(……)方法
④ 對List集合中的元素按照自然順序排序。
⑤ 二分法查找,在List集合中查找Student對象,要求Student對象必須實現Comparable接口。
 
Collections的主要操作有:

1. int binarySearch(List&lt;? extends Comparable&lt;? super T>> list, T key)
該方法是尋找T對象在List中匹配元素的位置。要求List集合中必須全部都是T對象,T對象必須實現Comparable接口,如果查找成功返回對象在List中的位置,否則返回負數。該方法執行前首先要對List對象中的元素排序,該方法還有一個重載方法是:

int binarySearch(List&lt;? extends T> list, T key, Comparator&lt;? super T> c)
 該方法也是查找T對象在List中的位置,List集合中必須全部是T元素,但是不要去T必須實現Comparable接口,而是要求傳入一個比較器。

2. sort(List<T> list)
對List中的元素按照自然排序。要按照用戶自定義方式進行排序,必須實現Comparator接口。

sort (List<T> list, Comparator&lt;? super T> c) 根據指定比較器產生的順序對指定列表進行排序。

3. swap(List&lt;?&gt; list, int i, int j) 
在指定列表的指定位置處交換元素。

4. reverse(List&lt;?&gt; list)
反轉指定列表中元素的順序。

在Collections中還有其他一些方法,可以參考JavaDoc文檔。

6. java.lang.Math類
在java.lang.Math類中,包含用於執行基本數學運算的方法,如指數、對數、平方根和三角函數等。Math類中定義的所有方法和常量全部都是靜態的,使用非常方便。定義的常量主要有兩個:Math.E和Math.PI分別表示自然對數的底數和圓周率。

Math類中主要的方法有:


返回 方法 說明
static T abs(T a) 返回 long 值的絕對值。
static double acos(double a) 返回一個值的反余弦;返回的角度范圍在 0.0 到 pi 之間。
static double atan(double a) 返回一個值的反正切;返回的角度范圍在 -pi/2 到 pi/2 之間。
static double ceil(double a) 返回最小的(最接近負無窮大)double 值,該值大於等於參數,並等於某個整數。
static double cos(double a) 返回角的三角余弦。
static double floor(double a) 返回最大的(最接近正無窮大)double 值,該值小於等於參數,並等於某個整數。
static double log(double a) 返回 double 值的自然對數(底數是 e)。
static double log10(double a) 返回 double 值的底數為 10 的對數。
static T max(T a, T b) 返回兩個 double 值中較大的一個。
static T min(T a, T b) 返回兩個 long 值中較小的一個。
static T pow(T a, T b) 返回第一個參數的第二個參數次冪的值。
static double random() 返回帶正號的 double 值,該值大於等於 0.0 且小於 1.0。
static int round(float a) 返回最接近參數的 int。
static double sin(double a) 返回角的三角正弦。
static double sqrt(double a) 返回正確舍入的 double 值的正平方根。
static double tan(double a) 返回角的三角正切。
表12  Math類中的常見靜態方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM