String 字符串的追加,数组拷贝

package chengbaoDemo;

import java.util.Arrays;
/**
 *需求:数组的扩容以及数据的拷贝
 *分析:因为String的实质是以字符数组存储的,所以字符串的追加,<br>
 *实质上是数组的扩容,数据的移动(复制)
 *
 */
public class TestString {
    public static void main(String[] args) {
        String src = new String("src");
        String app = new String("app");
        String newString = copy(src, app);
        System.out.println(newString);
    }
    public static String copy(String src, String app) {
        char srcArray[] = src.toCharArray();

        /*(1)创建一个新的字符数组,数组的大小为原字符串的长度 + 追加的字符串长度,
        并将原字符串拷贝到新数组中*/    //这个方法是Arrays类的静态方法
        char[] buf = Arrays.copyOf(srcArray, src.length() + app.length());

        //(2)复制追加字符串的字符到新字符数组中,注意: 源对象和目的对象都是字符数组     //这个方法是System
        System.arraycopy(app.toCharArray(), 0, buf, src.length(), app.length());

        //(3)返回新字符串
        return new String(buf);
    }
}

注意:String类是final, 是不可继承,不可以改变的;所以字符串的追击,修改才做都不是在原字符串上修改,而是创建一个新的字符串,讲原字符串,和追加的字符串数据,拷贝到行的字符串数组,实质:是数组的扩容,数据的移动如下面几个String类的方法

public String substring(int beginIndex, int endIndex) {


    if (beginIndex < 0) {


        throw new StringIndexOutOfBoundsException(beginIndex);


    }


    if (endIndex > count) {


        throw new StringIndexOutOfBoundsException(endIndex);


    }


    if (beginIndex > endIndex) {


        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);


    }


    return ((beginIndex == 0) && (endIndex == count)) ? this :


        new String(offset + beginIndex, endIndex - beginIndex, value);


    }




 public String concat(String str) {


    int otherLen = str.length();


    if (otherLen == 0) {


        return this;


    }


    char buf[] = new char[count + otherLen];


    getChars(0, count, buf, 0);


    str.getChars(0, otherLen, buf, count);


    return new String(0, count + otherLen, buf);


    }


 public String replace(char oldChar, char newChar) {


    if (oldChar != newChar) {


        int len = count;


        int i = -1;


        char[] val = value; /* avoid getfield opcode */


        int off = offset;   /* avoid getfield opcode */




        while (++i < len) {


        if (val[off + i] == oldChar) {


            break;


        }


        }


        if (i < len) {


        char buf[] = new char[len];


        for (int j = 0 ; j < i ; j++) {


            buf[j] = val[off+j];


        }


        while (i < len) {


            char c = val[off + i];


            buf[i] = (c == oldChar) ? newChar : c;


            i++;


        }


        return new String(0, len, buf);


        }


    }


    return this;


结论:从上面的三个方法可以看出,无论是sub操、concat还是replace操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变。
时间: 2024-10-12 13:52:59

String 字符串的追加,数组拷贝的相关文章

string字符串转换为array(互换)

将string字符串转换为array数组 NSArray  *array = [Str componentsSeparatedByString:@","]; 反向方法 将array数组转换为string字符串 NSString *tempString = [mutableArray componentsJoinedByString:@","];--分隔符

集合或数组转成String字符串

1.将集合转成String字符串 String s=""; for (int i = 0; i < numList.size(); i++) { if (s=="") { s=numList.get(i); }else { s=s+","+numList.get(i); } } 定义List集合,如: List<String> numList=new ArrayList<String>(); for(int i=1;

java压缩和解压字符串,Byte数组,String

在网上找到的压缩解压的工具类,可以压缩String字符串 /*** * 压缩GZip * * @param data * @return */ public static byte[] gZip(byte[] data) { byte[] b = null; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(bos); gzip.w

int数组转换为string字符串

将数值数组拼合为字符串,一直使用循环的方式,代码虽简单,但总想更简洁,重构嘛 int[] intArray = new int[] { 1, 2, 3, 4, 5 }; string result = string.Empty; for (int i = 0; i < intArray.Length; i++) { if (!string.IsNullOrEmpty(result)) result += "," + intArray[i]; else result = intAr

Java比较两个String字符串数组

比较两个String字符串数组元素差异 1.工具类 package io.renren.common.utils; import org.apache.commons.lang3.ArrayUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @program: ivvdata-security * @description:

099、Java中String类之字符数组与字符串的转换

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String args[]) { String str = "hello"; // 定义字符串 char[] data = str.toCharArray(); // 将字符串变为字符数组 for (int x = 0; x < data.leng

Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0

课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值  String str="Hello";  推荐这种 使用关键字new  String str1=new String("Hello"); 在内存中开辟2个空间 如图: 源代码 StringDemo01.java 2.String内容的比较 String str="Hello"

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

03-Java String字符串详解

1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated method stub // int a=10; // int b=10; // System.out.println(a==b); String str="Hello"; String str1=new String("Hello"); System.out.println(s