锁定老帖子 主题:Java堆.栈和常量池 笔记
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-14
zjhzjf000 写道 qiren83 写道 很久没看到这么高质量的贴子 学到很多
比起有人在CSDN和JY上天天讨论 String i = "ddd"+new String("KK"); 成生几个对象 这贴子站在更高的层面上了 我收藏+收藏夹+右键另存为 好帖! 那位帅哥美女 说说到底是几个啊 我不知道啊 4个 "kk", new.., "ddd", i 先看"kk",在常量池中生成第一个,在堆中new了一个String对象指向常量池中的"kk","ddd"道理同"kk",最后看 最左边,在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象, 可能说的不太清楚,有错请指出,谢谢 |
|
返回顶楼 | |
发表时间:2010-10-14
yqfly2008 写道 zjhzjf000 写道 qiren83 写道 很久没看到这么高质量的贴子 学到很多
比起有人在CSDN和JY上天天讨论 String i = "ddd"+new String("KK"); 成生几个对象 这贴子站在更高的层面上了 我收藏+收藏夹+右键另存为 好帖! 那位帅哥美女 说说到底是几个啊 我不知道啊 4个 "kk", new.., "ddd", i 先看"kk",在常量池中生成第一个,在堆中new了一个String对象指向常量池中的"kk","ddd"道理同"kk",最后看 最左边,在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象, 可能说的不太清楚,有错请指出,谢谢 错了! 对于"+"操作,jvm会在堆中创建一个StringBuilder类,并使用堆中new出来的String对象指向返字符串"kk"进行初始化,通过调用其append方法对"ddd"进行合并操作,最后调用toString方法返回这个新的String对象个栈中的String对象i,所以这里还有一个StringBuilder对象,一共是5个对象 唉,,,感觉自己基础还是不扎实,老遗忘一些东西 |
|
返回顶楼 | |
发表时间:2010-10-14
yqfly2008 写道 zjhzjf000 写道 qiren83 写道 很久没看到这么高质量的贴子 学到很多
比起有人在CSDN和JY上天天讨论 String i = "ddd"+new String("KK"); 成生几个对象 这贴子站在更高的层面上了 我收藏+收藏夹+右键另存为 好帖! 那位帅哥美女 说说到底是几个啊 我不知道啊 4个 "kk", new.., "ddd", i 先看"kk",在常量池中生成第一个,在堆中new了一个String对象指向常量池中的"kk","ddd"道理同"kk",最后看 最左边,在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象, 可能说的不太清楚,有错请指出,谢谢 4个应该是没有错的,但是楼上说的 "在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象" 好象不太正确,JDK文档中说String一旦创建了就不能改变,我个人感觉应是 "ddd"+new String("kk")在堆里重新创建了一个String Object,i就指向这个新的Object. (个人理解不对的地方大家说说,防止误导他人) |
|
返回顶楼 | |
发表时间:2010-10-14
个人觉得,堆里面的 new 字符串,好像不是在堆里面的。堆里面只存了一个引用。
这个引用还是指向常量池里面的字符串。先由对象引用指向堆,然后由堆指向常量池 我的个人认为,如有不对,请多多提醒。 |
|
返回顶楼 | |
发表时间:2010-10-14
.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
------------------------------------------------------------- 这个最快就有点商榷了, CPU的寄存器是最快的美错。JVM寄存器也只是内存的一片区域吧? |
|
返回顶楼 | |
发表时间:2010-10-15
gteam.yu 写道 yqfly2008 写道 zjhzjf000 写道 qiren83 写道 很久没看到这么高质量的贴子 学到很多
比起有人在CSDN和JY上天天讨论 String i = "ddd"+new String("KK"); 成生几个对象 这贴子站在更高的层面上了 我收藏+收藏夹+右键另存为 好帖! 那位帅哥美女 说说到底是几个啊 我不知道啊 4个 "kk", new.., "ddd", i 先看"kk",在常量池中生成第一个,在堆中new了一个String对象指向常量池中的"kk","ddd"道理同"kk",最后看 最左边,在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象, 可能说的不太清楚,有错请指出,谢谢 4个应该是没有错的,但是楼上说的 "在栈中声明了一个String 对象 i 分别指向常量池中的"ddd" 和 堆中的new出来的String对象" 好象不太正确,JDK文档中说String一旦创建了就不能改变,我个人感觉应是 "ddd"+new String("kk")在堆里重新创建了一个String Object,i就指向这个新的Object. (个人理解不对的地方大家说说,防止误导他人) 我和你想法一样:4个:常量池中3个:"ddd","KK","dddKK".堆中一个:new String("KK")。 |
|
返回顶楼 | |
发表时间:2010-10-17
如果说是String对象的话,4个是没错,全面的说,在整个过程中,“对象”是有5个的,楼上说的4个String对象,还有就是“+”操作时产生的StringBuilder对象
|
|
返回顶楼 | |
发表时间:2010-11-11
很透彻,曾经在这迷茫了好长时间。。谢楼主
|
|
返回顶楼 | |
发表时间:2010-11-12
虽然以前看过,但是没有整理过,学习!
|
|
返回顶楼 | |
发表时间:2010-12-11
longxiaoyan 写道
今天复习了一下这些知识,顺便做了下笔记. String s1 = "china"; String s2 = "china"; String s3 = "china"; String ss1 = new String("china"); String ss2 = new String("china"); String ss3 = new String("china"); 这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。
int i1 = 9; int i2 = 9; int i3 = 9; public static final int INT1 = 9; public static final int INT2 = 9; public static final int INT3 = 9;
class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } 省略get,set方法……… } public class Test{ public static void main(String args[]){ int date = 9; Test test = new Test(); test.change(date); BirthDate d1= new BirthDate(7,7,1970); } public void change1(int i){ i = 1234; }
|
|
返回顶楼 | |