日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常用API-1(Object类、String类、StringBuffer类、StringBuilder类)

發布時間:2024/10/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用API-1(Object类、String类、StringBuffer类、StringBuilder类) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. Object類

Java語言的根類,即所有類的父類。

1.1 clone()

返回一個Object對象的復制。這個復制返回的是一個新對象。

clone() 是 Object 的 protected 方法,它不是 public,一個類不顯式去重寫clone(),其它類就不能直接去調用該類實例的 clone() 方法。

1.1.1 淺拷貝

拷貝對象和原始對象的引用類型引用同一個對象

使用步驟:

  • 實現clone的類首先需要繼承Cloneable接口(若未實現,就拋出異常:CloneNotSupportedException)。Cloneable接口實際上是一個標識接口,沒有任何接口方法。
  • 在類中重寫Object類的clone()方法;
  • 在clone()中調用super.clone()。無論clone類的繼承結構是什么,super.clone()會直接或間接調用java.lang.Object類的clone()
  • 把淺復制的引用指向原型對象新的克隆體。
  • class Obj implements Cloneable{private int aInt=0;public int getAInt() {return aInt;}public void setAInt(int int1) {aInt=int1;}public void changeInt() {this.aInt=1;}public Object clone() {Object o=null;try {o=(Object)super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return o;} }public class DBTest{public static void main(String[] args) {Obj a=new Obj();Obj b=(Obj)a.clone();b.changeInt();System.out.println("a:"+a.getAInt());System.out.println("b:"+b.getAInt());}}

    運行結果:

    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()

    比較兩個對象是否相同。

    基本類型比較的是值,引用類型比較的是地址。

    滿足:自反性、對稱性、傳遞性和一致性(多次調用結果一樣)。

  • x.equals(x); // true
  • x.equals(y) == y.equals(x); // true
  • if (x.equals(y) && y.equals(z)) x.equals(z); // true;
  • x.equals(y) == x.equals(y); // true
  • 與 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类)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。