1. 程式人生 > >包裝類.String.Math.Date.排序

包裝類.String.Math.Date.排序

1、為什麼需要包裝類

Java並不是純面向物件的語言。(中庸、效率)Java語言是一個面向物件的語言,但是Java中的基本資料型別卻是不面向物件的。但是我們
在實際使用中經常需要將基本資料型別轉化成物件,便於操作。比如:集合的操作,使用Object型別接收任意型別的資料等,這時,我
們就需要將基本資料型別資料轉化為物件。

2、包裝類

包裝類均位於java.lang包,包裝類和基本資料型別的對應關係:

3、自動裝箱(auto_boxing)與自動拆箱(unboxing)

JDK1.5之前需要手動裝箱與拆箱,JDK1.5之後支援自動裝箱與自動拆箱。

自動裝箱

基本資料型別就自動的封裝到與它相同型別的包裝中,如:

Integer i = 100;

本質上是,編譯器編譯時為我們添加了:

Integer i = new Integer(100);

自動拆箱

包裝類物件自動轉換成基本型別資料。如:

int a = new Integer(100);

本質上,編譯器編譯時為我們添加了:

int a = new Integer(100).intValue();

4、包裝類的作用

(1)資料型別的範圍

MIN_VALUE、MAX_VALUE

Float和Double中還有正無窮大POSITIVE_INFINITY、負無窮大NEGATIVE_INFINITY,還有

NaN,是Not a Number的縮寫。NaN 用於處理計算中出現的錯誤情況,比如 0.0 除以 0.0 或者求負數的平方根。

程式設計師可以利用這種定製的 NaN 值中的特定位模式來表達某些診斷資訊。

(2)資料型別的轉換

1、字串轉成包裝類物件:

(1)使用包裝型別的構造方法

除了Character型別,其他7中型別都有1個構造方法,其引數是字串型別

例如:

Integer t2=new Integer("500");//引數是字串,字串的值是必須對應的數值

Integer t3=new Integer("abc");// java.lang.NumberFormatException: For input string: "abc"

(2)使用包裝類的valueOf方法

例如:Integer i=Integer.valueOf("500");

2、字串轉成基本資料型別

(1)通過包裝類的parseXxx(String s)靜態方法

例如:int i=Integer.parseInt("500");

(3)包裝類的其他方法

1、Integer型別

public static String toBinaryString(int i)  //把十進位制轉成二進位制

public static String toHexString(int i)     //把十進位制轉成十六進位制

public static String toOctalString(int i)   //把十進位制轉成八進位制



2、Character型別

public static char toUpperCase(char ch)  //轉成大寫字母

public static char toLowerCase(char ch)  //轉成小寫字母

其他的檢視相關API文件即可

3、equals

按照包裝的基本資料型別的值比較

4、compareTo

按照包裝的基本資料型別的值比較

5、快取問題

我們在程式設計時大量需要值在-128到127範圍之間的Integer物件。如果只能通過new來建立,需要在堆中開闢大量值一樣的Integer物件。
這是相當不划算的,IntegerCache.cache很好的起到了快取的作用。

快取

byte Byte -128–127

short Short -128–127

int Integer -128—127

long Long -128—127

float Float 不快取

double Double 不快取

char Character 0–127

boolean Boolean TURE,FALSE

字串String類

字串String類的概述
String 類代表字串。Java 程式中的所有字串字面值(如 "abc" )都作為此類的例項實現。 
字串是常量;它們的值在建立之後不能更改。字串緩衝區支援可變的字串。因為 String 物件是不可變的,所以可以共享。例如: 
     String str = "abc";
 等效於: 
     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

Java字串就是Unicode字元序列,例如串“Java”就是4個Unicode字元J、a、v、a組成的。
Java沒有內建的字串型別,而是在標準Java類庫中提供了一個預定義的類String,
每個用雙引號括起來的字串都是String的一個例項。

字串String類的特點

1、String是個final類

