String s=new String("xyz");创建几个String对象的问题

首先让我们了解几个概念:

栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。

堆 :由JVM分配的,用于存储对象等数据的区域。

常量池constant pool :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。

进入正题:

String a = "abc";①
String b = "abc";②

使用String a = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
①代码执行后在Constant Pool中创建了一个值为abc的String对象,②执行时,因为Constant Pool中存在"abc"所以就不在创建新的String对象了。

String   c   =   new   String("xyz");①
String   d   =   new   String("xyz");②

让我们来看看这两句代码在内存中发生了什么,①Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant   pool里创建了一个共享的"xyz",然后当调用到new   String("xyz")的时候,会在heap里创建这个new   String("xyz");②由于constant   pool中存在"xyz"所以不再创建"xyz",然后创建新的new   String("xyz")。
对于String c = new String("xyz");的代码,与String a = "abc"不同的是一概在堆中创建新对象,不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
程序1
String   s1   =   new   String("xyz");     //创建二个对象,一个引用
String   s2   =   new   String("xyz");     //创建一个对象,并且以后每执行一次创建一个对象,一个引用
程序2
String   s3   =   "xyz";     //创建一个对象,一个引用  
String   s4   =   "xyz";     //不创建对象,只是创建一个新的引用

重要的是理解constant pool与new关键字

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。(无论怎样都返回池中的对象)

下面的这个例子能帮助我们更深入的理解String的存储和赋值原理

String str1 = new String("123");
        String str2 = "123"; 
        String str3 = str1.intern(); 
        System.out.println((str1 == str2) +","+ (str3 == str2));

输出 false,true        
        String str4 = new String("234");
        String str5 = new String("234");    
        String str6 = str4.intern();
        String str7 = str5.intern();   
        System.out.println((str4 == str5) +","+ (str6 == str7));

输出 false,true

时间: 2024-08-09 10:44:04

String s=new String("xyz");创建几个String对象的问题的相关文章

关于String s = new String("xyz"); 创建几个对象的问题

引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 你知道在java中除了8中基本类型外,其他的都是类对象以及其引用.所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性. 看: String   s= "Hello "; s= "Java "; String   s1= "Hello "

关于String s = new String("xyz");创建了几个字符串对象?的问题

引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 你知道在java中除了8中基本类型外,其他的都是类对象以及其引用.所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性. 看: String   s= "Hello "; s= "Java "; String   s1= "Hello "

【转】String str = new String("abc")创建了多少个对象?

原帖地址:http://www.cnblogs.com/dolphin0520/p/3778589.html 这个问题在很多书籍上都有说到比如<Java程序员面试宝典>,包括很多国内大公司笔试面试题都会遇到,大部分网上流传的以及一些面试书籍上都说是2个对象,这种说法是片面的. 如果有不懂得地方可以参考这篇帖子: http://rednaxelafx.iteye.com/blog/774673/ 首先必须弄清楚创建对象的含义,创建是什么时候创建的?这段代码在运行期间会创建2个对象么?毫无疑问不可

String变量的两种创建方式

在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc")://第二种方式 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址. 第二种方式创建String变量时,在堆中创建一个存放&q

String str=new String(&quot;abc&quot;)到底创建了几个对象

这句代码到底创建了几个对象?研究了好一阵,现在才能说清楚. package com.sun.test; public class Test<T> { T a; /** * @param args */ public static void main(String[] args) { String str=new String("abc"); } } 我们来看下这段简单代码的字节码: <pre name="code" class="java

String,你到底创建了几个对象????

Java代码   String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于 new String("aaa")相当于"aaa"与一个就是创建出来的放在堆时原实例对象,而另一个就是放在常量池中的 "aaa" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象. 常量池(constant pool)指的是在编译期被确定,并被保存在已

String s=new String(&quot;abc&quot;)创建了几个对象?

String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个. 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识. 我们可以把上面这行代码分成String str.=."abc"和new String()四部分来看待.String str只是定义了一个名为str的String类型的变量,因此它并

怎样判断 String string=new String(&quot;关羽&quot;); 创建了几个对象?

答:两个. 解析: 1.我们知道字符串的比较方法是用.equals()来比较的,那么我们可以创建一个测试类 public class Test2 { public static void main(String[] args) { 2.创建String对象 String s1 = "关羽"; String s2 = "关羽"; String s3 = new String("关羽"); 3.通过字符串的比较方法.equals()分别比较s1和s2

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

如果字符串常量池中不存在“abc”,该语句执行时会先在字符串常量池中创建一个“abc”对象,在执行new语句时在堆去开辟新的空间,创建“abc”字符串,同时栈区会有一个引用s指向堆区的对象,此时如果要算上栈区的引用,共创建3个对象,不算,则创建两个对象. 二:如果字符串常量池中存在“abc”,则只会在堆区创建一个“abc”字符串,同时栈区有一个引用指向堆中的对像.如果算上栈中的引用,共创建了两个对象,不算,则创建了一个对象. 原文地址:https://www.cnblogs.com/kpsmil