如何有效率地使用字串
来源:互联网 发布:gulp.js是什么 编辑:程序博客网 时间:2024/04/27 00:35
看完上篇(請參考九月十二日的Java週報)筆者所講解的物件的比較之後,
既然講到了字串,筆者就再來跟大家討論一下,如何有效率地使用字串。
你也許會有疑問說,字串就這樣用啊,什麼叫有效率的使用字串呢?我們
先來確定一件事情,Java API說明文件上有這麼一行字:
“Strings are constant; their values cannot be changed after they are created.String buffers support mutable strings. Because String objectsare immutable they can be shared.”。
意思是字串是個常數,是不可
更改的,也就是說你對一個字串物件做任何的修改,像是加上另一個串、
把字母變大寫等等,都會產生一個新的字串物件。我們做個小小的測試,
來証明這件事情。
String str1 = new String(“hello”);String str2 = str2;boolean b1 = str1 == str2;
還記得上週筆者講解的字串之間比較嗎?b1得到的結果是true,代表str1
和str2參考到同一個字串物件,忘記或是不清楚的讀者,再回去翻翻週報
的內容。如果現在我們把str2加上“java”這個字串:
str2 = str2 + “java”;boolean b2 = str1 == str2;
你會發現b2的結果是false,代表str1和str2所參考的字串物件已經不是同
一個了!現在在系統中就有三個字串物件,一個是“hello”,第二個是“
java”,第三個是“hellojava”。因為在Java中,字串有這樣一個不可修
改的特性,所以才會引發出如何有效地使用字串這個問題出來。
字串是每個應用程式都會用到的物件,常常有些程式中會對字串做大量的
運算,尤其是兩個字串的相加,例如我們寫了一個從網路上讀取網頁資料
的程式,跑個迴圈,用BufferedReader物件一次讀一行進來,然後把每一
行再加在一起。像這種很直覺、很簡單的程式,兩行就搞定了,可是JVM中
所做的事情可多了。 假設我們寫個一程式,要把一個字串一直加上“a”
一百次,很直覺得我們會這樣寫:
String str = “”;for (int i=0; i<100; i++)str += “a”;
可是你知道在記憶體中會產生多少的垃圾出來嗎?總共會有a、aa、aaa、
aaa….,無疑的,上述的程式雖然簡單,但浪費了不少的記憶體,而且產
生物件和物件的存取也會花掉不少的時間,我們加上幾行程式碼來測試所
花的時間和記憶體:
long startTime = System.currentTimeMillis();long startMem = Runtime.getRuntime().freeMemory();for (int i=0; i<1000; i++)str += "a";long endMem = Runtime.getRuntime().freeMemory();System.out.println("Use memory: "+ (startMem - endMem));long endTime = System.currentTimeMillis();System.out.println("Use Time: "+ (endTime – startTime));
上面的程式在筆者的PIII-800的電腦上跑,平均花了50 ms和151256 bytes
的記憶體,時間還好,但記憶體使用量算蠻大的了。那我們要如何來改進
讓程式更有效率呢?因為String物件是不可修改的,可是程式中又常需要
這樣的一個動作,所以Java提供了另外一個類別,專門來處理字串運算用
的,這個類別就叫作StringBuffer。StringBuffer類別提供了很多方法來
做字串的運算,但如附加、刪除、插入、反轉、替換等等…。我們就用
StringBuffer類別所提供的附加(append)方法來做到跟上面那個例子同樣
的結果:
StringBuffer sb = new StringBuffer();long startTime = System.currentTimeMillis();long startMem = Runtime.getRuntime().freeMemory();for (int i=0; i<1000; i++)sb.append(“a”);long endMem = Runtime.getRuntime().freeMemory();System.out.println("Use memory: "+ (startMem - endMem));long endTime = System.currentTimeMillis();
修改過的程式在筆者電腦上跑,平均花了0 ms和4854 bytes的記憶體。
0 ms?!多跑幾次有時會到10 ms,要看你電腦CPU目前的負載如何,不
過跟前面的例子比較起來,已經算是快了,而且記憶體也使用的非常少
。這只是個小小的例子,如果字串量再大一點,兩者的差異會更明顯。
所以結論就是,如果你的程式中會對字串做大量的修改時,請改用
StringBuffer類別,它會明顯示改進你程式的效率。至於StringBuffer
類別所提供的方法詳細的使用說明,就請自行參閱Java API。
- 如何有效率地使用字串
- 如何有效率地使用时间
- 李开复:如何有效率地利用时间?
- 如何在网上最有效率地推广软件
- 如何有效率地学习并精通一项技术
- 软件集成策略——如何有效率地提升质量
- 软件集成策略——如何有效率地提升质量
- 软件集成策略——如何有效率地提升质量
- 如何通过使用两台电脑变得更加有效率
- 如何学习OpenCV有效率
- 有效率地工作有质量的生活
- 有效率地工作有质量的生活
- 技术帖:如何在高强度的工作、学习环境中健康、快乐、有效率地生活--健康篇
- 如何更好地使用搜索引擎
- 如何聪明地使用锁
- 如何聪明地使用锁
- 如何聪明地使用锁
- 如何稳定地使用 Google
- 实现树状结构的两种方法
- Proxool - 快速入門
- 忘记WinXP登录口令后的一种应急办法
- 电脑自动重启、关机的故障排解(四)——一些地方再次回顾
- Cisco路由技术基础知识详解
- 如何有效率地使用字串
- DOS下更改IP
- 分区容量
- 家庭局域网应用中网络软硬故障的解决
- 局域网问题解决方法
- 网络经典命令行2
- 老是重启问题(五)——例子
- 二层交换机,三层交换机,四层交换机的区别
- 接入网及其名词术语