Java创建字符串常量内存分析 Java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb” String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb” String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb” 我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb” String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb” String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb 我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb” String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb” String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb您所指的常量池,是不是存在堆内存中的对象值? string s = "xxx";这种声明赋值,指向的是常量池,所以对象都是一个。string s = new String("xxx");这种创建是重新分配内存,对象不是同一个。 我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb” String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb” String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb您所指的常量池,是不是存在堆内存中的对象值?常量池在方法区,堆是另外一块内存区域 参考Java虚拟机学习 - 体系结构 内存模型 当直接String s = "***" 的时候对象中的值是放在常量池中的!!当再次String s1 = "***" 时先看常量池中是否有这个值如果有指向这个值如果没有在创建 String s2 = "****" 的时候是在堆里创建一个新的对象每次都是不同的!!! 是String s2 = new String("***") 额手误了!! 可以参考下这个:http://blog.csdn.net/gaopeng0071/article/details/11741027 String s = "acd" 中的常量是存放在常量池中的,相同的只保存一个,因此直接赋值的常量会相等;如果是new出来的对象,判断的是内存地址,因此不一样。 下面的代码对楼主理解String的存储会有帮助new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)String str1 = "a";//constant poolString str2 = "b";//constant poolString str3 = new String("a");//heapSystem.out.println(str1 == str3);//falseString str4 = "a"+str2;//heapString str5 = "a"+"b";//constant poolString str6 = new String("ab");//heapString str7 = "ab";//constant poolSystem.out.println(str4 == str5);//falseSystem.out.println(str4.intern() == str5);//trueSystem.out.println(str4 == str6);//falseSystem.out.println(str5 == str7);//trueString str8 = str6;//heapSystem.out.println(str6 == str8);//trueString str9 = new String("ab");//heapSystem.out.println(str6 == str9);//false 同一个字符串在常量池中只会有一份,所以,当不同引用指向同一个常量池中的字符串时,他们的地址永远都是一样的。==true如果是new出来的两个相同的字符串对象,则他们的地址永远不会相同。== false 楼主看了《think in java》吧,被字符串问题折磨得死去活来的。 因为有字符串常量池的存在,当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。具体你可以看一下这篇文章http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/ 求非递归方法线索化二叉树 为什么要在这加上static 关键字 才能发生线程死锁呢? java读取网页中TEXTAREA中的内容 java中如何判断所输入的字符串是否为半角的英文或者数字。 在未关闭一个stream或writer的情况下再次打开了文件,会有什么后果 询问SCJP考试 怎样让包含JTable的JScrollPane占据整个JPanel juilder!很菜得问题! 学了一段时间了,想实践一下 SimpleDateFormat的实际应用 jar包混淆后很多文件仅大小写不同,无法反编译后用eclipse加载? 编译时出错
String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
您所指的常量池,是不是存在堆内存中的对象值?
String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
您所指的常量池,是不是存在堆内存中的对象值?
常量池在方法区,堆是另外一块内存区域 参考Java虚拟机学习 - 体系结构 内存模型
new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)String str1 = "a";//constant pool
String str2 = "b";//constant pool
String str3 = new String("a");//heapSystem.out.println(str1 == str3);//falseString str4 = "a"+str2;//heap
String str5 = "a"+"b";//constant pool
String str6 = new String("ab");//heap
String str7 = "ab";//constant pool
System.out.println(str4 == str5);//false
System.out.println(str4.intern() == str5);//true
System.out.println(str4 == str6);//false
System.out.println(str5 == str7);//trueString str8 = str6;//heap
System.out.println(str6 == str8);//trueString str9 = new String("ab");//heap
System.out.println(str6 == str9);//false
同一个字符串在常量池中只会有一份,所以,当不同引用指向同一个常量池中的字符串时,他们的地址永远都是一样的。==true
如果是new出来的两个相同的字符串对象,则他们的地址永远不会相同。== false