java中字符串赋值问题

请问String s = "accp";与String s = new String("accp");有什么区别?
2025-03-04 09:35:32
推荐回答(3个)
回答1:

Java运行时会维护一个String Pool(String池, String常量池, 字符串缓冲区)

String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。

而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区

String s = "accp";
创建s之前系统会先在"池子"中查找是否已经存在这个字符串, 如果存在则直接符号该字符串的句柄
如果不存在, 系统会创建一个新"accp"字符串, 并返回句柄, 以后再有"accp"被要求创建, 系统不会创建新的,而是直接返回已经存在的字符串的句柄

String s = new String("accp");
系统不会去"池子"中查找, 直接在内存中新开辟一块空间, 初始化为"accp",并返回句柄

回答2:

嗯 一个在堆中, 一个在缓冲区

new String("accp"); 要使用内存 在堆栈中进行

回答3:

好象是两个字符串s在内存中的位置不一样,前面的是在缓冲池中,而后面一个是在栈中。