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

 我来答
娱乐小八卦啊a
高粉答主

2019-11-27 · 娱乐小八卦,天天都知道
娱乐小八卦啊a
采纳数:256 获赞数:117830

向TA提问 私信TA
展开全部

两个。第一个对象是字符串常量"xyz" 第二个对象是new String("xyz")的时候产生的

1、内存存放的地址不同:

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

2、垃圾处理机制不同:

Java  的堆是一个运行时数据区,类的(对象从中分配空间。  这些对象通过new、newarray、 anewarray 和multianewarray 等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小。

生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。

但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放些基本类型的变量 (,int, short, long, byte, float,double, boolean, cha; 和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

3、一个是引用,一个是真实存放与内存中。

java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。

比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list里面。String str = new String("Test"),是开辟内存放入了对象,并把它的引用赋给str。

同理,BookInfo bookinfo=null与BookInfo bookinfo=new BookInfo():前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。

bookinfo=test.getinfo(),又把它指向了另一个地址。

阿仁man
推荐于2019-10-07 · TA获得超过516个赞
知道小有建树答主
回答量:118
采纳率:0%
帮助的人:104万
展开全部
创建了两个对象,先创建的对象保存在常量池中,即.class文件中,在编译时就已经确定
new String对象的时候,又创建了一个对象保存在内存中,在运行时确定
String s = new String("xyz"); //先常量池再内存

String s1="xyz"; //常量池
System.out.println(s==s1); //false
ps:==用来判断是否引用同一对象,s和s1位于不同环境中,自然不是引用同一对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
梦冷凝
推荐于2016-07-02 · TA获得超过1568个赞
知道小有建树答主
回答量:1703
采纳率:25%
帮助的人:730万
展开全部
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式