数组的toString()方法返回的是啥???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的toString()方法返回的是啥???相关的知识,希望对你有一定的参考价值。

情况是这样子的
我这里是一个加密解密算法
解密后得到的是一个byte[]数组形式
然后我想把这个byte[]数组转换成String类型
String s = "abcdefg";
String s2 = encode(s);//对字符串加密得到s2

String s3 = decode(s2).toString();//对加密后得到的s2进行解密,decode方法返回值是一个byte[]类型的

String s4 = new String(decode(s2).toString());

System.out.println(s3+"------"+s4);
这样子打印出来后s3得到的是错误的,s4得到的就是"abcdefg"
我就想知道这里打印出来的s3得到的是什么东东???
sniper2003
那这里直接打印解密后得到的数组,如下:
System.out.println(decode(s2));
输出的和s3又是不同的啊!
如果s3是内存分布的话,那这里打印的又是什么呢??

参考技术A 数值数组是不能够整体输出的,
你可以使用循环输出
for(i=0;i<10;i++)
system.out.println(a[i]+"
");
而借助arrays.tostring(a)就节省了上面的循环步骤,而一步输出(当然,调用函数的内部进行了处理)。
参考技术B 无论是什么toString()方法返回的只有String 参考技术C toString()方法返回的是 字符串 参考技术D String
public String(byte[] bytes)通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。
当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。

参数:
bytes - 要解码为字符的 byte
从以下版本开始:
JDK1.1

看一眼这个方法的签名,就应该知道原因了。

s3得到的只是s2使用了toString()方法后的一组普通的字符串,这组字符串代表了执行decode(s2)方法后所得到的byte[]数组的内存分布状况。
s4得到的是一个String对象,而这个String对象的数据源,是一个byte[]数组,String(byte[])这个方法会将内存中的这组数字进行解码后的字符串原状。

补充:
decode(s2).toString()方法,返回的内存分布的字符串形式。而如果你直接用System.out.println(decode(s2))输出使用的System.out.println(byte[])方法,而不是System.out.println(String)方法。而你之前输出的是System.out.println(decode(s2).toString())。

System.out.println()有很多重载的方法,他们的实现也是各自不同的。本回答被提问者采纳
第5个回答  2008-10-12 你可以去看对应数组的源代码,会清楚很多

Array方法归类总结

数组的转换方法

valueOf()方法,数组调用该方法后返回的还是原来的数组。

toString()方法,数组调用该方法后会调用每一项的toStirng()方法,之后将每一项拼接成一个以逗号分割的字符串。

toLocaleString()方法,把数组转换为本地字符串,这个方法与toString()方法的作用相同,大多数时候返回的结果也相同。调用的是每一项的toLocaleString()方法。

join()方法,同样是将数组转换为字符串,不穿参数或者参数为undefined的情况下,等同于toString()方法。传递参数将以特定的字符分隔。

数组的检测方法

instanceof构造函数,确定一个对象是否由相应的构造函数创建或者原型链继承自某个构造函数。

Array.isArray()方法,只为确定这个对象是否为数组。

Object.prototype.toString.call()方法,通过调用Object原型中的方法确定具体的对象类型。

数组的查找方法

indexOf()方法,查找数组的某一项,这里对比是否相等时,使用的是===(全等操作符),所以NaN不会与任何值相等,对象数组中的对象也要值和引用都相等。找到返回索引位置,未找到返回-1。

lastIndexOf()方法,和indexOf()方法相同,只不过前者从前向后,即查找第一次出现的位置,而后者从后向前,即查找最后一次出现的位置,两个方法可以接收第二个参数,为起始查找的位置。

数组的排序方法

reverse()方法,用于翻转数组。

sort()方法,排序数组,默认为字典序排序,在比较的时候比较的数组每个项的字符串所以对于排序后会出现不想要的结果。所以接收一个比较函数,这个比较函数接收两个参数,分别代表数组的项,如果第一个参数位于应该位于第二个参数之前返回一个负数,如果第一个参数应该在第二个参数之后返回一个正数,相等则返回0。

数组的栈方法(队列方法就是从后面添加从后面删除)

push()方法,用于向数组的末尾添加任意数量的新项,返回的是更新后数组的length值。

pop()方法,删除数组末尾的一项,返回的是删除的项,同时会更新数组的length值。

 

数组的队列方法(队列方法就是从后面添加从前面删除)

push()方法,用于实现从后面添加。

shift()方法,用于删除数组的第一项,返回的是删除的项,同时更新length值。

unshift()方法,与push()方法遥相呼应,unshift()方法用于项数组的前端添加任意的项数,返回更新后的length值。

数组的操作方法

concat()方法,接受数组或者其它数据类型,添加到数组的后端。

slice()方法,基于原始数组创建子数组,两个参数分别是,起始位置和结束位置(不包含),如果没有结束位置则到最后。

splice()方法,数组的万能方法,用于删除、添加、替换。

数组5个迭代方法

这五个方法都接两个参数,分别是一个函数和在那个作用域中运行影响this的值。这个函数可以接受三个参数,分别是数组的项、索引、数组本身。

every()方法,运行指定的函数,如果数组每一项都符合函数的执行条件则返回true。

some()方法,运行指定的函数,如果数组中有一项符合函数的执行条件则返回true。

filter()方法,运行指定的函数,返回符合函数执行条件后的数组。

map()方法,运行指定的函数,返回对每一项执行函数后结果的数组。

forEach()方法,与map()方法类似,没有返回值。

两个归并方法

这两个方法都接收两个参数,分别是一个函数和运行递归的初始值。这个函数接收四个参数,初始值(累加项)、当前值,索引和函数本身。

reduce()方法,从第一项开始。

reduce()方法,从最后一项开始。

以上这些方法能够改变原数组的有

reverse(),sort()

push(),pop()

unshift(),shift()

slice(),splice()

以上这些方法不能改变原数组的有

valueOf(),toString(),join(),toLocaleString()

indexOf(),lastIdexOf()

concat()

some(),every(),filter(),map(),forEach()

reduce(),reduceRight()

以上是关于数组的toString()方法返回的是啥???的主要内容,如果未能解决你的问题,请参考以下文章

为什么toString方法可以用来区分数组和对象?

Js toString()方法笔记

Array方法归类总结

究竟返回 EntityUtils.toString(response) 是啥?

datatable.rows.indexof(dr)返回的是啥?

javascript中toString()方法的用法?