我将使用什么语法来获取表示字符串的字节数并将它们与表示字符串的字节数进行比较ArrayList
例如,拿着那根绳子?
我正在使用多代理代理系统通过消息发送对象,并且我想跟踪每条消息占用的空间。该方法不必非常准确,只要它与对象的实际大小成比例即可。例如。长度为 4 的字符串向量将报告为小于长度为 5 的字符串向量。
您可以使用将对象转换为字节数组ObjectOutputStream http://download.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html and ByteArrayOutputStream http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html:
public static int sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return byteOutputStream.toByteArray().length;
}
我刚刚对此进行了测试。您要计算大小的对象需要实现Serializable http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html(这意味着您可能必须对每个对象进行标记才能获得其大小。可能并不理想)。我编写了一个快速而肮脏的程序来测试这一点:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Sizeof {
public static class Person implements Serializable {
private String name;
private String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public static void main(String[] args) {
Person p1 = new Person("Alby", "20");
Person p2 = new Person("VeryLongName", "100");
String s1 = "This is it";
String s2 = "This";
try {
System.out.println("p1 " + sizeof(p1));
System.out.println("p2 " + sizeof(p2));
System.out.println("s1 " + sizeof(s1));
System.out.println("s2 " + sizeof(s2));
}
catch(Exception e) {
e.printStackTrace();
}
}
public static int sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return byteOutputStream.toByteArray().length;
}
}
这给了我:
p1 85
p2 94
s1 17
s2 11
EDIT
Stephen C 的回答强调了此方法的一些注意事项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)