Java 在什么情况下要重写toString
发布时间:2025-05-20 23:18:41 发布人:远客网络
一、Java 在什么情况下要重写toString
1、两个都重写toString了吧。你查查JDK的API就知道了。
2、首先说一下,什么情况下要重写toString,object类里的toString只是把字符串的直接打印,数字的要转化成字符再打印,而对象,则直接打印该对象的hash码。所以当你要想按照你想要的格式去字符串一些对象的时候,就需要重写toString了。比如一个Student对象,直接toString肯定是一个hash码。然而你想得到的比如是:name:***,age:***。这时就重写toString就是在toString里写:System.out.println(“name:”+student.getName);
3、System.out.println(“age:”+student.getAge)。
4、这样再toString就直接反回你想要的格式。
5、通过查api我们就可以知道HashSet的toString是把s的值格式化成[*,*,*],就是给s的加个中括号,而且用逗号分开。
6、而HashMap的toString是把m的值格式化成{key1=value1,key2=value2,key3=value3}
7、所以你打印出来的是那样的格式,这就是重写toString的作用,具体请看api吧。
8、希望你能理解。谢谢,有不懂的再问。
二、java中的toString什么意思toString有什么用
1、toString()是Object的方法,因为所有类都默认继承了Object类,所以也都具有toString()方法,但是并不是通常想要的功能。
2、那现在,需要直接获取到这个Persion对象的数据,可以这样对重写这个toString()方法,如下:
3、return"[name="+ name+", age="+ age+", gender="+ gender+"]";
4、System.out.println(p);//隐式调用toString(0)方法
5、System.out.println(p.toString());//显式调用toString(0)方法
6、字符串在存储上类似字符数组,它每一位单个元素都是能提取的,字符串的零位是它的长度,如s[0]=10,这提供给我们很多方便,例如高精度运算时每一位都能转化为数字存入数组。
7、通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。
三、Java重写toString 使之可以输出二维数组
java的标准API中的Array类没有toString方法,因此沿用父类Object的toString方法:
return getClass().getName()+"@"+ Integer.toHexString(hashCode());
而Array类中的方法几乎全是本地方法,可以说Array类就是一个本地类,因此他不受java语法约束,也根本无法用java语法改写toString方法,想要改写这个类实在是太难了,我是不会..
但是你可以使用java.util.Arrays类中的deepToString(Object o[])静态方法,可以实现打印多重数组。
System.out.println(Arrays.deepToString(a));
java设计人员之所以不为Array类设计toString是因为不好确定用什么方式打印数组,是用“【”,还是用“{”,以及要不要“,”等都是问题。
Arrays的deepToString方法如下:
public static String deepToString(Object[] a){
if(a.length!= 0&& bufLen<= 0)
StringBuilder buf= new StringBuilder(bufLen);
deepToString(a, buf, new HashSet());
private static void deepToString(Object[] a, StringBuilder buf,
for(int i= 0; i< a.length; i++){
Class eClass= element.getClass();
buf.append(toString((byte[]) element));
else if(eClass== short[].class)
buf.append(toString((short[]) element));
else if(eClass== int[].class)
buf.append(toString((int[]) element));
else if(eClass== long[].class)
buf.append(toString((long[]) element));
else if(eClass== char[].class)
buf.append(toString((char[]) element));
else if(eClass== float[].class)
buf.append(toString((float[]) element));
else if(eClass== double[].class)
buf.append(toString((double[]) element));
else if(eClass== boolean[].class)
buf.append(toString((boolean[]) element));
else{// element is an array of object references
deepToString((Object[]) element, buf, dejaVu);
} else{// element is non-null and not an array
buf.append(element.toString());
java.lang.reflect.Array类的内容如下,你如果有能力可以改改:
*@(#)Object.java 1.73 06/03/30
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
private static native void registerNatives();
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj){
protected native Object clone() throws CloneNotSupportedException;
return getClass().getName()+"@"+ Integer.toHexString(hashCode());
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException{
throw new IllegalArgumentException("timeout value is negative");
if(nanos< 0|| nanos> 999999){
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
if(nanos>= 500000||(nanos!= 0&& timeout== 0)){
public final void wait() throws InterruptedException{
protected void finalize() throws Throwable{}