Java-java String常量池原理

发布于 2016-10-28 08:26:25 字数 140 浏览 1362 评论 4

java string连接池的原理:
比如说 String str = “abc” ; string str2 = new String(“abc”) ;
他们在分别创建时,栈和堆中是如何运算的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

偏爱自由 2017-06-29 13:17:34

两个类放在两个.java文件:
TestA.java

class TestA {
    final static String strField="abc";
}

TestB.java

public class TestB {
    private final static String strField="abc";
    @Test
    public void testConstantStrings(){
        String strInstant="abc";
        String strNew=new String("abc");
        System.out.println(strField==strInstant);      //true
        System.out.println(strField==strNew);          //false 
        System.out.println(strField==TestA.strField);  //true
    }
}

所以我们可以看到,
用常量字符串直接赋值的 String变量, 不管是 对象域成员/临时变量/另一个类文件中的对象域成员, 都指向了同一个字符串对象(常量池中);
用new String()赋值的String变量, 指向了新的对象, 即在堆里重新分配内存, 生成了新的对象.

偏爱自由 2017-06-10 23:00:56

楼主应该说的是常量池吧,创建的时候String str = “abc” 是在常量池中创建的对象,
string str2 = new String(“abc”) ;是在堆中创建的对象,不过前者是隐式创建的对象
即:你没有用new 关键字,但是编译器对你的字符串自动构造并且放进常量池中
他们俩的运算都一致
如:

public static void main(String[] args) {

String s="s";
String s1=new String ("s");
System.out.println(s.equals(s1));
}

run:true

甜柠檬 2017-05-24 13:15:47

String str = "abc";
栈里的str变量指向常量池(也在内存,只不过是另外一个区域)的“abc”对象;
String str2 = new String("123");
栈里的str2指向堆内的一个String类型对象,这个String类型对象指向常量池的“abc”对象。

两句话总共创建3个对象。

归属感 2017-05-08 06:52:31

你好,
第一句String str = "abc" ;
这句会虚拟机会首先去栈里找“abc”,如果没有找到,则向栈里压入"abc",然后str指向该值。
string str2 = new String(“abc”);
第二句:是紧接着第一句写的话,这里就只创建一个对象str2,因为new String(“abc”)中的abc已经添加到了常量池,所以第二句会在堆中创建一个“abc”对象,str2指向该对象。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文