最近看《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)创建一遍即可避免内存泄漏的问题,我想这也是这个看似没用处的构造方法存在的作用。
小弟第一次发文章,才疏学浅,以上纯属个人愚见。
分享到:
相关推荐
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构造方法.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) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...
C++ stl中重要容器string类的构造方法与基本概念和一些有用的字符串操作
编写类String的构造函数,包括构造函数,析构函数,拷贝构造和赋值函数
String构造方法概述 String类提供了多种构造方法,用于创建不同类型的字符串对象,包括直接赋值、字符数组、字节数组等。 常用的String构造方法 常用的String构造方法有直接赋值、字符数组构造和字节数组构造,这些...
学会使用string class 对string class众多函数的分类与总结,适合新手了解string class的具体使用 穿插大量样例代码,内容翔实
扩展String功能方法:一直好忙,没有时间写属于自己的东西,但是看着一天天不更新心情也不是个滋味,只有从网上收罗一些比较好的东东贴上。
类string构造函数的巧用
using namespace std; class String ... public: String(const char *str = NULL); String(const String &other;); ~String(void); String& operator =(const String &other;); ........ ........
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 ...
string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写 String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+” String substring(int beginIndex):返回一个新...
String对象常用的属性的方法String对象常用的属性的方法
基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数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详解
1.String 内部存储结构是? 答:String 内部存储结构是char数组,源码如下: public final class String implements java.io....public String(String original) { this.value = original.value; this.hash = o
public static String readTxt(String path) throws IOException{ StringBuffer content = new StringBuffer(""); //文档内容 try { FileReader reader = new FileReader(path); BufferedReader br = new...
C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数