String s = new String("abc");在内存中有几个对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String s = new String("abc");在内存中有几个对象?相关的知识,希望对你有一定的参考价值。

望详细解答!!!

String str=new String("abc"); 创建了2个String对象:
可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")看成"abc"和new String():
String的构造器:
public String(String original) //other code ... ,创建一个类的实例(对象)的方法有以下两种:
一、使用new创建对象。
二、调用Class类的newInstance方法,利用反射机制创建对象。
使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。引入另外一种创建String对象的方式的讨论——引号内包含文本。

这种方式是String特有的,并且它与new的方式存在很大区别。
String str="abc";
这行代码创建了一个String对象。
String a="abc"; String b="abc";
答案还是一个。
String a="ab"+"cd";
答案是三个。
说到这里,需要引入对字符串池相关知识的回顾。
在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此不用担心String对象共享而带来程序的混乱。字符串池由String类维护,可以调用intern()方法来访问字符串池。
再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此用引号包含文本的方式来创建String对象以提高效率,实际上这也是在编程中常采用的。

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
堆(heap):用于存储对象
参考技术A 一个
"abc"所在的引用,就是s。。
这里是用s特意指向原来的"abc"地址。。
参考技术B 也可以说一个,也可以说两个
abc 首先是要存放在常量 区的
如果 之前用过abc字符串, 也就是之前常量池区有abc这个字符串,那么new String("abc"),就只新加了一个对象,
如果之前没有abc字符串,那就要先存在常量池区,然后才生成s对象 所以要创建两个对象

按你的问题, 内存中肯定会有两个对象, 三块内存分配: 分别是
s 这个变量在栈中的内存空间
abc 常量池区内存
new String("abc") 这个 s变量指向的对象内存本回答被提问者采纳

Java 中String s="你好" 跟 String s=new String("你好")有啥区别

在操作s上没区别。

区别在于

String s = "你好";

这样"你好"这个字符串分配在栈中,随着所在函数的结束而被释放。

String s = new String("你好");

这样"你好"这个字符串分配在堆中,不会因为所在函数的结束而被释放。只有等无人使用时,被Java虚拟机自带的垃圾回收机制释放。

参考技术A 没什么大区别。

以上是关于String s = new String("abc");在内存中有几个对象?的主要内容,如果未能解决你的问题,请参考以下文章

java基础面试题:如何把一段逗号分割的字符串转换成一个数组? String s = "a" +"b" + "c" + "d&qu

String s=new String("abc")的引申

JAVA中String s = "hello"和String s = new String("hello")有啥区别啊?

java中String s = new String("abc")创建了几个对象

String s=new String("xyz");创建了几个String Object?二者之前的区别是什么?

String s=new String("abc");一共创建了几个对象