包裝類.String.Math.Date.排序
阿新 • • 發佈:2018-11-12
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。