天天學JAVA-JAVA基礎(6)
如果覺得我寫的還行,請關注我的部落格並且點個贊喲。本文主要介紹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群,每天都會定時推送乾貨以及共享一些優質的學習資料和視訊喲.
相關文章
- C++基礎學習6C++
- 數學基礎講解-6
- 零基礎學Java(6)控制流程Java
- Spring入門學習手冊 6:Spring MVC基礎中的基礎SpringMVC
- 重學ES6基礎語法(六)
- 重學ES6基礎語法(四)
- 重學ES6基礎語法(二)
- [ES6] 基礎
- 大資料基礎學習-6.Kafka2.11大資料Kafka
- Python學習之旅(核心程式設計基礎篇6基礎資料型別③)Python程式設計資料型別
- JAVA-java日期工具類Java
- 『現學現忘』Git基礎 — 6、Git的操作流程Git
- 前端基礎_ES6前端
- MySQL基礎知識(6)MySql
- 一、ES6基礎
- 【WEB基礎】HTML & CSS 基礎入門(6)超連結WebHTMLCSS
- es6基礎知識
- C#基礎之介面(6)C#
- 6章 RxJava基礎實戰RxJava
- [今日白學]元件的基礎的基礎的基礎元件
- 學習MyBatis必知必會(6)~Mapper基礎的擴充MyBatisAPP
- Linux基礎學習——檔案基礎Linux
- 數學基礎
- 【重溫基礎】6.數字
- Go 基礎教程--6 陣列 ArrayGo陣列
- 【ES6基礎】迭代器(iterator)
- 【ES6基礎】Map與WeakMap
- 【ES6基礎】Set 與 WeakSet
- 【ES6基礎】const介紹
- corejava基礎知識(6)-檢視Java
- ES6快速上手 —— 基礎篇
- PHP天天學,原始碼開放下載PHP原始碼
- python基礎學習Python
- Redis 基礎學習Redis
- Linux基礎學習Linux
- 熱力學基礎
- Docker 基礎學習Docker
- Flume基礎學習