1. 程式人生 > >Java基礎筆記4——Object、String、正則、Math、包裝類

Java基礎筆記4——Object、String、正則、Math、包裝類

Java基礎筆記4
八、介面API
Application Programming Interfaces——應用程式介面
Object物件
是java中所有類的父類——頂級父類
沒有寫父類的都預設繼承Object類。
clone()克隆——克隆出一個新物件,新物件的屬性值和原來的一樣。
如果一個類的物件想要被克隆,那麼這個類必須實現一個介面Cloneable(這個介面沒有任何屬性和方法,僅僅作為標誌作用)。

右鍵選單Source–>Generate hashCode() and equals()自動為屬性重寫hashcode()和equals()方法
public boolean equals(Object obj) {
if (this == obj) //判斷是否是同一個物件
return true;
if (obj == null) //判斷物件是否為空值
return false;
if (getClass() != obj.getClass()) //判斷物件型別是否一致
return false;
Student other = (Student) obj; //強轉傳入引數Object類為要判斷的Student類
if (name == null) { //噹噹前物件的name為空值
if (

other.name != null)//傳參物件的name不為空值,返回false
return false;
//呼叫String型別的equals()方法,判斷兩個字串name是否一致
} else if (!name.equals(other.name))
return false;
return true;
}
}
finalize():通知垃圾回收器進行回收,當垃圾回收器GC不一定執行。
getClass():返回執行時類。獲取物件的實現類(非宣告類)。
equal():預設判斷兩個物件的地址。
hashcode():雜湊碼值——根據雜湊雜湊演算法計算出來的。
1.不同的物件計算出來的雜湊碼是均勻地雜湊分佈在int的取值範圍內。因為不同物件的雜湊值重複概率非常小,所以人為的認為雜湊值是唯一的。故在計算物件的儲存位置的時候是根據物件的雜湊值來分配的。
2.固定環境下(同一臺主機上)每次計算的雜湊值是不變的。
String字串
本身依靠字元陣列儲存的元素,作為最終類存在,不可以被繼承。
字串是常量,字串是被共享的。
String str = “abc”; — 1個物件
String str2 = new String(“abc”); — 2個物件
String str3 = “a”; str3 += “b”; — 5個物件
String str3 = “a”;— 1個物件
str3 = new StringBuilder(str3).append(“b”).toString(); — 4個物件

String s1="ab";
	String s2=new String("ab"); //s1、s2指向的是不同的地址
	//為了提高編譯效率,字面量先運算再賦值,故String s3="ab";
	String s3="a"+"b";
	String s4="a";
	//使用+拼接兩個字串,底層實際上呼叫了StringBuilder中的append方法	
	s4=s4+"b";//相當於s4=new StringBuilder(s4).append("b").toString();
	System.out.println(s1==s2); //false
	System.out.println(s1==s3); //true
	System.out.println(s1==s4); //false  比較的是引用地址
	System.out.println(s1.equals(s4)); //true 比較的是地址裡存的內容

String[] arr = {100個元素};
// 將字串陣列中的元素拼接成一個字串
String str = “”; // 1
for(String s : arr){
str = str + s; // 每拼接1次,要額外產生3個物件。拼接100次,額外產生300個物件
}
// 整個過程中,一共產生了301個物件
StringBuilder sb = new StringBuilder(); // 1
for(String s : arr){
sb.append(s); // 每拼接1次,要額外產生1個物件。拼接100次,額外產生100個物件
}
String str = sb.toString(); // 1
// 整個過程中,一共產生了102個物件
在拼接字串的時候,如果個數比較少可以使用+;如果個數比較多,建議使用StringBuilder
StringBuilder是執行緒不安全的類,StringBuffer是執行緒安全的。
①將字串轉化成陣列,呼叫toCharArray()方法。
String str=new String();
char[] cs=str.toCharArray();
②將字元陣列轉化成字串
char[] cs={‘a’,‘b’,‘c’,‘d’,‘e’};
String str=new String(cs);
System.out.println(str);//輸出結果:abcde
③將字串轉化為位元組陣列。在轉化的時候如果沒有指定編碼會依據平臺碼來進行轉化。
String s = “位元組陣列”;
byte[] bs = s.getBytes();
byte[] bs = s.getBytes(“utf-8”);//指定轉換字符集
④ 將位元組陣列轉化為字串
String str = new String(bs);
charAt():獲取指定下標的字元
indexOf():從開始位置找指定字元第一次出現對應的下標
lastIndexOf():查詢指定字元最後一次出現的下標位置
toUpperCase():將字串中的小寫字母轉化成大寫字母
toLowerCase():將字串中的大寫字母轉化成小寫字母
注意:在String中提供了一系列的方法是新生成了一個字串,並不改變原字串。
concat():將指定字串拼接到原字串末尾
contains():判斷是否包含指定的子字串。只能判斷具體值,不判斷範圍
endsWith():判斷是否以指定字元為結尾
startsWith():判斷是否以指定字元為開頭
equals():判斷兩字串是否一樣。底層已做過重寫,比較的是內容。
equalsIgnoreCase():忽略大小寫,判斷兩字串是否一樣。
instanceof:判斷前一個物件是否是後邊的類或者介面產生。
“abc”instanceof String 判斷abc是否是字串類,結果是true。
注意:判斷型別為其父類時,結果也是true。例“abc”instanceof Object
Windows系統預設編碼: GBK Linux系統預設編碼: UTF-8
hashcode():String型別已經重寫過此方法,保證了同一個字串在任何場景下雜湊值是一致的。
java中char型別在儲存到記憶體中的時候用的編碼是utf-16,漢字佔2個位元組。
replace():替換指定字元,只能替換具體字元
replaceAll():替換所有符合規則的元素
split():按照指定規則切分字串
String str=“d4ag4ha64ha4hs2”;
String[] s=str.split("\d"); //指定規則:數字作為切割
System.out.println(Arrays.toString(s)); //[d, ag, ha, , ha, hs]
substring():擷取指定字串。範圍:包左不包右,包小不包大
trim():去頭尾處空白字元(中間空格無法去除),去掉空格、換行符、\t、\r、\n
valueof():將引數轉化成字串顯示。如果引數是物件,底層預設呼叫了tostring(),轉化成物件的引用地址。字元陣列例外。
Object o = new Object();
System.out.println(String.valueOf(o));//java.lang.Object@15db9742
System.out.println(o);//java.lang.Object@15db9742

	char[] cs = {'a','b','c'};
	System.out.println(String.valueOf(cs)); //abc
	System.out.println(cs.toString()); //[[email protected]

