1. 程式人生 > >String用法詳解(equal原始碼 ==和equal的解釋、字面賦值和new賦值效率、重寫了hashcode的方法解釋)

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數組中foEachmap的用法 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, redirectreverse的用法

detail djang 包含 war sed 模型 博客 nbsp rep 利用django開發web應用, 我們經常需要進行URL重定向,有時候還需要給URL傳遞額外的參數。比如用戶添加文章完成後需要轉到文章列表或某篇文章詳情。因此熟練掌握HttpResponseDir

Tag檔案Tag標記的用法

                                      Tag檔案和Tag標記

SQL中INNERLEFTRIGHT JOIN的區別用法

相信很多人在剛開始使用資料庫的INNER JOIN、LEFT JOIN和RIGHT JOIN時,都不太能明確區分和正確使用這三種JOIN操作,本文通過一個簡單的例子通俗易懂的講解這三者的區別,希望對大家能帶來幫助。 首先,我們建立示例資料庫和表。同時也要明確一個概念:A INN

bowtiebowtie2用法

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原生之scrollTopoffsetHeightoffsetTop等屬性用法

本文轉載自:https://www.cnblogs.com/koleyang/p/4939853.html **scrollTop、offsetHeight和offsetTop等屬性用法詳解:** 標題中的幾個相關相關屬性在網頁中有這大量的應用,尤其是在運動框架中,但是由於有些屬性相互之間的

java中的傳遞引用傳遞用法

       值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。   引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的