Java String Copy

Filed Under: Java

Sometime back I was asked how to copy a String in java. As we know that String is an immutable object, so we can just assign one string to another for copying it. If the original string value will change, it will not change the value of new String because of immutability.

Java String Copy

Here is a short java String copy program to show this behavior.


package com.journaldev.string;

public class JavaStringCopy {

	public static void main(String args[]) {
		String str = "abc";

		String strCopy = str;

		str = "def";
		System.out.println(strCopy); // prints "abc"

	}
}

Note that we can perform direct assignment of one variable to another for any immutable object. It’s not limited to just String objects.

However, if you want to copy a mutable object to another variable, you should perform deep copy.

Java String Copy Alternate Methods

There are few functions too that can be used to copy string. However it’s not practical to use them when you can safely copy string using assignment operator.

  1. Using String.valueOf() method
    
    String strCopy = String.valueOf(str);
    
    String strCopy1 = String.valueOf(str.toCharArray(), 0, str.length()); //overkill*2
    
  2. Using String.copyValueOf() method, a total overkill but you can do it.
    
    String strCopy = String.copyValueOf(str.toCharArray());
    
    String strCopy1 = String.copyValueOf(str.toCharArray(), 0, str.length()); //overkill*2 
    
If you want to copy part of string to another string, then valueOf and copyValueOf methods are useful.

Comments

  1. Kiefer says:

    At least in Java 11 (I believe this has been true for a lot longer than that), `String.valueOf(str)` will return the same instance of `str`, so it’s functionally identical to directly assigning the reference.

    In String.java:

    public String toString() {
    return this;
    }

    public static String valueOf(Object obj) {
    return (obj == null ? “null” : obj.toString();
    }

    When obj is a String, String.toString() is called, and this returns the string itself and not a copy. If you want a full copy of the original string, you’ll need to use the String constructor or any of the other methods you listed.

    1. Kiefer says:

      Also, technically even the String constructor doesn’t really create a copy – it copies the references to the internal “value” and “coder” fields from the source string, so the new String object is effectively just a shell around the source string’s contents. The contents themselves are still single-instance and not value-copied.

      I ran into this when I had a case where two strings from different sources are expected to have the same contents, but the code was failing even when they matched because we incorrectly used “==” instead of “String.equals”. This bug passed our unit tests because the two objects providing the string in question were initialized from the same string instance in test (thus making “==” return true), which is never how it works in production. I had to create a copy of the string in the second object to ensure the test was properly comparing two instances, and IntelliJ IDEA points out that using “new String(String)” is a bad practice. It’ll have to do for unit tests, though. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages