常用API-1(Object类、String类、StringBuffer类、StringBuilder类)
1. Object類
Java語言的根類,即所有類的父類。
1.1 clone()
返回一個Object對象的復制。這個復制返回的是一個新對象。
clone() 是 Object 的 protected 方法,它不是 public,一個類不顯式去重寫clone(),其它類就不能直接去調用該類實例的 clone() 方法。
1.1.1 淺拷貝
拷貝對象和原始對象的引用類型引用同一個對象。
使用步驟:
運行結果:
a:0
b:1
1.1.2 深復制
拷貝對象和原始對象的引用類型引用不同對象。
在對對象調用clone()完成復制之后,接著對對象中的非基本類型的屬性也調用clone()完成復制。
import java.util.Date;class Obj implements Cloneable{private Date birth=new Date();public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth=birth;}public void changeDate() {this.birth.setMonth(4);}public Object clone() {Obj o=null;try {o=(Obj)super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}//實現深復制o.birth=(Date)this.getBirth().clone();return o;} }public class DBTest{public static void main(String[] args) {Obj a=new Obj();Obj b=(Obj)a.clone();b.changeDate();System.out.println("a:"+a.getBirth());System.out.println("b:"+b.getBirth());} }運行結果:
a:Tue Nov 27 15:40:48 CST 2018
b:Sun May 27 15:40:48 CST 2018
Date.setMonth(int):都標有刪除線,因為被廢棄了。是因為Date類在設計中有很多問題,如getYear指的是1900年以來的年數,getMonth是從0開始的。
setMonth(4)實際上是設置為5月,May
1.2 equals()
比較兩個對象是否相同。
基本類型比較的是值,引用類型比較的是地址。
滿足:自反性、對稱性、傳遞性和一致性(多次調用結果一樣)。
與 null 的比較:對任何不是 null 的對象 x 調用 x.equals(null) 結果都為 false
要根據對象屬性值進行比較時,需重寫equals()。
public boolean equals(Object obj) {if(this==obj)return true;if(!(obj instanceof Person))return false;//將obj向下轉型為Person引用,訪問其屬性Person p=(Person) obj;return this.age==p.age; }- 在重寫Object中的equals()時,要注意equals(Object obj)的參數類型時Object;
- 在調用對象屬性的時候,要進行類型轉換,但轉換之前,必須進行類型判斷。
1.2.1 equals()源碼
public boolean equals(Object obj){return (this==obj); }- 使用==
- 比較兩個對象的內存地址
1.2.2?equals() 與 ==
- 對于基本類型,== 判斷兩個值是否相等,基本類型沒有 equals() 方法。
- 對于引用類型,== 判斷兩個變量是否引用同一個對象,而 equals() 判斷引用的對象是否等價。
1.3 toString()
返回該對象的字符串表示(對象類型+@+內存地址值)
Syso(s);——默認調用toString()
Syso(s.toString());和上面一句輸出一樣
需按對象的屬性得到相應的字符串表示時,需要重寫toString();
class Person extends Object{int age;public String toString() {return "Person [age="+age+"]";} }toString()源碼
String toString(){return getClass().getName()+"@"+Integer.toHexString(hashCode()); }- getClass():返回一個對象。返回Object的運行時類(字節碼對象)
- getName():返回字節碼名字(類名)
- @:分隔符
- Integer.toHexString():類名調用方法,說明toHexString()是static方法。它以十六進制無符號整數形式返回一個整數參數的字符串表現形式
- hashCode():無對象調用,則屬于Object,返回對象的哈希碼值。阿靜對象的內存地址以整數形式返回。
1.4 hashCode()
hasCode() 返回散列值,而 equals() 是用來判斷兩個對象是否等價。
等價的兩個對象散列值一定相同,但是散列值相同的兩個對象不一定等價。
在覆蓋 equals() 方法時應當總是覆蓋 hashCode() 方法,保證等價的兩個對象散列值也相等。
下面的代碼中,新建了兩個等價的對象,并將它們添加到 HashSet 中。
我們希望將這兩個對象當成一樣的,只在集合中添加一個對象,但是因為 EqualExample 沒有實現 hasCode() 方法,因此這兩個對象的散列值是不同的,最終導致集合添加了兩個等價的對象。
EqualExample e1 = new EqualExample(1, 1, 1); EqualExample e2 = new EqualExample(1, 1, 1); System.out.println(e1.equals(e2)); // true HashSet<EqualExample> set = new HashSet<>(); set.add(e1); set.add(e2); System.out.println(set.size()); // 2理想的散列函數應當具有均勻性,即不相等的對象應當均勻分布到所有可能的散列值上。
2. String類
字符串是常量,它們的值在創建之后不能更改
字符串本身不能更改,但str變量中記錄的地址值可以改
String str="CSDN";
str="Zxin";
2.1 賦值方式
2.1.1 使用雙引號的方式創建的對象和使用new方式(構造函數)創建的對象的區別
String s1=new String("hello");
String s2="hello"
String s3="hello";
s1==s3;//false
s2==s3;//true
字符串內容存儲在方法區的常量池里面,便于字符串的重復使用。
public class Code2 {public static void main(String[] args) {String s1=new String("hello");String s2="hello";String s3="hello";String s4=new String("hello");System.out.println(s1==s3);//falseSystem.out.println(s2==s3);//trueSystem.out.println(s1==s4);//false } }2.2 構造方法
String();
String(byte[] bytes);
String(byte[] bytes,int offset, int length);
String(char[] value);
String(char[] value,int offset,int length);
String(String original)——把字符串數據封裝成字符串對象
2.3 方法
length():字符個數
subString(int beginIndex):從指定位置到字符串末尾的所有字符
subString(int beginIndex,int endIndex):從指定位置開始到指定位置結束的所有字符串[beginIndex,endIndex)
trim():去掉字符串兩端空格
split(String str):按照指定符號分割字符串
2.3.1 查找
startWith(String prefix):以給定字符串開始
endsWith(String suffix):以給定字符串結尾
contains(CharSequence s):判斷是否包含給定字符串
- 是,返回第一次出現該字符串的索引
- 否,返回-1
indexOf(String str):判斷是否包含給定字符串
- 是,返回true
- 否,false
charAt(int index):獲取字符串第index位置的字符
- index范圍:[0,length()-1]
2.3.2 轉換
getBytes():將字符串轉換成一個字節數組
to CharArray():將字符串轉換為一個字符數組
to LowerCase():轉換為小寫字符串
to UpperCase():轉換為大寫字符串
2.3.3 判等
equals(Object obj):比為驕傲字符串的內容是否相同
equalsIgnoreCase(String str):忽略大小寫
直接打印引用類型變量時,默認調用該類型進行重寫后的toString()。
2.4 字符串拼接
String s="hello";
s+="world";
字符串拼接很耗時,也很浪費空間。
- String的值是不可變的,這就導致每次對String的操作都會生成新的字符串內容。
3. StringBuffer
又稱不可變字符序列
類似于String的字符緩沖區,通過某些方法調用可以改變該序列的長度和內容。
它是一個容器,可以裝很多字符串,并且能夠對其中的字符串進行各種操作。
3.1 方法
append(String str):添加字符串
insert(int offset,String str):在指定位置插入
delete(int start,int end):刪除子序列
replace(int start,int end,String str):替換指定范圍的內容(end-start=str.length()??)
reverse():反轉
toString()
以上方法返回的都是當前對象自己——StringBuffer可以改變當前字符序列的長度和內容
3.2 對象的方法鏈式調用(運行下)
不斷添加數據,要對緩沖區的最后數據進行操作,必須轉換成為字符串才可以。
String str=sb.append(true).append("hello").toString();無論多少數據,數據什么類型都不重要,只要最終編程字符互傳就可以使用StringBuffer這個容器。
4. StringBuilder
用在字符串緩沖區被單個線程使用時。
若可以,優先采用此類,它比StringBuffer快。
屬于java.lang包,不用導包。
String內容是固定的;StringBuilder內容是可變的。
4.1 成員方法
capcacity():返回當前容量——理論值
length():返回長度(字符個數)——實際值
append(任意類型):添加數據,并返回自身對象
reverse()
4.2
StringBuilder sb=bew StringBuilder(); StringBuilder sb2=sb.append("hello");運行之后,sb和sb2里都是hello。
4.3 String<------>StringBuilder
1、String--->StringBuilder:StringBuilder(String s);構造方法
2、StringBuilder--->String:toString();
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的常用API-1(Object类、String类、StringBuffer类、StringBuilder类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象4(匿名对象、内部类、包、修饰符
- 下一篇: 常用API-2(字符串与数组)