• .net与Java中关于字符串连接的处理的对比


    最近和另一位同事在利用java做一个多语工具,他是java出身,而我是.net出身,最近刚开始搞java,发现他在处理字符串连接时使用的是StringBuffer,而我使用的是StringBuilder(.net中推荐的字符串连接的类,Java也有这个类,所以就用了),偶,“StringBuffer”是什么东东,它与StringBuilder有什么区别。

    一、常量字符串连接

    1、.net

    例如

    string str = "This is " + " a " + "test.";

    编译后,我们使用reflector反编译一下,可以看到编译器已经给我们计算出了结果,避免了每次运行都重新计算,提供了效率。

    string str="This is  a test.";
    

    2、Java

    例如

    String str=“This is ”+" a "+"test.".

    编译后再反射,将得到类似下面的结果。

    String abc=new StringBuilder("This is ").append(" a ").append("test.").

    即每次运行时都要重新计算一下。

    总结:从这点看.net关于常量字符串的处理要比java快,因为它在编译时已进行了计算,运行时就是个常量。

    二、StringBuilder和StringBuffer

    1、.net中只有StringBuilder,没有StringBuffer,且该类是非线程安全的。以下是msdn中关于StringBuilder在线程安全方面的描述

    线程安全
    此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。

    2、JAVA

    StringBuffer 字符串变量(线程安全) 
    StringBuilder 字符串变量(非线程安全)

    两者均继承自AbstractStringBuilder,其内部方法均是对其父类相应方法的调用,可以看作它们均是AbstractStringBuilder的包装类,只不过一个是线程安全的包装(StringBuffer),另一个是线程非安全的包装(StringBuilder)。 

    StringBuffer的定义:

    View Code
     
    public final class StringBuffer
        extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence
    {
    
        public StringBuffer() {
        super(16);
        }
    
         public StringBuffer(int capacity) {
        super(capacity);
        }

     StringBuilder的定义

    View Code
    public final class StringBuilder
        extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence
    {
    
        public StringBuilder() {
        super(16);
        }
    
        public StringBuilder(int capacity) {
        super(capacity);
        }

    下面看一下两者对append(String str)的处理

    StringBuffer:

    View Code
        public synchronized StringBuffer append(String str) {
            super.append(str);
            return this;
        }

    StringBuilder:

    View Code
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }

    对比以上两部分代码,可以发现两者代码基本一样,都是对父类相应方法的调用,不同的只是StringBuffer多了一个关键字synchronized,保证方法调用的原子性,即线程安全,这是要消耗系统资源的。

    总结:多线程环境建议使用StringBuffer,它是线程安全的;单线程或者是多线程但是不存在多个线程同时操纵同一个StringBuilder实例的环境使用StringBuilder。

  • 相关阅读:
    定制选择范围的按钮RangeButton
    获取系统屏幕尺寸参数的类WxHxD
    解决UITableView在iOS7中UINavigationController里的顶部留白问题
    [翻译] INSSearchBar
    可以简易设置文字内边距的EdgeInsetsLabel
    [翻译] STAlertView
    keyWindow与delegate中Window的区别
    定制二选一按钮SwitchButton
    【转】Xcode真机调试初体验
    【转】Xcode真机测试could not find developer disk image解决方法
  • 原文地址:https://www.cnblogs.com/xqlcrystal/p/3030007.html
Copyright © 2020-2023  润新知