从一道例题谈Arrays.toString()与其他String的转换方法
阅读该篇文章前,请大家事先阅读一下: java.toString(),(String),String.valueOf的区别
有了上述基础后,我接下来谈谈从一道题目中获得的些许收获。
今天在做题是发现了非常重要的一点。题目来源:http://www.lintcode.com/en/problem/anagrams/
我们先来看一下两种不同的解法:
解法一:
/*
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;
}
}
解法二:
/*
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)。
我们可以发现,在第一种解法中,我定义了一个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.
- 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
chararray 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)来实现我们的目的的。
至此,对于该问题的分析已经结束了。总结如下:
- 将数组转换为一个字符串时最好利用Java提供的Arrays工具类来实现,该类中封装了许多高效的代码。多使用它们可以为开发工作带来不少便利,亦能够提高开发效率。
- 要熟悉Java的API,如String类中并没有实现valueOf(int [])方法,盲目调用并不能够达到我们想要的目的。
从一道例题谈Arrays.toString()与其他String的转换方法的更多相关文章
- Arrays.toString Arrays.asList
import java.util.Arrays; public class TestCalc{ public static void main(String[] args) { ,,,,,,,}; / ...
- Arrays.toString(a)--->将数组a的值转换为字符串
Arrays.toString(数组)是java内置类Arrays类的一个方法,具体查Api可知.因为数组是不可直接输出的,它的作用是将数组转换为字符串.其实用for循环也是可以做到的,只不过比for ...
- 浅谈Arrays.asList()方法的使用
首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...
- Arrays.toString 如果传入的是对象 那么调用的是此对象的toString
Arrays.toString(Object[] obj) 如果传入参数的是对象 那么调用的是此对象的toString
- 对数组随机赋值,并输出(Arrays.toString(arr))
import java.util.Arrays; public class Demo { public static void main(String[] args) { int[] arr = ne ...
- Arrays.toString的作用
Arrays.toString()的作用是用来很方便地输出数组,而不用一个一个地输出数组中的元素. 这个方法是是用来将数组转换成String类型输出的,入参可以是long,float,double,i ...
- Java中toString()与new String()
Java中toString()与new String(): 1.错误演示: FileInputStream fileIn = new FileInputStream(filePath);byte[] ...
- 【Java集合的详细研究2】浅谈Arrays.asList的使用
首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...
- preg_replace函数/e 模式下的代码执行+一道例题
目录 例一 例二 补充 看一道ctf题-----[BJDCTF2020]ZJCTF,不过如此 参考链接 例一 源码: <?php preg_replace('/(.*)/ei', 'strtol ...
随机推荐
- 企业Centos服务器分区常用方案
方案一: 一般公司生产环境,数据不是非常重要,集群架构中的一个节点服务器: /boot: 200M swap: 8G内存以下,1.5倍 8G内存以上,设置8G就够了 / : 剩下的所以存储空间 方案二 ...
- Visual Studio for Mac 初体验
你喜爱的 IDE,现在可用于 Mac 来自:https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/ 惊不惊喜?意不意外?惊喜但不意外,因为 ...
- [刷题]算法竞赛入门经典(第2版) 4-7/UVa509 - RAID!
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa509 - RAID! #include<iostream> ...
- tomcat启动一闪而过问题的解决
1.今天使用startup.bat启动tomcat报错,现象是一闪而过,在logs文件夹中有没有日志文件, 可以在控制台输入startup.bat,如下: 但是也没有看出什么太有用的错误,然后可以 ...
- 由"永恒之蓝"病毒而来的电脑科普知识
永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...
- winXP/win7/win10系统关闭445端口方法全攻略
近日有多个高校发布了关于连接校园网的电脑大面积中勒索病毒的消息,这种病毒致使许多高校毕业生的毕业论文(设计)被锁.受害机器的磁盘文件会被篡改为相应的后缀,图片.文档.视频.压缩包等各类资料都无法正常打 ...
- HTTP 和 HTTPS
一.HTTP协议 最近看了一些网络通信方面的书籍,研究了一下 HTTP 和 TCP/IP,有了一些新的收获和理解,在这里做个归纳和总结. (1)什么是HTTP协议 HTTP (HyperText Tr ...
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 22: invalid continuation byte
在使用python读取文本文件,一般会这样写: # -*- coding:utf-8 -*- f = open("train.txt", "r", encodi ...
- THREE笛卡尔右手坐标系详解
1,正常的笛卡尔右手坐标系,以屏幕右方为+X轴,屏幕上方为+Y轴,垂直屏幕向外为+Z轴,如下图,xy轴组成的平面为屏幕面 但由于THREE里的相机并不总是从屏幕正前方视角,还可以设置坐标系任意一个轴为 ...
- 你知道现在有一种新的OCR技术叫“移动端车牌识别”吗?
核心内容:车牌识别.OCR识别技术.移动端车牌识别.手机端车牌识别.安卓车牌识别.Android车牌识别.iOS车牌识别 一.移动端车牌识别OCR技术研发原理 移动端车牌识别是基于OCR识别的一种应用 ...