2、String是不可變的字元序列
private意味著外面無法直接獲取字元陣列、final意味著字元陣列的引用不可改變。
但是因為String也沒有提供修改value陣列某元素值的途徑,因此字串的字元陣列內容也不可變了。

String物件的建立

String  s1 = new String();   //  本質上  this.value = new char[0];

String  s2 = new String(String original);  //this.value = original.value;

String  s3 = new String(char[] a);  //this.value = Arrays.copyOf(value, value.length);

String  s4 = new String(char[] a,int startIndex,int count)

.......

可變字元序列:字串緩衝區

一個類似於 String 的字串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,
但通過某些方法呼叫可以改變該序列的長度和內容。
沒有final宣告,count記錄有效字元的個數。
StringBuilder:執行緒安全,效率低
StringBuffer:執行緒不安全,效率高
常用方法:
1、StringBuffer的構造方法
StringBuffer()   初始容量為16的字串緩衝區
StringBuffer(int size)   構造指定容量的字串緩衝區
StringBuffer(String str)  將內容初始化為指定字串內容

日期時間類

1、java.lang.System類

System類提供的public static long currentTimeMillis()用來返回當前時間與
1970年1月1日0時0分0秒GMT之間以毫秒為單位的時間差。此方法適於計算時間差。

2、java.util.Date

它的物件表示一個特定的瞬間,精確到毫秒。

Java中時間的表示說白了也是數字,是從標準紀元1970年1月1日0時0分0秒GMT到某個時刻的毫秒數,型別是long

理解:一維的時間軸,選擇1970年1月1日0時0分0秒時間為0刻度,1毫秒一刻度

構造方法:

Date():      原始碼:this(System.currentTimeMillis());

Date(long date)

常用方法:

getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 物件表示的毫秒數。

toString():把此 Date 物件轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:

   dow 是一週中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat), zzz是時間標準。

3、java.util.Calendar

API:Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日曆欄位之間
的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。
瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間 1970 年 1 月 1 日的 00:00:00.000,
格里高利曆)的偏移量。
//預設語言環境的時間(時區)
		Calendar c = new GregorianCalendar();
		/*
		 * java.util.GregorianCalendar[
		 * time=1480667849712,
		 * areFieldsSet=true,
		 * areAllFieldsSet=true,
		 * lenient=true,
		 * zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],
		 * firstDayOfWeek=1,
		 * minimalDaysInFirstWeek=1,
		 * ERA=1,
		 * YEAR=2016,
		 * MONTH=11,
		 * WEEK_OF_YEAR=49,//本年第49周
		 * WEEK_OF_MONTH=1,//本月第1周
		 * DAY_OF_MONTH=2,
		 * DAY_OF_YEAR=337,//本年第337天
		 * DAY_OF_WEEK=6,
		 * DAY_OF_WEEK_IN_MONTH=1,		
		 * AM_PM=1, //下午
		 * HOUR=4,
		 * HOUR_OF_DAY=16,  //HOUR是12小時制, HOUR_OF_DAY是24小時制
		 * MINUTE=37,
		 * SECOND=29,
		 * MILLISECOND=712,
		 * ZONE_OFFSET=28800000,
		 * DST_OFFSET=0]
		 */
	public static void main(String[] args) {
		//預設語言環境的時間(時區)
		Calendar c = new GregorianCalendar();
		
		int year=c.get(Calendar.YEAR);
		int month=c.get(Calendar.MONTH);
		int date=c.get(Calendar.DAY_OF_MONTH);
		
		int hour=c.get(Calendar.HOUR_OF_DAY);
		int minute=c.get(Calendar.MINUTE);
		int second=c.get(Calendar.SECOND);
		int mill=c.get(Calendar.MILLISECOND);
		int week=c.get(Calendar.DAY_OF_WEEK);
		
		StringBuffer dateStr=new StringBuffer();
		dateStr.append(year).append("年");
		dateStr.append(month+1).append("月");
		dateStr.append(date).append("日").append("  ");
		dateStr.append(hour).append("時");
		dateStr.append(minute).append("分");
		dateStr.append(second).append("秒");
		dateStr.append(mill).append("毫秒").append("  ");
		
		String[] weeks={"日","一","二","","四","五","六"};
		dateStr.append("星期").append(weeks[week-1]);
		
		System.out.println(dateStr);
	}
