天天看點

Collections總結

比較器

package aaa;

import java.util.Comparator;

public class ComparatorByLength implements Comparator<String> {

        public int compare(String o1, String o2) {

                 String s1 = (String) o1;

                 String s2 = (String) o2;

                 int temp = s1.length() - s2.length();

                 return temp == 0 ? s1.compareTo(s2) : temp;

        }

}

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.TreeSet;

public class ListDemo {

        public static void main(String[] args) {

                 // TODO Auto-generated method stub

                 demo_1();

                 demo_2();

                 demo_3();

                  Demo4();

        public static void Demo4() {

                 List<String> list = new ArrayList<String>();

                 list.add("abcde");

                 list.add("cba");

                 list.add("zhangsan");

                 list.add("zhaoliu");

                 list.add("xiaoqiang");

                 System.out.println(list);

                 Collections.replaceAll(list, "cba", "NBA");// 原理set(indexOf("cba"),"nba");

                 Collections.shuffle(list);//使用指定的随機源對指定清單進行置換。

                 Collections.fill(list, "cc");//将list中的所有元素替換沖cc,此方法用做集合的初始化

        public static void demo_3() {

                 // 通過比較器實作倒序排列

                 TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {

                         @Override

                         public int compare(String o1, String o2) {

                                  int temp = o2.compareTo(o1);

                                  return temp;

                         }

                 });

                 ts.add("abc");

                 ts.add("hahaha");

                 ts.add("zzz");

                 ts.add("aa");

                 ts.add("cba");

                 System.out.println(ts);

                 // 利用工具類中的方法實作翻轉排序,排序規則按照比較器。

                 TreeSet<String> ts1 = new TreeSet<String>(

                                  Collections.reverseOrder(new ComparatorByLength()));

                 ts1.add("abc");

                 ts1.add("hahaha");

                 ts1.add("zzz");

                 ts1.add("aa");

                 ts1.add("cba");

                 System.out.println(ts1);

        /**

         * 集合工具類排序

         */

        public static void demo_1() {

                 list.add("aa");

                 list.add("zzz");

                 list.add("nbaa");

                 Collections.sort(list);

                 mySort(list);// Collections.sort(list)實作原理

                 Collections.sort(list, new ComparatorByLength());

                 mySort(list, new ComparatorByLength());

        public static <T> void mySort(List<T> list, Comparator<? super T> comp) {

                 for (int i = 0; i < list.size() - 1; i++) {

                         for (int j = i + 1; j < list.size(); j++) {

                                  if (comp.compare(list.get(i), list.get(j)) > 0) {

                                           Collections.swap(list, i, j);

                                  }

                 }

         * @param list

         *            Collections.sort(list)實作的原理, T extends Comparable<? super

         *            T>的意思是,所有實作Comparable的接口的類型或者父類實作Comparable接口的類型

        public static <T extends Comparable<? super T>> void mySort(List<T> list) {

                                  if (list.get(i).compareTo(list.get(j)) > 0) {

                                           Collections.swap(list, i, j);// 交換位置

        public static void demo_2() {

                 int index = Collections.binarySearch(list, "cba");

                 System.out.println("index=" + index);

                 String max = Collections.max(list, new ComparatorByLength());

                 System.out.println("max=" + max);

java.util.Arrays類能友善地操作數組,它提供的所有方法都是靜态的。具有以下功能:

給數組指派:通過fill方法。

對數組排序:通過sort方法,按升序。

比較數組:通過equals方法比較數組中元素值是否相等。

查找數組元素:通過binarySearch方法能對排序好的數組進行二分查找法操作。

import java.util.Arrays;

public class TestArrays {

public static void output(int[] array) {

if (array!=null) {

for (int i = 0; i < array.length; i++) {

System.out.print(array[i]+" ");

System.out.println();

public static void main(String[] args) {

int[] array = new int[5];

//填充數組

Arrays.fill(array, 5);

System.out.println("填充數組:Arrays.fill(array, 5):");

TestArrays.output(array);

//将數組的第2和第3個元素指派為8

Arrays.fill(array, 2, 4, 8);

System.out.println("将數組的第2和第3個元素指派為8:Arrays.fill(array, 2, 4, 8):");

int[] array1 = {7,8,3,2,12,6,3,5,4};

//對數組的第2個到第6個進行排序進行排序

Arrays.sort(array1,2,7);

System.out.println("對數組的第2個到第6個元素進行排序進行排序:Arrays.sort(array,2,7):");

TestArrays.output(array1);

//對整個數組進行排序

Arrays.sort(array1);

System.out.println("對整個數組進行排序:Arrays.sort(array1):");

//比較數組元素是否相等

System.out.println("比較數組元素是否相等:Arrays.equals(array, array1):"+"\n"+Arrays.equals(array, array1));

int[] array2 = array1.clone();

System.out.println("克隆後數組元素是否相等:Arrays.equals(array1, array2):"+"\n"+Arrays.equals(array1, array2));

//使用二分搜尋算法查找指定元素所在的下标(必須是排序好的,否則結果不正确)

System.out.println("元素3在array1中的位置:Arrays.binarySearch(array1, 3):"+"\n"+Arrays.binarySearch(array1, 3));

//如果不存在就傳回負數

System.out.println("元素9在array1中的位置:Arrays.binarySearch(array1, 9):"+"\n"+Arrays.binarySearch(array1, 9));

輸出結果:

填充數組:Arrays.fill(array, 5):5 5 5 5 5

将數組的第2和第3個元素指派為8:Arrays.fill(array, 2, 4, 8):5 5 8 8 5

對數組的第2個到第6個元素進行排序進行排序:Arrays.sort(array,2,7):

7 8 2 3 3 6 12 5 4

對整個數組進行排序:Arrays.sort(array1):2 3 3 4 5 6 7 8 12

比較數組元素是否相等:Arrays.equals(array, array1):

false

克隆後數組元素是否相等:Arrays.equals(array1, array2):true

元素3在array1中的位置:Arrays.binarySearch(array1, 3):1

元素9在array1中的位置:Arrays.binarySearch(array1, 9):-9

将數組轉成List集合

public class ArraysDemo {

  public static void main(String[] args) {

          demo_1();

          demo_2();

  }

  /**

   * Arrays.asList方法将數組轉化成List集合

   */

  public static void demo_1()

  {/*

           * 重點:List asList(數組)将數組轉成集合。

           * 好處:其實可以使用集合的方法操作數組中的元素。

           * 注意:數組的長度是固定的,是以對于集合的增删方法是不可以使用的

           * 否則會發生UnsupportedOperationException

           */

          String[] arrStrings={"abc","haha","xixi"};

          List<String> list=Arrays.asList(arrStrings);

          boolean b1=list.contains("xixi");

          //list.add("hehe");//UnsupportedOperationException

          System.out.println("list contains="+b1);

  public static void demo_2()

  {

          /*

           * 如果數組中的元素是對象,那麼轉成集合時,直接将數組中的元素作為集合中的元素進行集合存儲。

  * 如果數組中的元素是基本類型數值,那麼會将該數組作為集合中的元素進行存儲。

          Integer[] arrIntegers={12,32,434,55,67,87};//

          List<Integer> list=Arrays.asList(arrIntegers);

          System.out.println(list);//輸出結果:[12, 32, 434, 55, 67, 87]

          int[] arr={31,11,51,61};

          List<int[]> list1=Arrays.asList(arr);

          System.out.println(list1.toString());//輸出結果:[[I@154ab8e4]

集合轉成數組

public class ToArray {

           * 集合轉成數組呢?

           * 使用的就是Collection接口中的toArray方法。

           * 集合轉成數組:可以對集合中的元素操作的方法進行限定。不允許對其進行增删。

          List<String> list = new ArrayList<String>();

          list.add("abc1");

          list.add("abc2");

          list.add("abc3");

           * toArray方法需要傳入一個指定類型的數組。

           * 長度該如何定義呢?

           * 如果長度小于集合的size,那麼該方法會建立一個同類型并和集合相同size的數組。

           * 如果長度大于集合的size,那麼該方法就會使用指定的數組,存儲集合中的元素,其他位置預設為null。

           * 是以建議,最後長度就指定為,集合的size。

          String[] arrStrings=list.toArray(new String[list.size()]);

          System.out.println(Arrays.toString(arrStrings));//輸出結果:[abc1, abc2, abc3]

1、格式:

for(類型  變量   :Collection集合|數組)

        {      

等同于C#中的foreach

2、傳統for和進階for的差別?

 傳統for可以完成對語句執行很多次,因為可以定義控制循環的增量和條件。

進階for是一種簡化形式。

它必須有被周遊的目标。該目标要是數組,要麼是Collection單列集合。

對數數組的周遊如果僅僅是擷取數組中的元素,可以使用進階for。

如果要對數組的角标進行操作建議使用傳統for。

import java.util.LinkedHashMap;

import java.util.Map;

public class ForEachDemo {

   public static void main(String[] args) {

       List<String> list = new ArrayList<String>();

       list.add("abc1");

       list.add("abc2");

       list.add("abc3");

       for (String s:list) {//簡化書寫

           System.out.println(s);

       }

       int[] arr={2,3,3,4};

       for (int i :arr) {

           System.out.println(i);

       Map<Integer, String> map=new LinkedHashMap<Integer,String>();

       map.put(3, "zhangsan");

       map.put(2,"wangyi");

       map.put(7,"wangwu");

       map.put(4, "zhangsansan");

       for (Integer key:map.keySet()) {

           String valueString=map.get(key);

           System.out.println(key+"::"+valueString);

       for(Map.Entry<Integer, String> me:map.entrySet())

       {

           Integer keyInteger=me.getKey();

           String valString=me.getValue();

           System.out.println(keyInteger+":"+valString);

   }

abc1

abc2

abc3

2

3

4

3::zhangsan

2::wangyi

7::wangwu

4::zhangsansan

3:zhangsan

2:wangyi

7:wangwu

4:zhangsansan

package cn.itcast.p4.news.demo;

public class ParamterDemo {

   /**

    * @param args

    */

            int sum = newAdd(5,1,4,7,3);

            System.out.println("sum="+sum);

            int sum1 = newAdd(5,1,2,7,3,9,8,7,6);

            System.out.println("sum1="+sum1);

   /*

    * 函數的可變參數。

    * 其實就是一個數組,但是接收的是數組的元素。

    * 自動将這些元素封裝成數組。簡化了調用者的書寫。

    * 注意:可變參數類型,必須定義在參數清單的結尾。

   public static int newAdd(int a,int...  arr){

            int sum = 0;

            for (int i = 0; i < arr.length; i++) {

                     sum+=arr[i];

            }

            return sum;

import static java.util.Collections.*;//靜态導入,其實到入的是類中的靜态成員。

import static java.lang.System.*;

public class StaticImportDemo {

            List<String> list = new ArrayList<String>();

            list.add("abc3");

            list.add("abc7");

            list.add("abc1");

            out.println(list);

            sort(list);//靜态導入之後,就不用寫Collections

            System.out.println(list);

            String max = max(list);

            System.out.println("max="+max);

[abc1, abc3, abc7]

max=abc7

import java.util.Properties;

import java.util.Set;

public class SystemDemo {

        private static final String LINE_SEPARATOR = System

                         .getProperty("line.separator");// 擷取換行符,不同的系統,換行符是不一樣的。需要根據屬性來擷取,要不然可能出現不相容的現象

        private static void demo_2() {

                 /*

                  * System:類中的方法和屬性都是靜态的。

                  * 常見方法: long currentTimeMillis();擷取目前時間的毫秒值。

                  */

                 long l2 = System.currentTimeMillis();

                 System.out.println(l2);// 輸出的結果是目前時間的毫秒值

                 System.out.println("hello-"+LINE_SEPARATOR+" world");//換行

         * 擷取所有的屬性

        private static void demo_1() {

                 // 擷取系統的屬性資訊,并存儲到了Properties集合中。

                  * properties集合中存儲都是String類型的鍵和值。 最好使用它自己的存儲和取出的方法來完成元素的操作。

                 Properties properties = System.getProperties();

                 Set<String> namSet = properties.stringPropertyNames();

                 for (String string : namSet) {

                         String valueString = properties.getProperty(string);

                         System.out.println(string + "::" + valueString);

在java中Runtime類表示運作時操作類,是一個封裝了JVM程序的類,每一個JVM都對應着一個Runtime類的執行個體,此執行個體由JVM運作時為其執行個體化。是以在JDK文檔中讀者不會發現任何有關Runtime類中構造方法的定義,這是因為Runtime類本身的構造方法是私有化的(單例設計),如果想要得到一個Runtime執行個體,隻有以下方法:

Runtime run=Runtime.getRuntime();

也就是說在Runtime類中提供了一個靜态的getRuntime()方法,此類可以取得Runtime類的執行個體,然後通過Runtime就可以取得一些系統的資訊。如,getRuntime(),取得Runtime執行個體;freeMemory()傳回java虛拟機中的空閑記憶體量;maxMemory()傳回JVM的最大記憶體量;gc()運作垃圾回收器,釋放空間;exec(command)執行本機指令。

import java.io.IOException;

public class RuntimeDemo {

        public static void main(String[] args) throws IOException,

                         InterruptedException {

                 Runtime runtime = Runtime.getRuntime();

                 Process p = runtime.exec("notepad.exe");

                 Thread.sleep(5000);

                 p.destroy();// 銷毀程序

                 runtime.gc();// 垃圾回收

                 runtime.exec("notepad.exe c:\\RuntimeDemo.java");//用notepad.exe打開RuntimeDemo檔案

import java.util.Random;

public class MathDemo {

      // TODO Auto-generated method stub

      /*

       * Math:提供了操作數學運算的方法。都是靜态的。

       * 常用的方法:

       * ceil():傳回大于參數的最小整數。

       * floor():傳回小于參數的最大整數。

       * round():傳回四舍五入的整數。

       * pow(a,b):a的b次方。

       */

      double d1 = Math.ceil(12.56);

      double d2 = Math.floor(12.56);

      double d3 = Math.round(12.46);

      sop("d1="+d1);

      sop("d2="+d2);

      sop("d3="+d3);

      double d = Math.pow(10, 2);

       sop("d="+d);

       //第一種  輸出1到10 的随機數

       for (int i = 0; i < 10; i++) {

          double d4=(int)(Math.random()*10+1);

          System.out.println(d4);

      }

       //第二種  輸出1到10 的随機數

       Random random=new Random();              

      double d5=(int)(random.nextDouble()*10+1);

      System.out.println(d5);

      int d6=random.nextInt(10)+1;

      System.out.println(d6);

   public static void sop(String string) {

      System.out.println(string);

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateDemo {

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

         * 将日期格式的字元串-->日期對象。

         *   使用的是DateFormat類中的parse()方法。

         * @throws ParseException

        private static void demo_3() throws ParseException {

                 String str_Date = "2015年4月12日";

                 DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);

                 Date date = dateFormat.parse(str_Date);

                 System.out.println(date);

                 //自定義格式轉換為日期對象

                 str_Date="2015---08--12";

                 dateFormat=new SimpleDateFormat("yyyy---MM--dd");

                 date=dateFormat.parse(str_Date);

         * 對日期對象進行格式化。 将日期對象-->日期格式的字元串。 使用的是DateFormat類中的format方法。

                 Date date = new Date();

                 DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);// 格式化日期

                 System.out.println(dateFormat.format(date));

                 dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,

                                  DateFormat.LONG);// 格式化日期和時間

                 // 自定義風格

                 dateFormat = new SimpleDateFormat("yyyy--MM--dd");

                 String stringDate = dateFormat.format(date);

                 System.out.println(stringDate);

         * 日期對象和毫秒值之間的轉換。

         *

         * 毫秒值-->日期對象 : 1,通過Date對象的構造方法 new Date(timeMillis); 2,還可以通過setTime設定。

         * 因為可以通過Date對象的方法對該日期中的各個字段(年月日等)進行操作。 日期對象-->毫秒值: 2,getTime方法。

         * 因為可以通過具體的數值進行運算。

                 Date date = new Date();// 将目前日期和時間封裝成Date對象。

                 System.out.println(date);// Sun Apr 29 11:48:02 CST 2012

                 long time = System.currentTimeMillis();

                 Date date1 = new Date(time);

                 System.out.println(date1);

練習: "2012-3-17"到"2012-4-6"中間有多少天?

/*

* 思路:兩個日期相減就哦了。

* 咋減呢?必須要有兩個可以進行減法運算的數。

* 能減可以是毫秒值。如何擷取毫秒值?通過date對象。

* 如何擷取date對象呢?可以将字元串轉成date對象。

* 1,将日期格式的字元串轉成Date對象。2,将Date對象轉成毫秒值。3,相減,在變成天數

*/

public class DateTest {

                 String str_date1 = "2012-3-17";

                 String str_date2 = "2012-4-18";

                 test(str_date1,str_date2);

        public static void test(String str_date1,String str_date2) throws ParseException {

                 DateFormat dateFormat = DateFormat.getDateInstance();//定義日期格式對象。

                 dateFormat = new SimpleDateFormat("yyyy-MM-dd");

                 Date date1 = dateFormat.parse(str_date1); //1,将日期字元串轉成日期對象。

                 Date date2 = dateFormat.parse(str_date2);

                 long time1 = date1.getTime();

                 long time2 = date2.getTime();

                 long time = Math.abs(time1-time2);

                 int day = getDay(time);

                 System.out.println(day);

        private static int getDay(long time) {

                 int day = (int)(time/1000/60/60/24);

                 return day;

從JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實作。在設計上,Calendar類的功能要比Date類強大很多,而且在實作方式上也比Date類要複雜一些,下面就介紹一下Calendar類的使用。

Calendar類是一個抽象類,在實際使用時實作特定的子類的對象,建立對象的過程對程式員來說是透明的,隻需要使用getInstance方法建立即可。

1、使用Calendar類代表目前時間

                  Calendar c = Calendar.getInstance();

由于Calendar類是抽象類,且Calendar類的構造方法是protected的,是以無法使用Calendar類的構造方法來建立對象,API中提供了getInstance方法用來建立對象。

使用該方法獲得的Calendar對象就代表目前的系統時間,由于Calendar類toString實作的沒有Date類那麼直覺,是以直接輸出Calendar類的對象意義不大。

2、使用Calendar類代表指定的時間

                  Calendar c1 = Calendar.getInstance();

                  c1.set(2009, 3 - 1, 9);

使用Calendar類代表特定的時間,需要首先建立一個Calendar的對象,然後再設定該對象中的年月日參數來完成。

set方法的聲明為:

        public final void set(int year,int month,int date)

以上示例代碼設定的時間為2009年3月9日,其參數的結構和Date類不一樣。Calendar類中年份的數值直接書寫,月份的值為實際的月份值減1,日期的值就是實際的日期值。

如果隻設定某個字段,例如日期的值,則可以使用如下set方法:

        public void set(int field,int value)

在該方法中,參數field代表要設定的字段的類型,常見類型如下:

        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——星期幾

後續的參數value代表,設定成的值。例如:

        c1.set(Calendar.DATE,10);

該代碼的作用是将c1對象代表的時間中日期設定為10号,其它所有的數值會被重新計算,例如星期幾以及對應的相對時間數值等。

3、獲得Calendar類中的資訊

                  Calendar c2 = Calendar.getInstance();

                  int year = c2.get(Calendar.YEAR); //年份

                  int month = c2.get(Calendar.MONTH) + 1; //月份

                  int date = c2.get(Calendar.DATE); //日期

                  int hour = c2.get(Calendar.HOUR_OF_DAY); //小時

                  int minute = c2.get(Calendar.MINUTE); //分鐘

                  int second = c2.get(Calendar.SECOND);   //秒

                  int day = c2.get(Calendar.DAY_OF_WEEK); //星期幾

                  System.out.println("年份:" + year);

                  System.out.println("月份:" + month);

                  System.out.println("日期:" + date);

                  System.out.println("小時:" + hour);

                  System.out.println("分鐘:" + minute);

                  System.out.println("秒:" + second);

                  System.out.println("星期:" + day);

使用Calendar類中的get方法可以獲得Calendar對象中對應的資訊,get方法的聲明如下:public int get(int field)

其中參數field代表需要獲得的字段的值,字段說明和上面的set方法保持一緻。需要說明的是,獲得的月份為實際的月份值減1,獲得的星期的值和Date類不一樣。在Calendar類中,周日是1,周一是2,周二是3,依次類推。

4、其它方法說明

其實Calendar類中還提供了很多其它有用的方法,下面簡單的介紹幾個常見方法的使用。

a、add方法:public abstract void add(int field,int amount)

該方法的作用是在Calendar對象中的某個字段上增加或減少一定的數值,增加是amount的值為正,減少時amount的值為負。

        例如在計算一下目前時間100天以後的日期,代碼如下:

                  Calendar c3 = Calendar.getInstance();

                  c3.add(Calendar.DATE, 100);

                  int year1 = c3.get(Calendar.YEAR);

                  int month1 = c3.get(Calendar.MONTH) + 1; //月份

                  int date1 = c3.get(Calendar.DATE); //日期

                  System.out.println(year1 + "年" + month1 + "月" + date1 + "日");

這裡add方法是指在c3對象的Calendar.DATE,也就是日期字段上增加100,類内部會重新計算該日期對象中其它各字段的值,進而獲得100天以後的日期,例如程式的輸出結果可能為: 2009年6月17日

b、after方法:public boolean after(Object when)

該方法的作用是判斷目前日期對象是否在when對象的後面,如果在when對象的後面則傳回true,否則傳回false。例如:

                  Calendar c4 = Calendar.getInstance();

                  c4.set(2009, 10 - 1, 10);

                  Calendar c5 = Calendar.getInstance();

                  c5.set(2010, 10 - 1, 10);

                  boolean b = c5.after(c4);

                  System.out.println(b);

在該示例代碼中對象c4代表的時間是2009年10月10号,對象c5代表的時間是2010年10月10号,則對象c5代表的日期在c4代表的日期之後,是以after方法的傳回值是true。另外一個類似的方法是before,該方法是判斷目前日期對象是否位于另外一個日期對象之前。

                  c、getTime方法:public final Date getTime()

該方法的作用是将Calendar類型的對象轉換為對應的Date類對象,兩者代表相同的時間點。

類似的方法是setTime,該方法的作用是将Date對象轉換為對應的Calendar對象,該方法的聲明如下:public final void setTime(Date date)

轉換的示例代碼如下:

                 Date d = new Date();

                  Calendar c6 = Calendar.getInstance();

                   Date d1 = c6.getTime();     //Calendar類型的對象轉換為Date對象

                    Calendar c7 = Calendar.getInstance();

                  c7.setTime(d); //Date類型的對象轉換為Calendar對象

        5、Calendar對象和相對時間之間的互轉

                           Calendar c8 = Calendar.getInstance();

                           long t = 1252785271098L;

                              long t1 = c8.getTimeInMillis();    //将Calendar對象轉換為相對時間

                            Calendar c9 = Calendar.getInstance();

                           c9.setTimeInMillis(t1); //将相對時間轉換為Calendar對象

在轉換時,使用Calendar類中的getTimeInMillis方法可以将Calendar對象轉換為相對時間。在将相對時間轉換為Calendar對象時,首先建立一個Calendar對象,然後再使用Calendar類的setTimeInMillis方法設定時間即可。

應用示例

        下面以兩個簡單的示例介紹時間和日期處理的基本使用。

        1、計算兩個日期之間相差的天數

例如計算2010年4月1号和2009年3月11号之間相差的天數,則可以使用時間和日期處理進行計算。

該程式實作的原理為:首先代表兩個特定的時間點,這裡使用Calendar的對象進行代表,然後将兩個時間點轉換為對應的相對時間,求兩個時間點相對時間的內插補點,然後除以1天的毫秒數(24小時X60分鐘X60秒X1000毫秒)即可獲得對應的天數。實作該示例的完整代碼如下:

        import java.util.*;

/**

* 計算兩個日期之間相差的天數

*/

public class DateExample1 {

                  //設定兩個日期

                      Calendar c1 = Calendar.getInstance();

                   c1.set(2009, 3 - 1, 11); //日期:2009年3月11号

                     Calendar c2 = Calendar.getInstance();

                  c2.set(2010, 4 - 1, 1);    //日期:2010年4月1号

                  //轉換為相對時間

                  long t1 = c1.getTimeInMillis();

                  long t2 = c2.getTimeInMillis();

                   long days = (t2 - t1)/(24 * 60 * 60 * 1000); //計算天數

                  System.out.println(days);

        2、輸出目前月的月曆

該示例的功能是輸出目前系統時間所在月的月曆,例如目前系統時間是2009年3月10日,則輸出2009年3月的月曆。

該程式實作的原理為:首先獲得該月1号是星期幾,然後獲得該月的天數,最後使用流程控制實作按照月曆的格式進行輸出即可。即如果1号是星期一,則列印一個機關的空格,如果1号是星期二,則列印兩個機關的空格,依次類推。列印完星期六的日期以後,進行換行。實作該示例的完整代碼如下:

public class DateExample2{

        public static void main(String[] args){

                  //獲得目前時間

                  c.set(Calendar.DATE,1);   //設定代表的日期為1号

                  int start = c.get(Calendar.DAY_OF_WEEK); //獲得1号是星期幾

      int maxDay = c.getActualMaximum(Calendar.DATE); //獲得目前月的最大日期數

                  //輸出标題

           System.out.println("星期日 星期一 星期二 星期三 星期四 星期五   星期六");

                  //輸出開始的空格

                  for(int i = 1;i < start;i++){

                           System.out.print("      ");

                  }

                  //輸出該月中的所有日期

                  for(int i = 1;i <= maxDay;i++){

                             System.out.print(" " + i);    //輸出日期數字

                             System.out.print("     "); //輸出分隔空格

                           if(i < 10){System.out.print(' ');}

                           //判斷是否換行

                           if((start + i - 1) % 7 == 0){  System.out.println();   }

                   System.out.println();       //換行

        }      

package cn.itcast.p1.otherapi;

import java.util.Calendar;

public class CalendarDemo {

                 Calendar c = Calendar.getInstance();

                 int year = 2012;

                 showDays(year);

//求二月份有多少天,思路:三月份第一天減一得到二月最後一天的天數

        public static void showDays(int year) {

                 c.set(year, 2, 1);

                 c.add(Calendar.DAY_OF_MONTH, -1);

                 showDate(c);

//擷取Calendar對象的時間屬性

        public static void showDate(Calendar c) {

                 int year = c.get(Calendar.YEAR);

                 int month = c.get(Calendar.MONTH)+1;

                 int day = c.get(Calendar.DAY_OF_MONTH);

                 int week = c.get(Calendar.DAY_OF_WEEK);

                 System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));

        public static String getWeek(int i) {

                 String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

                 return weeks[i];