zoukankan      html  css  js  c++  java
  • Java中的string

    string类中的每个看起来会修改string的方法,实际上都是创建了一个新的string对象,用来存储修改后的字符串对象,但是最初的string对象没有改变

    关于在string中使用“+”和stringbuilder()

    String s="abc"+"def"+"mongo"+47;

    反编译结果是,编译器创建一个stringbuilder对象,使用四次stringbuilder中的append()方法,最终调用tostring()方法产生最终的string对象。

    但是有些情况下编译器并不是这样优化的。

    public class print {
        
        public static void main(String[] args) {
            
            String string="";
            for(int i=0;i<5;i++){
                string=string+i;
            }
            System.out.println(string);
        }
    }

    这种情况下编译器每经过一次循环都会产生一次StringBuilder对象导致资源浪费

    推荐使用StringBuilder,将上面的String替换成StringBuilder,改写上面的代码成下面的形式

    public class print {
        
        public static void main(String[] args) {
            
            StringBuilder stringBuilder=new StringBuilder();
            for(int i=0;i<5;i++){
                stringBuilder.append(i);
            }
            System.out.println(stringBuilder);
        }
    }

    这样在编译的时候就只会产生一个stringbuilder。

    注意使用str.append(a+":"+b)的时候,编译器并不会走捷径,对于括号里的内容,他会重新创建一个StringBuilder去处理。

    如果在循环中对同一个string拼接使用stringbuilder,编写类的toString()方法时候注意

     无意识的递归问题

    在写类的toString方法时候应该注意,想要打印对象的内存地址时候容易出现

    public class print {
        
        public String toString() {
            return "print"+this;
        }
        
        public static void main(String[] args) {
            System.out.println(new print());
        }
    }

    当执行"print"+this时候,还会调用toString方法,从而导致无限的递归调用。

    应该讲上面的

    "print"+this;
    改成
    "print"+super.toString();














  • 相关阅读:
    该死的兼容性
    Tip:解决DesignMode不能正确反应是否处于设计模式的问题
    Oh, ListView里竟然什么也不显示,也不报错!
    Tip: Dock is better than Anchor
    Tip: Asp.net下载默认文件名里包含空格时,如何防止FireFox只截取空格前一部分作为文件名
    c#的DateTime.Now函数详解
    C#中的委托和事件(初稿)
    C#多线程学习
    .NET(c#)new关键字的三种用法
    Silverlight – WCF – MaxItemsInObjectGraph
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10386179.html
Copyright © 2011-2022 走看看