c.set(2016, Calendar.DECEMBER, 4, 12, 12, 0);
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH, 2);//c.add(Calendar.DAY_OF_MONTH, -2);
		c.add(Calendar.HOUR, 12);

4、java.text.DateFormat和SimpleDateFormat

完成字串和時間物件的轉化:

format
parse
	public static void main(String[] args) {
		Date date = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss 是本年的第幾D");
		System.out.println(sf.format(date));
		
		String s = "2016-12-01 14:12:23";
		SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date d = sf2.parse(s);
			System.out.println(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

 

數學類Math

java.lang.Math提供了一系列靜態方法用於科學計算;其方法的引數和返回值型別一般為double型。

abs     絕對值

acos,asin,atan,cos,sin,tan  三角函式

sqrt     平方根

pow(double a,doble b)     a的b次冪

log    自然對數

exp    e為底指數

max(double a,double b)

min(double a,double b)

random()      返回0.0到1.0的隨機數

long round(double a)     double型資料a轉換為long型(四捨五入)

toDegrees(double angrad)     弧度—>角度

toRadians(double angdeg)     角度—>弧度

   

比較器:自然排序與定製排序:

java.lang.Comparable

此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。

實現此介面的物件列表(和陣列)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此介面的物件可以
用作有序對映中的鍵或有序集合中的元素,無需指定比較器。

對於類 C 的每一個 e1 和 e2 來說,當且僅當 e1.compareTo(e2) == 0 與 e1.equals(e2) 具有相同的 boolean 值時,
類 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類的例項,即使
 e.equals(null) 返回 false,e.compareTo(null) 也將丟擲 NullPointerException。

建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因為在使用自然排序與 equals 不一致的元素(或鍵)時,
沒有顯式比較器的有序集合(和有序對映表)行為表現“怪異”。尤其是,這樣的有序集合(
或有序對映表)違背了根據 equals 方法定義的集合(或對映表)的常規協定。
實際上,所有實現 Comparable 的 Java 核心類都具有與 equals 一致的自然排序。
java.math.BigDecimal 是個例外,它的自然排序將值相等但精確度不同的 BigDecimal 物件(比如 4.0 和 4.00)視為相等。

 java.util.Compartor

強行對某個物件 collection 進行整體排序 的比較函式。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 
或 Arrays.sort),從而允許在排序順序上實現精確控制。
還可以使用 Comparator 來控制某些資料結構(如有序 set或有序對映)的順序,或者為那些沒有自然
順序的物件 collection 提供排序。

當且僅當對於一組元素 S 中的每個 e1 和 e2 而言,c.compare(e1, e2)==0 與 e1.equals(e2) 
具有相等的布林值時,Comparator c 強行對 S 進行的排序才叫做與 equals 一致 的排序。

當使用具有與 equals 不一致的強行排序能力的 Comparator 對有序 set(或有序對映)進行排序時,
應該小心謹慎。假定一個帶顯式 Comparator c 的有序 set(或有序對映)與從 set S 中抽取出來的
元素(或鍵)一起使用。如果 c 強行對 S 進行的排序是與 equals 不一致的,那麼有序 
set(或有序對映)將是行為“怪異的”。尤其是有序 set(或有序對映)將違背根據 equals 所定義的
 set(或對映)的常規協定。

注:通常來說,讓 Comparator 也實現 java.io.Serializable 是一個好主意,因為它們在可序列化的
資料結構(像 TreeSet、TreeMap)中可用作排序方法。為了成功地序列化資料結構,Comparator
(如果已提供)必須實現 Serializable。