1.先看字串的object_id
str1="Anleb"str2="Anleb"puts str1.object_idputs str2.object_id
輸出:
22952500
22952490
id不同說明,雖然對象的值一樣,但是他們是不同的東西,什麼是不同的東西,也就是指標不同。
str1指標----> 對象
str2指標----> 對象
題外話:不像咱們的c#、java有字串駐留技術,ruby沒有駐留技術的String對象,但是有駐留技術的Fixnum,false,true,不信,我實驗給你看
s1=falses2=falses3=trues4=trues5=1s6=1puts s1.object_idputs s2.object_idputs s3.object_idputs s4.object_idputs s5.object_idputs s6.object_id
輸出:
0
0
2
2
3
3
駐留技術在ruby也存在,但是不同於其他語言,它是利用“符號”這種技術實現,簡單說一下吧,畢竟這篇不是針對符號來說的:
n1=:"id"n2=:idp n1.object_idp n2.object_id
輸出:
30498
30498
第一結論:字串多次出現為了效能,能用符號表示盡量用符號表示。
2.再看字串的相加
str1="Anleb"puts str1puts str1.object_id#22952460str1=str1+"boy"puts str1puts str1.object_id#22952430
說明字串相加是產生新的對象
str1="Anleb"puts str1puts str1.object_id#22952460str1=str1 << "boy"puts str1puts str1.object_id#22952460
說明利用 << 卻不會New出新的對象,也減少了記憶體的開銷
題外話:+= << concat的效能測試
require 'benchmark'n1="abc"n2="abc"n3="abc"Benchmark.bm do |bm| bm.report("<<") do 10000.times {n1 << "abc"} end bm.report("+=") do 10000.times { n2+="abc"} end bm.report("concat") do 10000.times { n3.concat("abc")} end end輸出: user system total real<< 0.000000 0.000000 0.000000 ( 0.000000)+= 0.187000 0.063000 0.250000 ( 0.266000)concat 0.016000 0.000000 0.016000 ( 0.015000)
第二結論:字串盡量使用<< 相加,減少開銷。
3.再說"!"
大家都知道方法後面帶 ! 是危險的操作,可是到底為什麼危險呢?
str1="anleb"puts str1puts str1.object_idstr2=str1.capitalizeputs str1puts str2puts str2.object_idstr3=str1.capitalize!puts str1puts str3puts str3.object_id
輸出:
anleb
22951930
anleb
Anleb
22951910
Anleb
Anleb
22951930
先看id,不帶!返回的是一個新的字串,帶!是返回修改後的原字串本身。
4.最後說字串的複製
str1="Anleb"str2=str1p str1.object_idp str1.object_idstr3=str1.clonep str3.object_idstr4=str1.dupp str4.object_idstr5=String.new(str1)p str5.object_id
輸出:
22951960
22951960
22951930
22951910
22951890
str1與2相等大家都知道,他們是引用複製,這裡不談論clone、dup、String.new是淺複製還是深度複製。
字串的效能取決於操作字串的記憶體的開銷與否。