这边先说下,因为笔者在百度的时候发现的这种情况不止这一种,所以这边先把问题先抛出来,以便能让其他读者寻找资料的时候更为方便
大体问题如下,就是说笔者当时当天是打了一篇代码然后吃惊的发现这个代码所运行出来的输出太长以后便不能粘贴,当时笔者就懵逼了,因为它的输出如果是短的话,是可以进行一个粘贴的。
(这边强调一下这篇文章只针对于eclipse的编译器语言是java)其他的编译器这边没有进行一个测试。
这边先说笔者得出的结论:每个编译器处理默认数据的方式都不一样,这边的这种情况是编译器对数组的默认数据处理的问题;
首先这边是因为笔者在一个日常敲代码的过程中发现的一个问题。
这边先把代码给丢上来,各位可自行测试。
import java.util.*;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
char[][] fa = new Di().tofan(in.nextInt());
for(int i = 0;i<fa.length;i++) {
for(int j=0;j<fa[0].length;j++) {
System.out.print(fa[i][j]);
}
System.out.println();
}
System.out.println();
}
}
}
class Di{
char[][] sa ;
public Di() {
sa = new char[1][1];
sa[0][0] = '+';
}
public char[][] tofan(int fa){
if(fa == 1) {
return sa;
}else {
fa--;
char[][] sb = new char[sa.length*3][sa[0].length*3];
for(int j=0;j<sa.length;j++) {
for(int k=sa.length;k<(sa.length)*2;k++) {
sb[j][k] = sa[j][k-(sa.length)];
}
}
for(int j=sa.length;j<(sa.length)*2;j++) {
for(int k=0;k<(sa.length)*3;k++) {
sb[j][k] = sa[j-(sa.length)][k%(sa.length)];
}
}
for(int j=(sa.length)*2;j<(sa.length)*3;j++) {
for(int k=sa.length;k<(sa.length)*2;k++) {
sb[j][k] = sa[j-((sa.length)*2)][k-(sa.length)];
}
}
sa = sb;
this.tofan(fa);
}
return sa;
}
}
这篇代码的作用是重复一个图形然后输出,输入只有一个int类型的数据。
然后各位可以看看输出。
这边先把上面这个问题代码的问题交代一下。但这边需要有点知识的铺垫。首先看过代码的读者应该知道,我的上面的那个数组的实现是利用char数组进行一个实现的。然后看下下面这张图。
此时可以知道我的char数组中的很多元素是没有进行一个赋值操作的。然后这边就会出现一个问题,数组使用的是默认的值。所以,问题就在这里,因为我们的输出此时默认为0(char数组的默认值为0)在eclipse中对于char数组的默认处理输出是一个空格(至少在我们看来是这样的。)
所以当时也怀疑了是编译器的问题,所以当时我就用了别人的idea编译器然而这个时候的别人的编译器的可以直接复制出来的,所以这边就可以反映了一个问题就是说,每个编译器对于默认数组的值处理的方法是不一样的。
此时如何在eclipse里面发现这个问题呢~(和解决这个问题)
其实也很简单只要把这个代码中的char的数组类型更改为String即可。此时就会发现一个问题。此时在没有改动代码的情况下,本该输出的字符变为了一些null 就像这样。
先丢一个代码没改之前的输出;
这个是该代码以后的输出。
更改以后的输出是可以输出的,此时 就可以知道了应该是数据类型的问题。
此时就可以进行一个总结了:
也就是说,java的char数组首先不是对象,对数据的处理没有那么严格,相反java中的string就是一个对象对于数据的处理会更加严格,其次是对于编译器,不同的编译器的数据的默认数据格式处理是不一样的,在这里我猜想我最初复制出来答案不一样是因为我的数据在eclipse中复制处理的时候,对char数据默认(0)是利用了null处理也就(什么都没有)所以会把一些数据给吞掉。然而string的数据输出null那个我猜想是因为string是对象,然后处理的时候是以字符串文本格式输出,所以才能进行一个复制。
所以在编写java代码的时候,注意面向对象是很有必要的。
最后提一嘴,java在字符串的简单合并时时效是非常慢的!!!
另外要是这篇文章对你还有所帮助,还请给笔者一个赞,这是对我文章的肯定也会给我继续更新的动力。
笔者还很菜,这边笔者有什么说的不对的地方欢迎各位指教。
谢谢!!!