`
hustcen
  • 浏览: 15177 次
  • 性别: 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
分享到:
评论

相关推荐

    Java常用类与基础API-String的构造器与常用方法

    简而言之,这个构造方法创建了一个原始字符串的副本。 - `public String(char[] value)`: - 使用提供的字符数组来构造一个新的 `String` 对象。这个方法将整个字符数组复制到新创建的字符串中。 - `public ...

    12基础篇之第十二(String的基本用法).docx

    `String` 类提供了多种构造方法,以便于不同场景下的字符串创建需求: 1. **无参构造**:`String()` 创建一个未初始化的 `String` 对象。 2. **字节数组构造**:`String(byte[] bytes)` 和 `String(byte[] bytes, ...

    String类创建对象问题

    public String(String original) { int size = original.count; char[] originalValue = original.value; char[] v; if (originalValue.length > size) { int off = original.offset; v = Arrays.copyOfRange...

    Java中String类.pdf

    4. `public String(String original)`: 创建原始字符串的副本,即创建一个新字符串,但内容与原字符串相同。 5. `public String(StringBuffer buffer)`: 从StringBuffer对象构建字符串,允许从可变缓冲区创建不可变...

    Java String 源码解析

    1.String 内部存储结构是? 答:String 内部存储...2.String源码中有哪些重要的构造方法? 答:4个重要的构造方法,源码如下 (1). public String(String original) { this.value = original.value; this.hash = o

    java源码解读由浅入深.pdf

    `String`类提供了多种构造方法来创建字符串对象,这些构造方法使得开发者可以根据不同的需求灵活地创建`String`对象。 1. **以`String`为参数的构造方法**:可以将已有的`String`对象赋值给新创建的对象。 2. **以`...

    Java中关于String的全面解析

    `public String(String original) {this.value = original.value;this.hash = original.hash;}` Java中的String是一个非常重要的类,它提供了两种创建方式和一种特殊的存储机制(String intern pool),并且String...

    字符串逆序及java代码实现

    - `public static void main(String[] args)`:这个方法用于测试`reverseString`方法的功能。定义了一个原始字符串`original`,调用`reverseString`方法得到逆序后的字符串`reversed`,并通过控制台输出原始字符串和...

    Java(hchen).rar_world

    标题中的"Hello new World"是一个典型的编程示例,通常用于演示字符串操作,特别是与`String`类相关的构造方法。描述中提到的`StringTest.java`程序可能是用来测试这些构造方法的。 在Java中,`String`类是一个非常...

    java date类与string类实例代码分享

    4. `public String(String original)`:使用原始字符串original的副本创建一个新的String对象。 5. `public int indexOf(String str)`:返回字符串中str第一次出现的索引位置。 6. `public String substring(int ...

    常用API方法简单汇总

    6. **`public String(String original)`**: - **作用**:创建一个与原字符串内容相同的新的字符串对象。 **普通方法介绍**: 1. **`boolean equals(Object obj)`**: - **作用**:比较两个字符串是否完全相同,...

    关于java的一个有趣的问题

    这里的构造函数`public String(String original)`接收一个已有String对象作为参数,所以第一个对象是字面量"abc",第二个是new操作符创建的新对象。 String对象的创建主要有两种方式:1) 使用new关键字,如`new ...

    JAVA面试题解惑系列(1-6).txt

    ` 这种方式创建的字符串对象不会放在常量池中,而是放在堆内存中,并且它调用了 `String` 类的构造方法 `public String(String original)` 来初始化。 通过以上分析,我们可以更深入地理解Java中的类初始化顺序以及...

    JAVA-SE入门学习——第八讲集合

    使用clone()方法或构造函数来复制集合,实现集合的深拷贝和浅拷贝。 ```java public class CollectionCopy { public static void main(String[] args) { List<String> originalList = new ArrayList(); original...

    常用类.docx

    - `public String(String original)`: 将另一个字符串对象转换为新字符串。 - `public int length()`: 返回字符串的长度。 **3.3 字符串的不可变性** - 不可变性意味着字符串一旦被创建,其内容就不能被修改。这是...

    原型模式代码示例

    原型模式是一种设计模式,属于创建型模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来创建。这种模式在系统中需要频繁创建相似对象时特别有用,可以提高性能并降低复杂性。在Java中,我们可以...

    java6string源码-CSP:http://www.streamboard.tv/svn/CSP/

    4. 字符串副本构造:`public String(String original)` 每种构造函数都涉及到字符串的初始化和内存分配,特别是字符数组的拷贝,这是String不可变性的基础。 二、字符串连接操作 在Java 6中,String类提供了...

Global site tag (gtag.js) - Google Analytics