String用法詳解(equal原始碼 ==和equal的解釋、字面賦值和new賦值效率、重寫了hashcode的方法解釋)
String a = “abc”;//在字串池中找abc,如果有,就直接返回地址,如果沒有就加值abc然後再返回地址(此方式的值是存放在字串池中)
String b = “abc”;
String c = new String("abc");//在字串池中找abc,如果有,就不管,如果沒有就在物件池中加個abc,然後在堆中建一個物件abc,返回地址(此方式值存放在堆中的)
String d = new String("abc");
a ==b true
a.equal(b) true
b==c false;
b.equal(c) true;
c==d false;
c.equal(d) true;
equals方法說明
如果是String物件就呼叫string的equals,就比較他的值
如果是其他物件,預設呼叫Object的equals,比較是不是同一個引用和==相同,
如果是其他物件,而且自己實現了equals方式,就按照他自己的equals物件的比較方式。
Object equal方法的原始碼
public boolean equals(Object obj) {
return (this == obj);// 判斷呼叫物件和傳入物件的地址是不是一樣的
}
Stirng 的 equal 方法的原始碼
public boolean equals(Object anObject) {
// 自己跟自己比
if (this == anObject) {
return true;
}
if (anObject instanceof String) {// 判斷是 String 的例項
String anotherString = (String)anObject;// 強制轉化 , 以防父類用子類的方法用不到
// 一個字元一個字元的比較
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
java String 的字面賦值方式
public String intern()
Returns a canonical (標準)representation for the string object.
A pool of strings, initially empty, is maintained(維護) privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined(決定) by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
All literal(字面) strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification
Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
Lexical Structure >Literals >String Literals
The Java Language Specification (所有虛擬機器都必須要實現的東西)
字串池裡面是不會丟的, 而堆裡面是會被回收的,使用字面建string效率會高.
string的hashcode的原始碼
/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
//就是按s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]公式來生成int序列
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
相關推薦
String用法詳解(equal原始碼 ==和equal的解釋、字面賦值和new賦值效率、重寫了hashcode的方法解釋)
String a = “abc”;//在字串池中找abc,如果有,就直接返回地址,如果沒有就加值abc然後再返回地址(此方式的值是存放在字串池中) String b = “abc”; String c = new String("abc");//在字串池中找a
C++ string 用法詳解--原作者是Nicolai M.Josuttis
任何人對本文進行引用都要標明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 語言是個十分優秀的語言,但優秀並不表
C++ STL string 用法詳解
一、string的初始化 首先,為了在程式中使用string型別,必須包含標頭檔案 <string>。如下: #include <string> 注意這裡不是string.h,string.h是C字串標頭檔案。 string類是一個模板類
C++ string 用法詳解
任何人對本文進行引用都要標明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 語言是個十分優秀的語言,但
String用法詳解
string類宣告string類本不是STL的容器,但是它與STL容器有著很多相似的操作,因此,把string放在這裡一起進行介紹。 之所以拋棄char*的字串而選用C++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為一個
2020了你還不會Java8新特性?(五)收集器比較器用法詳解及原始碼剖析
收集器用法詳解與多級分組和分割槽 為什麼在collectors類中定義一個靜態內部類? static class CollectorImpl<T, A, R> implements Collector<T, A, R> 設計上,本身就是一個輔助類,是一個工廠。作用是給開發者提供常見的
C++模版STL中 map 和 string, vector 的用法詳解
參考: 1. map 用法詳解 std map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提
SVN trunk(主線) branch(分支) tag(標記) 用法詳解和詳細操作步驟
trac load mar span 必須 最可 objc copy 右鍵 原文地址:http://blog.csdn.net/vbirdbest/article/details/51122637 使用場景: 假如你的項目(這裏指的是手機客戶端項目)的某個版本(例如1.0
oracle中的exists 和not exists 用法詳解
sdn ref 用法詳解 html nbsp e30 .net tail sin oracle中的exists 和not exists 用法詳解 http://blog.csdn.net/zhiweianran/article/details/7868894oracle
js數組中foEach和map的用法詳解 jq中的$.each和$.map
cnblogs arr 對象 cal for index source asc 原生js 數組中foEach和map的用法詳解 相同點: 1.都是循環遍歷數組(僅僅是數組)中的每一項。 2.forEach() 和 map() 裏面每一次執行匿名函數都支持3個參數:數組中的
C#中string.format用法詳解
個數 date 其中 位置 tr1 bsp 位數 數值 日期格式化 tring.Format 方法的幾種定義: String.Format (String, Object) 將指定的 String 中的格式項替換為指定的 Object 實例的值的文本等效項。String.F
Django基礎(10): URL重定向的HttpResponseDirect, redirect和reverse的用法詳解
detail djang 包含 war sed 模型 博客 nbsp rep 利用django開發web應用, 我們經常需要進行URL重定向,有時候還需要給URL傳遞額外的參數。比如用戶添加文章完成後需要轉到文章列表或某篇文章詳情。因此熟練掌握HttpResponseDir
Tag檔案和Tag標記的用法詳解
Tag檔案和Tag標記
SQL中INNER、LEFT、RIGHT JOIN的區別和用法詳解
相信很多人在剛開始使用資料庫的INNER JOIN、LEFT JOIN和RIGHT JOIN時,都不太能明確區分和正確使用這三種JOIN操作,本文通過一個簡單的例子通俗易懂的講解這三者的區別,希望對大家能帶來幫助。 首先,我們建立示例資料庫和表。同時也要明確一個概念:A INN
bowtie和bowtie2用法詳解
bowtie 短序列比對工具詳解 常見的短序列比對工具有很多,如fasta、blast、bowtie、shrimp、soap等。每個工具都有其自身的優點,但同時也具備了一些缺點。權衡利弊,我選擇bowtie作為主要的短序列比對工具。它速度很快,比對結果也容易理解。 現在舉個例子來探討bowtie
%date~0,4%和 %time~0,2%等用法詳解
在windows中,有個原始並且功能強大的批處理,好像是被人遺忘了,比如博主最近在一個專案中就用到它,非常好用。今天就和博主一直來看看用批處理生動生成每日的資料夾。 為了能正確地生成每天的日期資料夾,請先將本機時間的短日期格式設定為yyyy-MM-dd。 然後就開始寫bat批處理檔案了,新
Apache ab壓力測試工具Window下載和用法詳解
ab是apache自帶的網站壓力測試工具。 使用起來非常的簡單和方便。 不僅僅是可以apache伺服器進行網站訪問壓力測試,還可以對其他型別的伺服器進行壓力測試。 比如nginx,tomcat,IIS等 首先當然是下載安裝了。 在這裡只講window下在下載安裝 官方下載地址:,(htt
Python生成器(Generator)和yield用法詳解
通過列表生成式,我們可以直接建立一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立一個包含100萬個元素的列表,不僅佔用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。 所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的
js原生之scrollTop、offsetHeight和offsetTop等屬性用法詳解
本文轉載自:https://www.cnblogs.com/koleyang/p/4939853.html **scrollTop、offsetHeight和offsetTop等屬性用法詳解:** 標題中的幾個相關相關屬性在網頁中有這大量的應用,尤其是在運動框架中,但是由於有些屬性相互之間的
java中的值傳遞和引用傳遞用法詳解
值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。 引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的