在从文件中读取对象的数组列表内容时有很多 [Ljava.lang.Object;@hashcode

Having a lot of [Ljava.lang.Object;@hashcode in reading arraylist content of object from file

我将包含两个 属性 例如 StringArrayList<Vector> 的代码对象写入文本文件。当我从文件中读回它们时,arraylist 属性 包含很多 [Ljava.lang.Object;@hashcode。但是有些数组列表没有这些。

这些写入文件:

gid : g5, code : [[[7], [p, [8, 8, 8, 7, 7 , 7], o, [2, 2, 1]]], [[1], [c, [6, 6, 5]]], [[9], [c, [5, 5]]], [[3], [n, [4, 4], c, [6, 6, 5]]], [[4], [[[n, 4]]]], [[5], [c, [6, 6, 6, 6, 5]]], [[6], [c, [6, 6]]]]

gid : g6, code : [[[10], [c, [13, 5]]], [[ 11], [n, [12, 12, 3, 3]]], [[12], [n, [3, 3]]], [[3], [c, [13, 13, 5, 5] ]]], [[5], [c, [13, 13, 13, 13, 6, 6, 6]]], [[13], [c, [6, 6, 6, 5, 5]] ]]

从文件中读回:

gid : g5, code : [[[7], [p, [8, 2, 2, 1, 1 , 1], o, [2, 6, 1]]], [[5], [c, [6, [Ljava.lang.Object;@1e44538, 5]]], [[9], [c, [4, 4]]], [[3], [n, [4, [Ljava.lang.Object;@17c760b], c, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object; @1e44538, 4]]], [[[Ljava.lang.Object;@17c760b], [[[[c, [6, 6, 6, 6, 6, 6, 6, 5]], [Ljava.lang.Object;@17c760b]]]], [[4], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, 4]]], [[Ljava.lang.Object;@1e44538], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538]]]]

gid : g6, code : [[[10], [c, [13, 5]]], [[ 11], [n, [12, [Ljava.lang.Object;@29d838, 3, n]]], [[[Ljava.lang.Object;@29d838], [[Ljava.lang.Object;@1327c02, [n, n]]], [[n], [c, [2, 2, c, c]]], [[c], [[n, 4], [2, 2, 2, 2, 6] , [Ljava.lang.Object;@16b7f83, [Ljava.lang.Object;@16b7f83]]], [[2], [o, [[Ljava.lang.Object;@16b7f83, [Ljava.lang.Object; @16b7f83, [Ljava.lang.Object;@16b7f83, c, c]]]]

这是代码class。

public class Codes implements Serializable{

public String gid;
public ArrayList<Vector> code;

public Codes()
{
    gid = "";
    code  = new ArrayList<Vector>();
}

Codes(String id,ArrayList c)
{
    gid = id;
    code = c;
}

public ArrayList<Vector> getCode()
{
    return code;
}

public String getId()
{
    return gid;
}

@Override
public String toString()
{
    return gid + " " + code;
}

我把这个对象写入一个文本文件如下:

File f = new File("./CodesObj.txt");
    if(!f.exists()) {
        f.createNewFile();
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream os = new ObjectOutputStream(fos);
       try{
            System.out.println("gid : " + c.gid + ", code : " + c.code);
            os.writeObject(c);
         }catch (IOException e){
            e.printStackTrace();
         }
        os.flush();
        os.close();
      }

这是我从文件中读取的方式

try{
     ois = new ObjectInputStream(new FileInputStream("./CodesObj.txt"));
     Codes obj = null;
    while( (obj = (Codes) ois.readObject()) != null){   
        if(obj instanceof Codes){
            System.out.println("gid : " + obj.gid + ", code : " + obj.code);    
        }
    }       
}catch (EOFException ex) {  
   } catch (ClassNotFoundException ex) {
       ex.printStackTrace();
   } catch (FileNotFoundException ex) {
       ex.printStackTrace();
   } catch (IOException ex) {
       ex.printStackTrace();
   } finally {
       //Close the ObjectInputStream
       try {
           if (ois != null) {
               ois.close();
           }
       } catch (IOException ex) {
           ex.printStackTrace();
       }
   }

我注意到您的代码存在一个问题,即您正试图对 ArrayList 执行 System.out(),这将导致显示奇怪的内容。

我创建了一个名为 printList() 的辅助方法,它接受 List 作为输入。它遍历此列表,并将每个列表元素(Vector<Object[]>)转换为二维数组。然后它使用 Arrays.deepToString() 打印出这个二维数组。

public class Codes implements Serializable {
    public String gid;
    public ArrayList<Vector> code;

    // constructor and getters/setters

    @Override
    public String toString()
    {
        return gid + " " + printList(code);
    }

    private void printList(List list) {
        String listString = "[";

        for (int i=0; i < list.size(); ++i) {
            Vector v = list.get(i);
            Object[][] array = (Object[][])v.toArray(new Object[v.size()][]);

            if (i > 0) {
                listString += ", ";
            }

            listString += Arrays.deepToString(array);
        }
        listString += "]";

        return listString;
    }
}

我已经在 IntelliJ 上本地测试了这段代码,它似乎可以正常工作。

问题是您在使用 System.out.println()

时打印出对象的哈希码

要打印出其中的实际数据,您应该使用增强的 for 循环。

gid 打印出来很好,因为它是一个 String,但是 code,其中包含 VectorsArrayList,无法打印出来通过做 System.out.println(code)(当然,除非你想要哈希码)

如果您想打印出所有向量,请改为执行此操作。

for(Vector vector : code){
   System.out.println(vector);
}
public ArrayList<Vector> code;

很明显这是真的

public ArrayList<Vector<Object[]>> code;

至少在某些情况下。您正在打印 ArrayList,它调用 AbstractCollection.toString(),它调用 Vector.toString(),它为每个项目调用 item.toString()。如果该项是 Object[],您将得到 Object[].toString() 的结果,它调用 Object.toString(), 生成一般形式的字符串

[Ljava.lang.Object;@hashcode

没有简单的解决方法。您必须提供覆盖 Code.toString() 来遍历 ArrayList 项目及其内部 Vectors 并在 Vector.[= 的每个项目上调用 Arrays.toString() 25=]