Java中String使用总结(1)

时间:2022-09-05 15:30:39

Java中的String是不可变类,意味着每次对String的操作得到的都是一个从全新的对象。在项目中对多个字符串进行操作,使用StringBuilder,如果涉及到线程安全则用StringBuffer。在String的使用过程中还有一些需要注意的地方。
1. 避免递归调用
如果要打印一个对象的内存地址,因为this代表的是当前对象,我们可能会这么写

@Override
public String toString() {
return "C{" +
"name='" + name + '\'' +this+
'}';
}

但是在调用该对象的toString()方法的时候会出现如下的错误:

Exception in thread "main" java.lang.*Error
at java.lang.AbstractStringBuilder.appendNull(AbstractStringBuilder.java:493)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:446)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at javatest4.C.toString(C.java:21)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at javatest4.C.toString(C.java:21)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at javatest4.C.toString(C.java:21)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at javatest4.C.toString(C.java:21)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)

这是因为出现了递归调用,当编译器遇到this时,它会去找当前对象的toString()方法,但在toString方法中又有this,就会出现循环引用的情况。如果想要打印内存地址,将this改成super.toString()即可。
2. 使用format格式化输出
在开发中,我们经常需要打印一些信息到日志文件或控制台中。可以使用String.format()或是printf方法来格式化输出。

public static void main(String[] args) {
C c = new C();
System.out.printf("[output Str:%s]\n", c.printStr("hello world"));
System.out.println(String.format("[output Str:%s]", c.printStr("hello world")));
}

输出的结果:
[output Str:HELLO WORLD]
[output Str:HELLO WORLD]

常用的类型转换字符

名称 代表类型
s 字符串
d 整数(十进制)
f 浮点型(十进制)
c unicode字符
b Boolean型
e 浮点型
x 整数(十六进制)
% 字符“%”