ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

有关于String

2022-05-10 00:33:13  阅读:170  来源: 互联网

标签:beginIndex String value functionA 关于 new buf


1 首先明白 jvm 内存结构

1.8 之前

 

 

 

最主要:

堆:1 线程共享 2 属于内存空间(可以是连续的内存地址 也可以是非连续 主要由gc 进行管理 也可以不管了,主要作用就是 存放 java 对象),

栈:1 线程私有 ,随着线程的消失而消失  2 属于内存空间 (栈帧 来控制 ,调方法之前,先压一个栈帧(包含一些变量 ,), 调完方法之后 出栈,也可以使用return 强行出栈) 3 栈的设计是按照 数据结构中的 栈设计

                   

 

 

 

假如我们 一个类有:多个方法

public class Test {

void functionA(String a ){

}


void functionB(String b ){

}


void functionc(String a,String b ){

functionB(b);
functionA(a);

}
}

假设只有一个主线程来跑这个Test类。

最先是入的栈:
functionc.functionA(a); 然后是 functionc.functionB(b) 然后是 functionB 然后是 functionA 

出栈:
functionA 然后 functionB 然后是 functionc.functionB(b) 然后是 functionc.functionA(a)

 这样 主线程就可以 按顺序 执行所有方法。

 

============================================

扯远了:

回到String 源码

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {

private final char value[];

public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}xia

public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}

}

首先:String 本质上是, final char value[] ; 不可变数组
那么如果 要改变Sting 怎么办,
String a = "hell"
String b = "world"
String c = a.concat(b);
String d = "helloworld";
String f = "hello"+"world";
System.out.println(d == c);
System.out.println(d == a+b);
System.out.println(d == f);

jvm 做了什么,
char buf[] = Arrays.copyOf(value, len + otherLen); 向String  常量池 申请一个 新长度 字符数组 ,将旧的字符串 一个一个拼接到新的 char buf[]
然后 new String(buf, true);返回。
也就是 new 了一个 c 对象,c的成员还是 从 a b 的 char value[] 复制过来。也就是jvm 常量池中 只有三个变量 : hell world helloworld
这么做的好处:1 目的是为了避免字符串的重复创建。2 不用考虑 Stirng 对象改变所带来的麻烦 ,如果这个string是可以改变的,通过一个引用改变一个string将导致另一引用指向错误的值。

 

标签:beginIndex,String,value,functionA,关于,new,buf
来源: https://www.cnblogs.com/publicmain/p/16251827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有