阅读该篇文章前,请你们事先阅读一下: 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的描述是:
而且咱们能够发现该方法还对int[], short[], double[], char[]等这些数据都实现了重写。故咱们能够放心地调用该方法为咱们实现将一个数组转换为字符串。
注:Arrays做为一个工具类还包含其余许多好用的方法,如:sort(),fill()...等
在解法二中,咱们定义了一个char[], 用来存储通过Arrays.sort()排序的字符数组。将它转换为字符串的时候,咱们看到了它使用了String.valueOf(arr)这个方法。这时候咱们不由纳闷,
为何第种解法中就可以使用该方法呢?缘由在于,String.valueOf()方法实现了对char[]类型的重写,查阅API咱们能够发现,存在方法:
public static String valueOf(char[] data) 而且该方法的描述是:
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)来实现咱们的目的的。
至此,对于该问题的分析已经结束了。总结以下: