天天學JAVA-JAVA基礎(6)

穿越清華發表於2020-01-11

如果覺得我寫的還行,請關注我的部落格並且點個贊喲。本文主要介紹JAVA 中最常使用字串常量String相關知識。

1.String簡介
2.建立字串物件兩種方式的區別
3.String常用的方法
4.String的不可變性
5.一道阿里面試題,你會做嗎?

1.String簡介
1.1String原始碼
在這裡插入圖片描述

首先看一段String原始碼,String主要實現了Serializable、Comparable、CharSequence等介面。Serializable主要實現序列化,Comparable此介面強行對實現它的每個類的物件進行整體排序,CharSequence主要實現char值的一個可讀序列。String使用final關鍵字修飾,表明String這個類是不能被繼承。
在API中對String是這樣描述:
String 類代表字串。Java 程式中的所有字串字面值(如 “cc程式設計師” )都作為此類的例項實現。字串是常量;它們的值在建立之後不能更改。字串緩衝區支援可變的字串。因為 String 物件是不可變的,所以可以共享。

 String str = "abc";
  相當於:
 char data[] = {'a', 'b', 'c'};
 String str = new String(data);
 

1.2.String中的成員變數

     @Stable
    //String的屬性值
    private final byte[] value;
   // coder方法判斷COMPACT_STRINGS為true的話,則返回coder值,否則返回UTF16;              isLatin1方法判斷COMPACT_STRINGS為true且coder為LATIN1則返回true
    private final byte coder;
    //String型別的hash值
    private int hash;
    private static final long serialVersionUID = -6849794470754667710L;
    //預設為true
    static final boolean COMPACT_STRINGS = true;
    //建立序列化欄位
    private static final ObjectStreamField[] serialPersistentFields 
    = new ObjectStreamField[0];
    public static final Comparator<String> CASE_INSENSITIVE_ORDER 
    = new String.CaseInsensitiveComparator();
    static final byte LATIN1 = 0;
    static final byte UTF16 = 1;

1.3.String的建構函式
在這裡插入圖片描述

2.建立字串物件兩種方式的區別

1.直接賦值方式建立物件
直接賦值方式建立物件是在方法區的常量池
String str="cc程式設計師";//直接賦值的方式
2.通過構造方法建立字串物件
通過構造方法建立字串物件是在堆記憶體
String str=new String("cc程式設計師");//例項化的方式,New一個物件

3.String常用的方法
在這裡插入圖片描述

3.1.String 的判斷操作

//測試此字串是否以指定的字首開頭
startsWith(String prefix)
//試在指定索引處開始的此字串的子字串是否以指定的字首開頭
startsWith(String prefix, int toffset)
//測試此字串是否以指定的字尾結尾。
endsWith(String suffix)
//將此字串與指定物件進行比較。 其結果是true當且僅當該引數不是null
//並且是String物件,表示相同的字元序列作為該物件。
equals(Object anObject)
//將此字串與指定的StringBuffer進行StringBuffer 。 
//其結果是true如果並且如果該只String表示的字元作為指定的相同序列StringBuffer 。
// 該方法在StringBuffer上StringBuffer
contentEquals(StringBuffer sb)
//將此String與其他String比較,忽略案例注意事項。 
//如果兩個字串的長度相同,並且兩個字串中的相應字元等於忽略大小寫,
//則兩個字串被認為是相等的
equalsIgnoreCase(String anotherString)

程式碼事例如下:

package com.cy.lambda.learning.base;


/**
 * cc程式設計師
 * String例項
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "cc程式設計師";
        String s2 = "CC程式設計師";
        StringBuffer sb = new StringBuffer("cc程式設計師");
        System.out.println("===:"+s1 == s2);//false
        //startsWith(String prefix)測試此字串是否以指定的字首開頭
        System.out.println("startsWith(String prefix):"+s1.startsWith(s2));//false
        /**
         *  startsWith(String prefix, int toffset)試在指定索引處開始的此字串
         *  的子字串是否以指定的字首開頭
         */
         System.out.println("startsWith(String prefix, int toffset):"
                 +s1.startsWith(s2,3));//false
         // endsWith(String suffix)測試此字串是否以指定的字尾結尾。
        System.out.println("endsWith:"+s1.endsWith("員"));//true

        /**
         *  equals(Object anObject)將此字串與指定物件進行比較。
         *  其結果是true當且僅當該引數不是null並且是String物件,
         *  表示相同的字元序列作為該物件。
         */
        System.out.println("equal:"+s1.equals(s2));//true
        /**
         * contentEquals(StringBuffer sb)將此字串與指定的StringBuffer進行StringBuffer
         * 其結果是true如果並且如果該只String表示的字元作為指定的
         * 相同序列StringBuffer 。該方法在StringBuffer上StringBuffer
         */
        System.out.println("contentEquals:"+s1.contentEquals(sb));//true
        /**
         *  equalsIgnoreCase(String anotherString)
         *  將此String與其他String比較,忽略案例注意事項。
         *  如果兩個字串的長度相同,並且兩個字串中的相應字元等於忽略大小寫,
         *  則兩個字串被認為是相等的
         */
        System.out.println("equalsIgnoreCase:"+s1.equalsIgnoreCase(s2));//true
        //length() 字串長度
        System.out.println(s1.length());
    }
}

4.String的不可變性

String是個常量,從一出生就註定不可變.正如文章開頭介紹一樣,String類被final修飾,所以她是不可變得。

因為String太過常用,JAVA類庫的設計者在實現時做了個小小的變化,即採用了享元模式,每當生成一個新內容的字串時,他們都被新增到一個共享池中,當第二次再次生成同樣內容的字串例項時,就共享此物件,而不是建立一個新物件,但是這樣的做法僅僅適合於通過=符號進行的初始化。  
需要說明一點的是,在object中,equals()是用來比較記憶體地址的,但是String重寫了equals()方法,用來比較內容的,即使是不同地址,只要內容一致,也會返回true,這也是為什麼a.equals©返回true的原因了。
可以實現多個變數引用堆記憶體中的同一個字串例項,避免建立的開銷。

String不可變得好處:
我們的程式中大量使用了String字串,有可能是出於安全性考慮。
大家都知道HashMap中key為String型別,如果可變將變的多麼可怕。
當我們在傳參的時候,使用不可變類不需要去考慮誰可能會修改其內部的值,如果使用可變類的話,可能需要每次記得重新拷貝出裡面的值,效能會有一定的損失

5.如何實現兩金額資料相加(最多小數點兩位)(阿里面試題)

如果你想知道答案或者你知道答案,請留言或者關注下方公眾號,並且回覆1030,將會得到答案和解析喲。

如果你覺得我寫的還行,請關注我的部落格並且點個贊喲,也請關注我的公眾號並加入下方QQ群,每天都會定時推送乾貨以及共享一些優質的學習資料和視訊喲.
在這裡插入圖片描述
在這裡插入圖片描述

相關文章