`
hustcen
  • 浏览: 14910 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

读String的public String(String original)构造方法

阅读更多
   最近看《Effective Java》,其中提到String str = new String("foo");的方式创建String实例的方式不可取。既然有这个构造方法总得有点意义,于是我去看了String的源码:

   public String(String original) {
	int size = original.count;
	char[] originalValue = original.value;
	char[] v;
  	if (originalValue.length > size) {
 	    // The array representing the String is bigger than the new
 	    // String itself.  Perhaps this constructor is being called
 	    // in order to trim the baggage, so make a copy of the array.
	    v = new char[size];
 	    System.arraycopy(originalValue, original.offset, v, 0, size);
 	} else {
 	    // The array representing the String is the same
 	    // size as the String, so no point in making a copy.
	    v = originalValue;
 	}
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

  代码中的if条件让人很疑惑,originalValue.length就是String中char[]的长度,size是当我们用"abc".length() 取到的String长度,什么情况下originalValue.length > size会成立?
  其实答案就在于String的split和substring方法,可以参考下面一位朋友的文章http://jarfield.iteye.com/blog/583946
当我们用String的split方法分割出一个字符串数组时,其实仅仅改变原String中char[]的游标,每个子String都是原来的一个拷贝。即子String的count记录的是子字符串的长度,但是其中的char[]的大小和原字符串是一样的(这也是split会导致内存泄漏的原因)。如果把split出来的字串都用public String(String original)创建一遍即可避免内存泄漏的问题,我想这也是这个看似没用处的构造方法存在的作用。
    小弟第一次发文章,才疏学浅,以上纯属个人愚见。
0
0
分享到:
评论

相关推荐

    83.java中String构造方法.zip

    83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...

    85.java中String构造方法.zip

    85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中...

    public static String[] split(String s, String regex)

    public static String[] split(String s, String regex) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...

    string类的构造方法_String类重要吗_C++_STL_string_

    C++ stl中重要容器string类的构造方法与基本概念和一些有用的字符串操作

    编写类String的构造函数

    编写类String的构造函数,包括构造函数,析构函数,拷贝构造和赋值函数

    Java-SE中的String世界.pptx.pptx

    String构造方法概述 String类提供了多种构造方法,用于创建不同类型的字符串对象,包括直接赋值、字符数组、字节数组等。 常用的String构造方法 常用的String构造方法有直接赋值、字符数组构造和字节数组构造,这些...

    学会使用string class

    学会使用string class 对string class众多函数的分类与总结,适合新手了解string class的具体使用 穿插大量样例代码,内容翔实

    扩展String功能方法

    扩展String功能方法:一直好忙,没有时间写属于自己的东西,但是看着一天天不更新心情也不是个滋味,只有从网上收罗一些比较好的东东贴上。

    巧用类String 的构造函数

    类string构造函数的巧用

    string类,构造函数...

    using namespace std; class String ... public: String(const char *str = NULL); String(const String &other;); ~String(void); String& operator =(const String &other;); ........ ........

    《C++String深入详解2.0版》PDF

    1.3 string的构造 11 1.4 string的重载运算符 12 1.5 string与algorithm相结合的使用 12 1.5.1 string与remove 12 1.5.2 string与unique、sort 12 1.5.3 string与search 12 1.5.4 string和find、find_if 13 1.5.5 ...

    详解C++ string常用截取字符串方法

    string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...

    StringAPI.java

    boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写 String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+” String substring(int beginIndex):返回一个新...

    String对象常用的属性的方法

    String对象常用的属性的方法String对象常用的属性的方法

    基于Keil实现字符串函数string.h的简单应用

    基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...

    C语言头文件 STRING.H

    C语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING....

    String和string区别以及string详解.doc

    String和string区别以及string详解

    Java String 源码解析

    1.String 内部存储结构是? 答:String 内部存储结构是char数组,源码如下: public final class String implements java.io....public String(String original) { this.value = original.value; this.hash = o

    txt文档转化为String

    public static String readTxt(String path) throws IOException{ StringBuffer content = new StringBuffer(""); //文档内容 try { FileReader reader = new FileReader(path); BufferedReader br = new...

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

    C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数

Global site tag (gtag.js) - Google Analytics