2016-11-23 178 views
1

這裏是我的代碼:CPU使用率( 「」)

String[] s = str.split(",") 

但是,由jstack文件,我發現代碼的使用率非常高。

java.lang.Thread.State: RUNNABLE 
    at java.util.Arrays.copyOfRange(Arrays.java:3664) 
    at java.lang.String.<init>(String.java:207) 
    at java.lang.String.substring(String.java:1969) 
    at java.lang.String.split(String.java:2353) 
    at java.lang.String.split(String.java:2422) 

爲什麼代碼需要Arrays.copyOfRange?我應該定義String[length]第一?

+0

你看了看代碼嗎? http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/lang/String.java#String.split%28java.lang.String%2Cint%29 –

+4

*「我發現代碼的用法非常高。」*相比什麼?這真的是你的應用程序的瓶頸嗎? – UnholySheep

+0

如果您正在使用Eclipse或Netbean之類的IDE,則可以跳轉到String類以查看爲什麼'split'方法調用Arrays.copyOfRange。 這很正常。 –

回答

2

爲什麼代碼需要Arrays.copyOfRange

因爲split創造了新的String S必填到substring(int beginIndex, int endIndex)其內部調用new String(char value[], int offset, int count),並作爲String不變,它提供的chararray的安全拷貝,避免了因爲否則受任何外部修改您的然後String實例可能是可變的,這是我們想要避免的。

檢查的String(char value[], int offset, int count)的Javadoc:

分配一個新的String包含從 字符數組參數的一個子字。 offset參數是子數組的第一個字符的 的索引,count參數指定子陣列的長度 。 子數組的內容被複制; 字符數組的後續修改不會影響 新創建的字符串。