Java之怪脾气String-1

学习Java的人因为有了String省了不少事,但也在使用的过程中遇到了很多意想不到的情况。

1 String类是字符串常量类,String对象是不可改变的。在代码中我们看起来好像改变了String对象,其实都是创建了一个新的对象。通常来说,如果String对象内容没变,返回的仍然是指向原先对象的引用;如果String对象内容发生了改变,返回的则是一个新的String对象的引用。

public class Test {
    public String changeIt(String s) {
        s+="d";
        return s;
    }
    public static void main(String args[]) {
        Test test=new Test();
        String s1="abc";
        String s2=test.changeIt(s1);
        System.out.println(s1);
        System.out.println(s2);
    }

}
/*
output:
abc
abcd
*/

2 重载操作符”+”和StringBuilder的append方法
重载操作符”+”和append方法都可以用来连接多个字符串。其实,即便使用了重载操作符,底层调用的仍然是append方法。那么我们是否可以肆意的使用重载操作符,而来让编译器替我们完成优化呢?

public class Test {
    public String linkByOperator(String[] s) {
        String result="";
        for(String i:s){
            result+=i;
        }
        return result;
    }
    public String linkByAppend(String[] s){
        StringBuilder result=new StringBuilder();
        for(String i:s){
            result.append(i);
        }
        return result.toString();
    }
    public static void main(String args[]) {
        Test test=new Test();
        String[] s={"a","b","c","d"};
        String s1=test.linkByOperator(s);
        String s2=test.linkByAppend(s);
        System.out.println(s1);
        System.out.println(s2);
    }
}
/*
output:
abcd
abcd
*/

上面代码分别用重载操作符和append方法实现了字符串的连接,结果也都一样。但其实,在linkByOperator中每次循环都会创建一个StringBuilder对象,而linkByAppend中从始至终只创建了一个StringBuilder对象。由此可见,编译器不会帮我们做到最完美,使用哪种方法需要我们自己拿捏。

3 在toString方法中打印对象的内存地址
Java的每一个类都是继承于Object,每个类中都会有toString方法。我们也可以覆盖该方法,使它最终生成的结果是我们所希望的。在toString方法中,如果你想要打印对象的内存地址,可能会使用到this。

package ChapterThirteen;

public class Test {
    public String toString(){
        //return "test's address: "+this+"\n"; 
        return "test's address: "+super.toString()+"\n";
    }
    public static void main(String args[]) {
        Test test=new Test();
        System.out.println(test);
    }
}
/*
output:
test's address: ChapterThirteen.Test@19e0bfd
*/

通过代码测试会发现,使用this会报出异常。原因在于,toString方法中会试图将this转为String,那么就会调用this上的toString方法,就会陷入无效的递归中。所以要想打印出对象的内存地址,应该使用Object.toString。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值