String str1 = "abc"; String str2 = new String("abc"); 区别

dandongsoft 2015-01-27 06:23:44
String str1 = "abc";
String str2 = new String("abc"); 他俩有什么区别啊 啊
...全文
807 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahhmdwg 2015-01-27
  • 打赏
  • 举报
回复
引用 8 楼 dandongsoft 的回复:
[quote=引用 6 楼 ahhmdwg 的回复:] [quote=引用 5 楼 dandongsoft 的回复:] [quote=引用 2 楼 gaofuqi 的回复:]

String str1 = "abc";                          //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc");      //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。
常量池和堆是一起的?能详细讲下在内存中的栈和堆上是咋样分配的? [/quote] 常量池是JVM的一块特殊的内存空间。和堆没什么关系 我给你好好解释下吧: 1.String s1 = "ubuntu"; String s2 = “ubuntu”; 2.String s3 = new String("ubuntu"); String s4 = new String("ubuntu"); 很容易理解了吧 求给分 [/quote] 比如说String str="abc"; 保存的时候,就在常量池中存在abc了,而String str=new String("abc") 是在程序加载的时候,才在堆中分配空间,是这样的?[/quote] 这个还真没研究过 sorry
dandongsoft 2015-01-27
  • 打赏
  • 举报
回复
引用 6 楼 ahhmdwg 的回复:
[quote=引用 5 楼 dandongsoft 的回复:] [quote=引用 2 楼 gaofuqi 的回复:]

String str1 = "abc";                          //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc");      //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。
常量池和堆是一起的?能详细讲下在内存中的栈和堆上是咋样分配的? [/quote] 常量池是JVM的一块特殊的内存空间。和堆没什么关系 我给你好好解释下吧: 1.String s1 = "ubuntu"; String s2 = “ubuntu”; 2.String s3 = new String("ubuntu"); String s4 = new String("ubuntu"); 很容易理解了吧 求给分 [/quote] 比如说String str="abc"; 保存的时候,就在常量池中存在abc了,而String str=new String("abc") 是在程序加载的时候,才在堆中分配空间,是这样的?
gaofuqi 2015-01-27
  • 打赏
  • 举报
回复
引用 5 楼 dandongsoft 的回复:
[quote=引用 2 楼 gaofuqi 的回复:]

String str1 = "abc";                          //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc");      //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。
常量池和堆是一起的?能详细讲下在内存中的栈和堆上是咋样分配的? [/quote] 常量池是方法区的一部分,Java虚拟机运行时数据区内存主要有:堆,方法区、Java虚拟机栈、本地方法栈。 更详细的可以看 http://www.cnblogs.com/Cratical/archive/2012/08/21/2649985.html
ahhmdwg 2015-01-27
  • 打赏
  • 举报
回复
引用 5 楼 dandongsoft 的回复:
[quote=引用 2 楼 gaofuqi 的回复:]

String str1 = "abc"; //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc"); //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。


常量池和堆是一起的?能详细讲下在内存中的栈和堆上是咋样分配的?


[/quote]
常量池是JVM的一块特殊的内存空间。和堆没什么关系
我给你好好解释下吧:
1.String s1 = "ubuntu";
String s2 = “ubuntu”;

2.String s3 = new String("ubuntu");
String s4 = new String("ubuntu");




很容易理解了吧 求给分

dandongsoft 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 gaofuqi 的回复:

String str1 = "abc";                          //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc");      //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。
常量池和堆是一起的?能详细讲下在内存中的栈和堆上是咋样分配的?
ahhmdwg 2015-01-27
  • 打赏
  • 举报
回复
1.第一个定义java虚拟机会在常量池中建立一个‘abc’ str1指向‘abc’ 2.第二个用new建立的常量,所以会在堆中建立一个'abc',str2指向堆中的’abc‘
AGoodMoodEveryDay 2015-01-27
  • 打赏
  • 举报
回复
str1是创建了一个对象,str2创建了两个但是回收了一个
gaofuqi 2015-01-27
  • 打赏
  • 举报
回复

String str1 = "abc";                          //"abc"在常量池,引用str1存储的是"abc"在常量池的地址
String str2 = new String("abc");      //new String("abc") 在堆上分配内存,引用str2存储的是new String("abc") 在堆上的内存地址
//还有一点区别是str1的类加载时就完成了初始化,而str2 要在执行引擎执行到那一行代码时才完成初始化。
colin0242 2015-01-27
  • 打赏
  • 举报
回复
String str1 = "abc"; 开辟了快内存,指向"abc" String str2 = new String("abc");用了new就是又新开辟了内存指向另外一个"abc", 这个时候如果str1.equals(str2)是true,因为它们指向的内容值是相等的, 但是如果是str1 == str2 就是false,因为它们指向不同。大概就是这么个意思,希望能帮到楼主。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