解决方案 »
- 新手求救,不知为何老提示错误
- 急!!!!eclipse的Project Deployments 在哪里?怎么找不到呢?
- 初学者基础问题,我的ID就是立刻结贴的保障!
- java混淆打包后没用到的变量或者函数都会不见吗?
- JAVA取得系统temp路径问题
- 为什么Method mt=new Method()返回cannot resolve symbol的错误?
- 如何用JTable显示大量数据?
- 真受不了 replaceFirst
- 散分
- 怎么把JAVA的标题栏换成XP的啊
- Maven Assembly Descriptor的outputDirectory标签能够使用的属性
- 一般WEB应用, 多久进行一次FULL GC算是正常的?
所以有可能是在加载器做了这个事情。(猜的,还需要查找资料来证明一下)
另外 String s = new String("test") ;//在constant pool 中会有一份 “test” ,在heap中会有一个“test”对象
String a = "test"//只会在onstant pool 中会有一份 “test”
String str = new String("aa"); 这里的"aa"应该相当于String original = "aa";
jdk文档中说:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
在构造方法中String(char value[])赋值。
个人观点,看有没有大神指出
this.value = Arrays.copyOf(value, value.length);
}
String的value使用char[]初始化的啊。。
LZ看的那个构造传进来的参数就是String
类似
String s;
String str = new String(s);这个意思关于
String s = new String("test") ,
String a = "test" 我理解这两种构造方式是一样的都用char[]构造。。
楼上说的constantpool我不太懂JVM
在运行Java应用程序时,使用的类得先加载到JVM,而在类的加载过程中,记得有 准备、初始化 等等;再看看字节码;
比如:public static void main(String[] args) {
String a = "test";
String s = new String("test");
a.toCharArray();
s.toCharArray();
}反编译后得到:
常量池 信息(只取了一部分):
const #14 = Asciz main;
const #15 = Asciz ([Ljava/lang/String;)V;
const #16 = String #17; // test
const #17 = Asciz test;
const #18 = class #19; // java/lang/String
const #19 = Asciz java/lang/String;
const #20 = Method #18.#21; // java/lang/String."<init>":(Ljava/lang/String;)V
const #21 = NameAndType #5:#22;// "<init>":(Ljava/lang/String;)V
const #22 = Asciz (Ljava/lang/String;)V;
const #23 = Method #18.#24; // java/lang/String.toCharArray:()[C
const #24 = NameAndType #25:#26;// toCharArray:()[C
const #25 = Asciz toCharArray;
const #26 = Asciz ()[C;
const #27 = Asciz args;
const #28 = Asciz [Ljava/lang/String;;
const #29 = Asciz a;
const #30 = Asciz Ljava/lang/String;;
const #31 = Asciz s;
const #32 = Asciz SourceFile;main方法的字节码:
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
Code:
Stack=3, Locals=3, Args_size=1
0: ldc #16; //String test
2: astore_1
3: new #18; //class java/lang/String
6: dup
7: ldc #16; //String test
9: invokespecial #20; //Method java/lang/String."<init>":(Ljava/lang/String;)V
12: astore_2
13: aload_1
14: invokevirtual #23; //Method java/lang/String.toCharArray:()[C
17: pop
18: aload_2
19: invokevirtual #23; //Method java/lang/String.toCharArray:()[C
22: pop
23: return从上面的两条ldc指令可知:"test" 都是从常量池取来的;
0: ldc #16; //String test
和
7: ldc #16; //String test对于String a = "test": 直接就是从常量池中取出"test",然后赋值给变量a;
0: ldc #16; //String test
2: astore_1 对于 String s = new String("test"):创建个String对象,然后把"test"赋值给这个新创建的对象,然后赋值给变量s;
3: new #18; //class java/lang/String
6: dup
7: ldc #16; //String test
9: invokespecial #20; //Method java/lang/String."<init>":(Ljava/lang/String;)V
12: astore_2从上可知:当加载这个main类后(运行main方法前),"test" 就已经存在 常量池 中了,既然 "test" 是个字符串(类型就是java.lang.String),那首先就得加载 java.lang.String 类,既然类都知道了,那么你说的 char[] 这些 String 类的字段信息都应该有了,而且 "test" 是个String实例,都说会存在 字符串常量池 中,那么那个 value[] 的值就有了;
通过上面的说明,