当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

java不变字串[Java编程]

赞助商链接



  本文“java不变字串[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
请察看下述代码:
//: Stringer.java

public class Stringer {
  static String upcase(String s) {
    return s.toUpperCase();
  }
  public static void main(String[] args) {
    String q = new String("howdy");
    System.out.println(q); // howdy
    String qq = upcase(q);
    System.out.println(qq); // HOWDY
    System.out.println(q); // howdy
  }
} ///:~
q传送进入upcase()时,它实际是q的句柄的一个副本.该句柄衔接的对象实际只在一个统一的物理位置处.句柄到处传送的时刻,它的句柄会得到复制.
若察看对upcase()的定义,会发现传送进入的句柄有一个名字s,并且该名字只有在upcase()履行期间才会存在.upcase()完成后,本地句柄s便会消逝,而upcase()返回后果——还是本来那个字串,只是全部字符都变成了大写.当然,它返回的实际是后果的一个句柄.但它返回的句柄终究是为一个新对象的,同时本来的q并未发生改变.全部这些是若何发生的呢?

1. 隐式常数
若利用下述语句:
String s = "asdf";
String x = Stringer.upcase(s);
那么真的但愿upcase()办法改变自变量大概参数吗?我们普通是不肯意的,因为作为供应应办法的一种信息,自变量普通是拿给代码的读者看的,而不是让他们改正.这是一个相当重要的保证,因为它使代码更易编写和理解.
为了在C++中实现这一保证,需求一个特别关键字的帮忙:const.操纵这个关键字,程序员可以保证一个句柄(C++叫“指针”大概“引用”)不会被用来改正原始的对象.但这样一来,C++程序员需求用心记着在全部地方都利用const.这明显易令人混合,也不简单记着.

2. 覆盖"+"和StringBuffer
操纵前面提到的技术,String类的对象被计划成“不可变”.若查阅联机文档中关于String类的内容(本章稍后还要总结它),就会发现类中可以改正String的每个办法实际都成立和返回了一个崭新的String对象,新对象里包含了改正过的信息——本来的String是原封未动的.因此,Java里没有与C++的const对应的特点可用来让编译器支持对象的不可变本领.若想得到这一本领,可以自行设置,就象String那样.
由于String对象是不可变的,所以可以按照情形对一个特定的String举行多次别名处理.因为它是只读的,所以一个句柄不大概会改变一些会影响其他句柄的东西.因此,只读对象可以很好地办理别名问题.
通过改正产生对象的一个崭新版本,仿佛可以办理改正对象时的全部问题,就象String那样.但对某些操作来说,这种办法的效率并不高.一个典型的例子就是为String对象覆盖的运算符“+”.“覆盖”意味着在与一个特定的类利用时,它的含义已发生了改变(用于String的“+”和“+=”是Java中能被覆盖的唯一运算符,Java不答应程序员覆盖其他任何运算符——注释④).

④:C++答应程序员随便覆盖运算符.由于这普通是一个复杂的历程(拜见《Thinking in C++》,Prentice-Hall于1995年出版),所以Java的计划者认定它是一种“糟糕”的特点,决意不在Java中采取.但具有讽剌意味的是,运算符的覆盖在Java中要比在C++中简单得多.

针对String对象利用时,“+”答应我们将差别的字串通接起来:
String s = "abc" + foo + "def" + Integer.toString(47);
可以想象出它“大概”是若何工作的:字串"abc"可以有一个办法append(),它新建了一个字串,此中包含"abc"以及foo的内容;这个新字串然后再成立另一个新字串,在此中增添"def";以此类推.
这一假想是行得通的,但它要求成立大量字串对象.固然终究的目的只是得到包含了全部内容的一个新字串,但中间却要用到大量字串对象,并且要不断地举行垃圾汇集.我猜疑Java的计划者能否先试过种办法(这是软件开辟的一个教导——除非自己试试代码,并让某些东西运行起来,不然不大概真正理解系统).我还猜疑他们能否早就发现这样做得到的性能是不能承受的.
办理的办法是象前面介绍的那样制作一个可变的同志类.对字串来说,这个同志类叫作StringBuffer,编译器可以自动成立一个StringBuffer,以便计算特定的表达式,分外是面向String对象利用覆盖过的运算符+和+=时.下面这个例子可以办理这个问题:
//: ImmutableStrings.java
// Demonstrating StringBuffer

public class ImmutableStrings {
  public static void main(String[] args) {
    String foo = "foo";
    String s = "abc" + foo +
      "def" + Integer.toString(47);
    System.out.println(s);
    // The "equivalent" using StringBuffer:
    StringBuffer sb = 
      new StringBuffer("abc"); // Creates String!
    sb.append(foo);
    sb.append("def"); // Creates String!
    sb.append(Integer.toString(47));
    System.out.println(sb);
  }
} ///:~
成立字串s时,编译器做的工作大致等价于背面利用sb的代码——成立一个StringBuffer,并用append()将新字符直接加入StringBuffer对象(而不是每次都产生新对象).固然这样做更有效,但不值得每次都成立象"abc"和"def"这样的引号字串,编译器会把它们都转换成String对象.所以固然StringBuffer供应了更高的效率,但会产生比我们但愿的多得多的对象.
  以上是“java不变字串[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .