阅读该篇文章前,请大家事先阅读一下:   java.toString(),(String),String.valueOf的区别

  

  有了上述基础后,我接下来谈谈从一道题目中获得的些许收获。

  今天在做题是发现了非常重要的一点。题目来源:http://www.lintcode.com/en/problem/anagrams/

  我们先来看一下两种不同的解法:

解法一:

  1. /*
  2. use int[26] assuming it's all lowercase letters
  3. count each string char in a letter array int[], convert the array into string.
  4. HashMap carray string as key, and actualy string as value
  5. outupt all values
  6. */
  7. public class Solution {
  8. public List<String> anagrams(String[] strs) {
  9. List<String> rst = new ArrayList<String>();
  10.  
  11. if (strs == null || strs.length == 0) {
  12. return rst;
  13. }
  14.  
  15. HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
  16.  
  17. for (int i = 0; i < strs.length; i++) {
  18. int[] arr = new int[26];
  19. for (int j = 0; j < strs[i].length(); j++) {
  20. arr[strs[i].charAt(j) - 'a'] += 1;
  21. }
  22.  
  23. String arrString = Arrays.toString(arr);
  24. // 不能使用String.valueOf(arr);
  25. if (!map.containsKey(arrString)) {
  26. map.put(arrString, new ArrayList<String>());
  27. }
  28. map.get(arrString).add(strs[i]);
  29. }
  30.  
  31. //Output
  32. for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
  33. if (entry.getValue().size() >= 2)
  34. rst.addAll(entry.getValue());
  35. }
  36.  
  37. return rst;
  38. }
  39. }

解法二:

  1. /*
  2. Feels like put into a hashmap of each string's sorted version. <String, ArrayList<Sting>>
  3. compare each string. If match, add into it.
  4. reurn all that has >= 2 items
  5. */
  6. public class Solution {
  7. public List<String> anagrams(String[] strs) {
  8. List<String> rst = new ArrayList<String>();
  9.  
  10. if (strs == null || strs.length == 0) {
  11. return rst;
  12. }
  13.  
  14. HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
  15.  
  16. for (int i = 0; i < strs.length; i++) {
  17. char[] arr = strs[i].toCharArray();
  18. Arrays.sort(arr);
  19. String s = String.valueOf(arr);
  20. // 不能使用arr.toString(), 但是可以用Arrays.toString(arr);
  21. if (!map.containsKey(s)) {
  22. ArrayList<String> list = new ArrayList<String>();
  23. map.put(s, list);
  24. }
  25. map.get(s).add(strs[i]);
  26. }
  27. //check instance occurs >= 2
  28. for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
  29. if (entry.getValue().size() >= 2) {
  30. rst.addAll(entry.getValue());
  31. }
  32. }
  33. return rst;
  34. }
  35. }

     这边我们不讨论该题目的具体解法(解法思路我已经写在了注释中,若还有可以去我的GitHub下载,对应的程序:LintCode-Anagrams.java)。

  我们可以发现,在第一种解法中,我定义了一个int[]用来存储每个字符出现的个数。当我想要将它转换为String时,我第一次使用了String.valueOf(arr)这个方法

  但是这是错误的。根据上面的总结我们可以得知String.valueOf()这个方法实际上在toString()方法的基础上实现的。故我们来看看int[],我们发现它并没有重写toString方法,

故默认情况下,它所返回的应该是该整形数组的内存地址。所以在这里,我们不管是调用String.valueOf(arr)还是arr.toString()方法结果都是一样的,并且都是错误的,它并不能

够实现将整形数组转换为字符串。但是!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 [])方法,盲目调用并不能够达到我们想要的目的。

从一道例题谈Arrays.toString()与其他String的转换方法的更多相关文章

  1. Arrays.toString Arrays.asList

    import java.util.Arrays; public class TestCalc{ public static void main(String[] args) { ,,,,,,,}; / ...

  2. Arrays.toString(a)--->将数组a的值转换为字符串

    Arrays.toString(数组)是java内置类Arrays类的一个方法,具体查Api可知.因为数组是不可直接输出的,它的作用是将数组转换为字符串.其实用for循环也是可以做到的,只不过比for ...

  3. 浅谈Arrays.asList()方法的使用

    首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...

  4. Arrays.toString 如果传入的是对象 那么调用的是此对象的toString

    Arrays.toString(Object[] obj) 如果传入参数的是对象 那么调用的是此对象的toString

  5. 对数组随机赋值,并输出(Arrays.toString(arr))

    import java.util.Arrays; public class Demo { public static void main(String[] args) { int[] arr = ne ...

  6. Arrays.toString的作用

    Arrays.toString()的作用是用来很方便地输出数组,而不用一个一个地输出数组中的元素. 这个方法是是用来将数组转换成String类型输出的,入参可以是long,float,double,i ...

  7. Java中toString()与new String()

    Java中toString()与new String(): 1.错误演示: FileInputStream fileIn = new FileInputStream(filePath);byte[] ...

  8. 【Java集合的详细研究2】浅谈Arrays.asList的使用

    首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...

  9. preg_replace函数/e 模式下的代码执行+一道例题

    目录 例一 例二 补充 看一道ctf题-----[BJDCTF2020]ZJCTF,不过如此 参考链接 例一 源码: <?php preg_replace('/(.*)/ei', 'strtol ...

随机推荐

  1. 用VsCode编辑TypeScript

    文地址:https://code.visualstudio.com/Docs/languages/typescript TypeScript是Javascript的超集,它提供了类.模块.接口来帮助你 ...

  2. 【Android Widget】2.ImageView

    1.属性详解 1.1 ScaleType属性详解 ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等. 设置的方式包括: 1 ...

  3. PHP三维数组拼装

    foreach ($records as $k => $v) { foreach ($records as $m => $n) { if ($v['days'] == $n['days'] ...

  4. 省市区三级联动(jquery+ajax)(封装和不封装两种方式)-----2017-05-15

    首先,要实现如下图效果, 1.要理清思路: 先做出三个下拉菜单----根据第一个下拉菜单的value值获取第二个下拉列表的内容,第三个同理. 2.用到的数据库表:Chinastates表 规律:根据国 ...

  5. 小程序的1024KB

    1024kb 只是一个目前编译后代码可上传最大限制,至于后期会不会更改,不得而知.个人只是想借 1024kb 来和大家一起交流一下,如何在限制下,挥舞大刀- 微信官方回答了,为什么有 1024kb 的 ...

  6. CollectioView滚动到指定section的方法

    项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行,滚动collectionView自动切换到顶部指定的标签 实 ...

  7. OpenCV探索之路(十四):绘制点、直线、几何图形

    绘制点和圆 void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int li ...

  8. .net操作压缩文件

    附件:SharpZipLib.zip public class UnZipClass//解压 { /// <summary> /// 解压功能(解压压缩文件到指定目录) /// </ ...

  9. spring-定时器(1)

    先看一个例子 一.demo1(MethodInvokingJobDetailFactoryBean) 1.要执行业务类 public class BusinessReport { public voi ...

  10. springboot 1.5.2 thymeleaf 添加templates 静态资源访问路径

    从velocity 模板切换到thymeleaf 后, 默认模板位置为templates , 有时候静态资源方在该目录下会出现访问404错误 解决办法: application.properties ...