Java-java String常量池原理
java string连接池的原理:
比如说 String str = “abc” ; string str2 = new String(“abc”) ;
他们在分别创建时,栈和堆中是如何运算的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
java string连接池的原理:
比如说 String str = “abc” ; string str2 = new String(“abc”) ;
他们在分别创建时,栈和堆中是如何运算的。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
两个类放在两个.java文件:
TestA.java
TestB.java
所以我们可以看到,
用常量字符串直接赋值的 String变量, 不管是 对象域成员/临时变量/另一个类文件中的对象域成员, 都指向了同一个字符串对象(常量池中);
用new String()赋值的String变量, 指向了新的对象, 即在堆里重新分配内存, 生成了新的对象.
楼主应该说的是常量池吧,创建的时候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
String str = "abc";
栈里的str变量指向常量池(也在内存,只不过是另外一个区域)的“abc”对象;
String str2 = new String("123");
栈里的str2指向堆内的一个String类型对象,这个String类型对象指向常量池的“abc”对象。
两句话总共创建3个对象。
你好,
第一句String str = "abc" ;
这句会虚拟机会首先去栈里找“abc”,如果没有找到,则向栈里压入"abc",然后str指向该值。
string str2 = new String(“abc”);
第二句:是紧接着第一句写的话,这里就只创建一个对象str2,因为new String(“abc”)中的abc已经添加到了常量池,所以第二句会在堆中创建一个“abc”对象,str2指向该对象。