java自學第5期——Object、Date、Calender、System、StringBuilder、基本型別包裝類
一、Object類
- 作用:物件操作
- 位置:java.lang.Object
- 方法:
public String toString() :返回物件的字串表示形式。
public boolean equals(Object obj): 指示是否有其他物件“等於”這一個。 - 注意:Object類裡的toString方法
Object類是所有類的終極父類。
person類預設繼承了Object類,所以可以使用Objcct類裡的方法,返回該物件的字串表示。通常,toString 方法會返回一個“以文字方式表示”此物件的字串。
結果應是一個簡明但易於讀懂的資訊表示式。建議所有子類都重寫此方法。
Object 類的 toString 方法返回一個字串,
該字串由類名(物件是該類的一個例項)、at 標記符“@”和此物件雜湊碼的無符號十六進位制表示組成。
換句話說,該方法返回一個字串,它的值等於:
getClass().getName() + '@' + Integer.toHexString(hashCode())
列印地址值沒有意義,所以要重寫toString方法,列印物件屬性 - equals方法原始碼:
public boolean equals(Object obj){
return(this == obj);
}
//this指呼叫equals方法的那個物件
- == : 對於基本資料型別,比較的是數值;對於引用資料型別,比較的是地址值。
比較地址值無意義,所以要重寫equals方法,比較兩個物件的屬性。 - 程式碼示範:
public class Demo02Equals { private String name; private int age; public static void main(String[] args) { Demo03Class obj1 = new Demo03Class(); Demo03Class obj2 = new Demo03Class(); //列印obj1地址值 System.out.println(obj1); //列印obj2地址值 System.out.println(obj2); //列印二者地址值對比結果,false System.out.println(obj1.equals(obj2)); //將obj2地址值賦給obj1 obj1 = obj2; //列印true System.out.println(obj1.equals(obj2)); } // @Override // public boolean equals(Object obj) { // //將equals原始碼中Object型別的obj向下轉型為子類Demo03Class // //目的是為了呼叫子類Demo03Class裡的方法。 // Demo03Class p = (Demo03Class) obj; // //比較兩個物件的屬性,this(Demo03Class-p)和obj(Demo03Class-) // boolean a = this.name.equals(p.name) && this.age == p.age; // return a; // } }
二、Date類
- 作用:表示時間和日期的類
- 位置:java.util.Date
- 注意:
類Date表示特定的瞬間,精確到毫秒(千分之一秒)。
毫秒值的作用:可以對時間和日期進行計算:
1、 獲取當前計算機系統時間到英國格林威治時間【1970年1月1日00:00:00】經歷了多少毫秒——System.currentTimeMillis方法
2、一天 24h = 86400*1000 ms
3、將毫秒的差值轉換為日期
注意:中國為東八區,時間加8個小時,中國此時為1月1日08:00:00.
- 方法:
public Date(): 空參構造方法,獲得當前系統時間
public Date(long date):實參構造方法,傳遞毫秒值,把毫秒值轉換為日期
public long getTime()
public static void main(String[] args) {
//獲取當前計算機系統時間到【1970年1月1日00:00:00】經歷了多少毫秒
System.out.println(System.currentTimeMillis());
}
public static void main(String[] args) {
method1();
}
private static void method1() {
Date date1 = new Date();//導包後建立Date類的物件(Date()空參構造方法)
System.out.println(date1);//獲得當前系統時間Sat Aug 24 17:43:27 CST 2019
//(CST指中國的標準時間)
Date date2 = new Date(0L);
System.out.println(date2);//Thu Jan 01 08:00:00 CST 1970 原點時間
Date date3 = new Date(1566041013344L);
System.out.println(date3);//原點時間加毫秒差值 得出現在時間
Date date4 = new Date();
long time = date4.getTime();//使用成員方法
System.out.println(time);//返回原點時間到目前系統時間的毫秒差值
}
-
DateFormat是一個[抽象類]的子類格式的日期/時間格式化和解析日期或獨立於語言的方式時間。
日期時間格式的子類,如 SimpleDateFormat,允許的格式(例如,日期→文字),分析(文字→日期),和標準化。
日期表示為 Date物件或自1970年1月1日00:00:00 GMT毫秒,
DateFormat提供的分類方法很多,用於獲取預設日期/時間基於預設或指定的場所和一系列的格式樣式格式化。
抽象類無法直接建立物件,我們使用它的子類SimpleDateFormat. -
構造方法:
SimpleDateFormat(String pattern):用給定的模式和預設語言環境的日期格式符號構造:
引數String pattern: 傳遞指定的格式,詳細見api文件
區分大小寫:
y:年 M:月 d:日 H:時 m:分 s:秒
例如:"yyyy-MM-dd HH:mm:ss"
注意模式中的字母不可改變,但是連線符號可以更改。例如:
"yyyy年MM月dd日 HH時mm分ss秒" -
成員方法:
String format(Date date): 按照指定的格式,將Data日期格式化為符合模式的字串。
Date parse(String source): 把符合模式的字串解析為Date日期 -
parse方法聲明瞭一個異常ParseException,當要轉換的字串格式與構造方法規定的不同時便會報此異常
兩種解決方法:throws繼續丟擲這個異常:滑鼠移動至異常處,按Alt+Enter宣告該異常,交給虛擬機器處理。
或者try catch自己處理
public static void main(String[] args) throws ParseException {
method2();
}
/*
建立SimpleDateFormat物件,構造方法中傳遞指定的模式。
呼叫SimpleDataFormat物件中的方法format(),把Date日期格式化為符合模式的字串(文字)。
*/
private static void method2() throws ParseException {
//建立SimpleDateFormat類的物件
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat();
Date date = new Date();//建立date
//date作為引數傳給SimpleDataFormat物件的format方法
String format = simpleDateFormat1.format(date);
System.out.println(date);//輸出Sat Aug 17 21:11:50 CST 2019
System.out.println(format);//輸出2019/8/17 下午9:11
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat();
Date parse = simpleDateFormat2.parse("2019/8/17 下午9:11");
// Date parse = simpleDateFormat2.parse("2019/8/17 下午9:"); 刪掉秒,發現解析異常ParseException
System.out.println(parse);//輸出 2019/8/17 下午9:11
}
三、Calender類
-
作用:calendar是一個抽象類,裡面提供了很多提供操作日曆欄位的方法
-
位置:java.lang.Object
-
注意:
西方月份是0-11月
日曆類calendar
calendar是一個抽象類,calendar無法直接建立物件,
主要使用【getInstance】靜態方法,靜態方法直接呼叫,不用建立物件
該方法返回了calendar類的子類物件。 -
靜態方法:
getInstance:靜態方法直接呼叫,不用建立物件
該方法返回了calendar類的子類物件。
public static final int MONTH;返回月份
public static final int YEAR
public static final int MINUTE
public static final int SECONDE -
Calendar類常用的成員方法:
public int get(int field):返回給定日曆欄位的值。
public void set(int field,int value):將給定的日曆欄位設定為給定值。
public abstract void add(int field,int amount):根據日曆規則,為給定的日曆欄位新增或者減去指定的時間量。
public Date getTime():返回一個表示此Calendar時間值(從曆元到現在的毫秒偏量)的Date物件。
引數:
int field :日曆類的字元段,可以使用calendar類的靜態成員變數獲取。
int value: 要設定的數值
int value: 正數增加,負數減少
private static void method4(){
//使用getInstance直接返回日曆物件
Calendar calendar1 = Calendar.getInstance();
//呼叫物件的get方法,引數為Calendar類的靜態方法YEAR,得到年)
int i = calendar1.get(Calendar.YEAR);
System.out.println(i);//輸出2019
int momth = calendar1.get(Calendar.MONTH);
System.out.println(momth);//列印7,在中國即為8月。
int day = calendar1.get(Calendar.DAY_OF_MONTH);
System.out.println(day);//輸出17
}
private static void method5(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,9999);//設定年份
calendar.set(Calendar.MONTH,11);//設定月份
int year = calendar.get(Calendar.YEAR);
System.out.println(year);//輸出年份9999
int month = calendar.get(Calendar.MONTH);
System.out.println(month);//輸出月份11
// 使用另一個不同引數列表的set方法,同時設定年月日。
calendar.set(2019,1,3);
Calendar calendar3 = Calendar.getInstance();
calendar3.add(Calendar.YEAR,1);//增加1年
//由2019年變成了2020年。
System.out.println(calendar3.get(Calendar.YEAR));
calendar3.add(Calendar.YEAR,-2);//減少2年
//2018年
System.out.println(calendar3.get(Calendar.YEAR));
Calendar calendar5 = Calendar.getInstance();
//把日曆變成日期
Date time = calendar5.getTime();
//輸出Sat Aug 17 22:36:45 CST 2019
System.out.println(time);
}
四、System類
-
作用:由System類提供的設施包括標準輸入、標準輸出和錯誤輸出流;訪問外部定義的屬性和環境變數;載入檔案和庫的方法;和一種快速複製陣列的一部分的實用方法。
-
位置:java.lang.System
-
方法:
public static long currentTimeMillis()
返回當前時間以毫秒為單位。請注意,返回值的時間單位為毫秒,則值的粒度取決於底層作業系統,並且可能更大。例如,許多作業系統測量單位為幾十毫秒的時間。
public static void arraycopy(Object src, int srcPos, Object dest,int destPos,int length)
從指定的源陣列中複製一個數組,開始在指定的位置,到目標陣列的指定位置。
src: 源陣列
srcPos:源陣列中的起始位置
dest:目標陣列
destPos:目標陣列中的起始位置
length:要複製的陣列元素的數量
private static void method1(){
long time1 = System.currentTimeMillis();
//得到原點1970.1.1到現在所差的毫秒值1566371047409
System.out.println(time1);
}
public static void main(String[] args) {
int src[] = {1,2,3,4,5};
int desk[] = {6,7,8,9,10};
System.arraycopy(src,0,desk,0,3);
//輸出[1,2,3,9,10]
System.out.println(Arrays.toString(desk));
}
五、StringBuilder類
- 作用:StringBuilder類,字串緩衝區,可以提高字串的操作效率。
可以看作一個長度可以變化的字串。 - 位置:java.lang.StringBuilder
- 注意:
字串是常量,它們的值不能被建立後改變。支援可變字串字串緩衝區。
字串的底層是被final修飾的陣列private final byte[] value;
因為字串物件是不可改變的,所以它們可以被共享。
進行字串的相加,記憶體中是多個字串相加,佔用記憶體多,效率低下。
StringBuilder類,字串緩衝區,可以提高字串的操作效率。
可以看作一個長度可以變化的字串。
該類底層也是一個數組,但是無final修飾,因此可以改變長度。
byte[] value = new byte[16];
初始長度16。
字串會依次填入StringBuider陣列中,容量不夠時會自動擴容,因此始終佔據一個數組
記憶體佔用小,效率高。 - 構造方法:
- public StringBuilder()
構造一個沒有字元的字串生成器,並構造了16個字元的初始容量。 - public StringBuilder(String str)
構造一個初始化為指定字串的內容的字串生成器。該字串生成器的初始容量是 16加字串的長度。
引數 str :緩衝區的初始內容。
- 成員方法:
-
public StringBuilder append(...) 新增任意型別的字串,並返回當前物件自身。
由於返回的是物件本身,因此無需接受返回值
鏈式程式設計:
方法返回值是一個物件,因此可以繼續呼叫方法:
a.append(1).append("e")... -
public String toString()
返回表示該序列中的資料的字串。一個新的 String物件被初始化為包含目前代表這個物件的字元序列。
這 String然後返回。這個序列的後續變化不影響內容的 String。
- String 和 StringBuilder相互轉換:
String 到 StringBuilder: 使用StringBuilder的構造方法 StringBuilder(String str)
StringBuilder 到 String :使用StringBuider中的toString方法.
public static void main(String[] args) {
//空構造方法
StringBuilder stringBuilder1 = new StringBuilder();
System.out.println(stringBuilder1);//空的
//有參構造方法
StringBuilder stringBuilder2 = new StringBuilder("我是引數");
System.out.println(stringBuilder2);
}
public static void main(String[] args) {
StringBuilder stringBuilder1 = new StringBuilder("kiana");
// 該寫法不對,無需接受返回值
// StringBuilder stringBuilder2 = stringBuilder1.append(" love 芽衣");
stringBuilder1.append(" 喜歡 芽衣");
//輸出: kiana love 芽衣
System.out.println(stringBuilder1);
//鏈式程式設計
stringBuilder1.append(", 而我").append("喜歡").append("所有人");
//輸出: kiana 喜歡 芽衣, 而我喜歡所有人
System.out.println(stringBuilder1);
//String 轉換 StringBuilder
String str = "love";
StringBuilder stringBuilder3 = new StringBuilder(str);
//輸出love
System.out.println(stringBuilder3);
//StringBuilder轉為String
StringBuilder stringBuilder6 = new StringBuilder("女武神Valkykie");
stringBuilder6.toString();
//輸出女武神Valkykie
System.out.println(stringBuilder6);
}
六、基本型別包裝類
- 作用:基本型別的資料效率高,但功能少,為了將其當作物件使用,可以使用基本資料型別對應的包裝類。
除了int 為 Integer,char 為 Character外,其他只是首字母大寫即可。 - 裝箱:把基本資料型別的資料包裝到包裝類中
- Integer的構造方法:
- Integer(int value)
構建了一個新分配的 Integer表示指定的 int價值。 - Integer(String s)
構建了一個新分配的 Integer表示 int值表示的 String引數。
注意,2中的引數字串必須是基本資料型別的字串,不可是其他型別,否則丟擲異常
例如:"123"對 , "一二三"錯誤
- 兩個靜態方法:
1.public static Integer valueOf(int i)
返回一個 Integer例項表示指定的 int價值。
如果一個新的 Integer例項是不需要的,這種方法一般應優先使用建構函式 Integer(int),
這種方法可能會產生顯著更好的空間和時間,通過快取經常請求的價值表現。
此方法將總是在範圍內的快取值- 128至127,包含,並可能快取在此範圍以外的其他值。
引數
i - int價值。
結果
一個 Integer例項代表 i。
- public static Integer valueOf(String s)
throws NumberFormatException
返回一個 Integer物件持有指定的 String值。引數的解釋是代表一個十進位制整數,
就像爭論給 parseInt(java.lang.String)方法。其結果是一個 Integer表示的字串指定的整數值。
換句話說,這個方法返回一個Integer物件相等的價值:
new Integer(Integer.parseInt(s))
引數
s :被解析的字串。
結果
一個 Integer物件持有價值為代表的字串引數。
異常
NumberFormatException如果不能將字串解析為一個整數。
- 拆箱:在包裝類中取出基本資料型別。
- 拆箱成員方法:
public int intValue()
作為一個 int返回該 Integer價值。
Specified by:
intValue 方法重寫,繼承類 Number
結果
這代表的物件轉換為數值型 int後。 - 自動裝箱與自動拆箱:基本資料型別和包裝類可以自已自動轉換。自jdk1.5開始。
自動裝箱寫法:Integer value = 1;
自動拆箱: 進行value + 1運算時自動將包裝類的value轉換為int型別。
- 基本資料型別和字串型別的相互轉換。
基本轉字串:
1.基本型別 + 空字串“”
2.包裝類的靜態方法toString(引數),注意不是Object類的toString().
static String toString(int i),返回一個表示指定整數的String物件。
3.String類的靜態方法valueOf(int i)返回int引數的字串表示形式。
static String valueOf(int i)
字串轉基本:
1.使用包裝類的靜態方法parse***("數值型別的字串")
Integer類: static int parseInt(String s)
Double類: static double parseInt(String s)
public static void main(String[] args) {
//構造方法示例:
Integer integer1 = new Integer("123");
Integer integer2 = new Integer(123);
//123,重寫了toString方法
System.out.println(integer1);
//123,重寫了toString方法
System.out.println(integer2);
//靜態方法
Integer integer3 = Integer.valueOf(123);
Integer integer4 = Integer.valueOf("123");
//123,都是將其變成了包裝類
System.out.println(integer3);
System.out.println(integer4);
//拆箱:包裝類變成基本資料型別
int int1 = integer3.intValue();
int int2 = integer2.intValue();
//123
System.out.println(int1);
System.out.println(int2);
}
public static void main(String[] args){
//基本轉字串3個方法
int int1 = 1;
//方法1
String string1 = int1+"";
//方法2
String string2 = Integer.toString(int1);
//方法3
String string3 = String.valueOf(int1);
//1
System.out.println(string1);
//字串轉基本,字串必須是數值型別
int int2 = Integer.parseInt(string1);
System.out.println(int2);//1
}