從一道例題談Arrays.toString()與其餘String的轉換方法 java.toString(),(String),String.valueOf的區別

  閱讀該篇文章前,請你們事先閱讀一下:   java.toString(),(String),String.valueOf的區別html

  

  有了上述基礎後,我接下來談談從一道題目中得到的些許收穫。java

  今天在作題是發現了很是重要的一點。題目來源:http://www.lintcode.com/en/problem/anagrams/數組

  咱們先來看一下兩種不一樣的解法:工具

解法一:post

/* use int[26] assuming it's all lowercase letters count each string char in a letter array int[], convert the array into string. HashMap carray string as key, and actualy string as value outupt all values */
public class Solution { public List<String> anagrams(String[] strs) { List<String> rst = new ArrayList<String>(); if (strs == null || strs.length == 0) { return rst; } HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); for (int i = 0; i < strs.length; i++) { int[] arr = new int[26]; for (int j = 0; j < strs[i].length(); j++) { arr[strs[i].charAt(j) - 'a'] += 1; } String arrString = Arrays.toString(arr); // 不能使用String.valueOf(arr);
            if (!map.containsKey(arrString)) { map.put(arrString, new ArrayList<String>()); } map.get(arrString).add(strs[i]); } //Output
        for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) { if (entry.getValue().size() >= 2) rst.addAll(entry.getValue()); } return rst; } }

解法二:url

/* Feels like put into a hashmap of each string's sorted version. <String, ArrayList<Sting>> compare each string. If match, add into it. reurn all that has >= 2 items */
public class Solution { public List<String> anagrams(String[] strs) { List<String> rst = new ArrayList<String>(); if (strs == null || strs.length == 0) { return rst; } HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); for (int i = 0; i < strs.length; i++) { char[] arr = strs[i].toCharArray(); Arrays.sort(arr); String s = String.valueOf(arr); // 不能使用arr.toString(), 可是能夠用Arrays.toString(arr);
                if (!map.containsKey(s)) { ArrayList<String> list = new ArrayList<String>(); map.put(s, list); } map.get(s).add(strs[i]); } //check instance occurs >= 2
            for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) { if (entry.getValue().size() >= 2) { rst.addAll(entry.getValue()); } } return rst; } }

     這邊咱們不討論該題目的具體解法(解法思路我已經寫在了註釋中,若還有能夠去個人GitHub下載,對應的程序:LintCode-Anagrams.java)。spa

  咱們能夠發現,在第一種解法中,我定義了一個int[]用來存儲每一個字符出現的個數。當我想要將它轉換爲String時,我第一次使用了String.valueOf(arr)這個方法code

  可是這是錯誤的。根據上面的總結咱們能夠得知String.valueOf()這個方法實際上在toString()方法的基礎上實現的。故咱們來看看int[],咱們發現它並無重寫toString方法,htm

故默認狀況下,它所返回的應該是該整形數組的內存地址。因此在這裏,咱們無論是調用String.valueOf(arr)仍是arr.toString()方法結果都是同樣的,而且都是錯誤的,它並不能blog

夠實現將整形數組轉換爲字符串。可是!Arrays.toString()不同,Arrays是一個工具類。在java中相似的Collections,Arrays等是工具類,目的是爲了方便開發人員們對其進行操做。

API中Arrays的描述是:

  • This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists. 
該類中的全部方法爲靜態的,能夠直接調用操做。因此,咱們來看一下Arrays.toString(int[])方法的描述:
  • Returns a string representation of the contents of the specified array. The string representation consists of a list of the array's elements, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (a comma followed by a space). Elements are converted to strings as by String.valueOf(int). Returns "null" if a is null

而且咱們能夠發現該方法還對int[], short[], double[], char[]等這些數據都實現了重寫。故咱們能夠放心地調用該方法爲咱們實現將一個數組轉換爲字符串。

注:Arrays做爲一個工具類還包含其餘許多好用的方法,如:sort(),fill()...等

  在解法二中,咱們定義了一個char[], 用來存儲通過Arrays.sort()排序的字符數組。將它轉換爲字符串的時候,咱們看到了它使用了String.valueOf(arr)這個方法。這時候咱們不由納悶, 

爲何第種解法中就可以使用該方法呢?緣由在於,String.valueOf()方法實現了對char[]類型的重寫,查閱API咱們能夠發現,存在方法:

  public static String valueOf(char[] data)   而且該方法的描述是:

  • Returns the string representation of the char array argument. The contents of the character array are copied; subsequent modification of the character array does not affect the newly created string.

由此能夠咱們能夠用過該方法將字符串數組轉換成字符串,可是並不可以使用arr.toString()方法將其轉換爲字符串。由於char[]並無重寫該方法(若要實現目的,能夠本身人爲地重寫該方法)。同時咱們能夠

發現String.valueOf()方法僅實現了valueOf(int), valueOf(float)...等這些方法,並無對int[], float[]這些類型進行實現。這個說明了在第一個解法中,咱們是不可以調用String.value(arr)來實現咱們的目的的。

  至此,對於該問題的分析已經結束了。總結以下:

  1. 將數組轉換爲一個字符串時最好利用Java提供的Arrays工具類來實現,該類中封裝了許多高效的代碼。多使用它們能夠爲開發工做帶來很多便利,亦可以提升開發效率。
  2. 要熟悉Java的API,如String類中並無實現valueOf(int [])方法,盲目調用並不可以達到咱們想要的目的。
相關文章
相關標籤/搜索