isEmpty():判斷字串是否為空。字串賦值為null,執行時報錯空指標異常。
reverse():使StringBuffer物件的值反轉
正則表示式regex
regular expression
用於指定規則
JDK API裡搜pattern
在正則表示式裡.表示任意萬用字元,\.表示.
\\會被java轉義為\,正則表示式又轉義為
Pattern p = Pattern.compile("ab");//匹配規則包含字元a零個或多個,包含字元b一個
Matcher m = p.matcher(“aaaaab”);//新增要判斷的字串aaaaab
boolean b = m.matches();//判斷結果為一個boolean值
正則表示式簡短,使用次數少,可直接判斷輸出。
String str = “8531585285”;
// 匹配一個由數字組成的長度為5的字串。d表示數字,{n} 表示這個字元恰好出現n次
System.out.println(str.matches("\d{5}"));
字元類
[abc] a、b 或 c(簡單類)
[^abc] 任何字元,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
預定義字元類
. 任何字元(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
Greedy 數量詞
X? X,一次或一次也沒有
X
X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
Logical 運算子
XY X 後跟 Y
X|Y X 或 Y
(X) X,作為捕獲組

一個字元最多匹配一個數量詞。
正則表示式裡不允許出現空格,空格也表示匹配的字元。
範例1:字元替換
String str = “ks4sdlg3dkl0csbk2sbdk”;
System.out.println(str.replaceAll("\d", “”));// 將字串中的所有的數字都去除掉
範例2:取消疊字
String str=“我我我我我愛愛學學編編程式設計程程”;
System.out.println(str.replaceAll("(.)\1+","$1" )); //我愛學程式設計
範例3:調整順序
String str = “Cat Dog Pig Mouse Spider”;
System.out.println(str.replaceAll("(.)(Dog)(.)(Spider)", “$1$4$3$2”));
包裝類package
針對每一種基本型別都提供了對應的類形式——包裝類。
byte short int long float double char boolean void
Byte Short Integer Long Float Double Character Boolean Void
Void 類是一個不可例項化的佔位符類,它表示對 Java 關鍵字 void 的 Class 物件的引用。

自動封箱、拆箱是JDK 1.5特性之一。
利用基本型別的變數構建了引用型別的變數——此過程稱為封箱操作。
int i=1;
Integer in=new Integer(i);
System.out.println(in);//輸出1。底層重寫了toString方法
將一個基本型別的變數之間賦值給對應的引用型別的物件——自動封箱
//對於自動封箱而言,底層實際上是呼叫了Integer中的valueOf方法
Integer it=i; //Integer it=Integer.valueOf(i);
將引用型別的物件之間賦值給了對應的基本型別的變數——自動拆箱
Integer ie=new Integer(5);
//在底層實際上呼叫了物件身上的Value方法
int i2=ie;//int i=in.intValue();
Double dd=new Double(3.1);
double d=dd;//double d=dd.doubleValue();
Boolean bo = new Boolean(true);
boolean b = bo; // boolean b = bo.booleanValue();
對應整數型別而言,在自動封箱的時候會有範圍判斷。
範圍在-128~127時,返回的是陣列的值。
Integer i3=-128;//底層呼叫了cache[]陣列
Integer i4=-128;
System.out.println(i3i4);//輸出true
超出此範圍,返回一個新物件。
Integer i5=228;
Integer i6=228;
System.out.println(i5
i6);//輸出false
如果引用型別與基本型別進行計算,那麼會進行自動拆箱操作。
int i7=8;
Integer i8=6;
System.out.println(i7+i8); //輸出14
Integer型別會依次判斷每一位是否是一個數字字元
Integer i9=new Integer(0x291);//0x291數值的十六進位制寫法
System.out.println(i9);//輸出657
Integer i9=new Integer(“0x291”);//新增雙引號變成字串,編譯不報錯,執行時報錯
int i10=Integer.parseInt(“291”);//將字串轉換成int型別
System.out.println(i10);//輸出291
double d1=Double.parseDouble(“2.91”);//將字串轉換成double型別
System.out.println(d1);//輸出2.91
編譯報錯 char c=Character.parseChar(“65”);//此方法不適用與char型別
char c=“A”.charAt(0);//正確方法:呼叫String類的chartAt()方法
System.out.println©;//輸出A
對於包裝類而言,每一個物件的雜湊碼都是固定的,不隨環境改變。
總結:字面量的雜湊值是固定不變的。null的雜湊值為0,也是固定的。
NaN跟任何東西不相等包括自己本身。
NaN獲取方式①0.0/0 ②0/0.0 ③0.0/0.0
數學類Math
本身是一個最終類,只能執行基本的數學運算。
E——無限不迴圈小數:2.718281828459045
PI——圓周率π:3.141592653589793
Math.ceil(浮點數a) 向上取整, 獲取大於或等於a的最小整數
Math.floor(浮點數a) 向下取整, 獲取小於或等於a的最大整數
System.out.println(Math.ceil(3.1));//輸出4.0
System.out.println(Math.floor(3.1));//輸出3.0
Math.round(double a)四捨五入方法
System.out.println(Math.round(3.75));//輸出4
Math.random()獲取一個隨機小數,每次執行得到的小數都不一樣。
導包import java.util.Random;可以獲取指定範圍的隨機整數。
Random random=new Random(); //生成Random物件
int a=random.nextInt(100); //得到0-100之間的隨機正數
Math類也無法解決小數運算不精確的問題。
因為小數以二進位制形式進行儲存,轉換過程出現精度損失。
strictfp只能修飾方法,表示方法在計算過程中,是以80位二進位制進行,但最後的儲存依然是64位二進位制。
public strictfp static void main(String[] args) {}
利用BigDecimal類進行精確運算。
注意引數必須以字串的形式傳入,否認運算結果依舊不準確
原理:字串的陣列逐位運算,所以每一個運算都是以整數形式執行
BigDecimal b1=new BigDecimal(“3.13”); //若未加“”
BigDecimal b2=new BigDecimal(“4.10”);
//System.out.println(b1+b2); //編譯報錯,物件不能直接運算
System.out.println(b1.add(b2)); //呼叫加法運算,結果:7.23
System.out.println(b1.subtract(b2));//呼叫減法運算,結果:-0.97
BigInteger:表示任意大小的整數。要求以字串的形式傳入引數。
multiply():求積
BigInteger b=new BigInteger(“13245665854234564343415346434133434”);
BigInteger bi=new BigInteger(“15435445643434797979777973311143434”);
System.out.println(b.multiply(bi));//求積,結果仍為大整數
日期類Date
導包import java.util.Date;
Date類下大部分方法已過時。
DateFormat:是日期/時間格式化子類的抽象類
SimpleDateFormat():規範日期格式
parse():字串轉日期
format():日期轉字串
Date date=new Date();
System.out.println(date); //Wed Jun 20 14:28:27 CST 2018獲取當前系統時間
String str=“2018-03-12 15:30:05”;
SimpleDateFormat s=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);//規範解析格式
Date da=s.parse(str); //將String型別轉換成Date物件
System.out.println(da);//Mon Mar 12 15:30:05 CST 2018
String st=s.format(date);//將指定Date轉換成格式字串輸出
System.out.println(st);
String st=new SimpleDateFormat(“yyyy年MM月dd日”).format(da);
System.out.println(st);//2018年03月12日
通過System.currentTimeMillis()可以獲取自1970.1.1零時到此時此刻的毫秒數。