`

String s="" 和 String s = new String()区别

 
阅读更多
String s = new String("XYZ"); 到底生成了几个对象?



要理解这个,就要知道string类的工作原理。 

你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以 "xyz "在java

中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性。

看: 

String s= "Hello "; 

s= "Java "; 

String s1= "Hello "; 

String s2=new String( "Hello "); 

啊,s所引用的string对象不是被修改了吗?之前所说的不变性,去那里了啊?

你别着急,让我告诉你说发生了什么事情: 

在jvm的工作过程中,会创建一片的内存空间专门存入string对象。我们把这片内存空间叫

做string池。

String s= "Hello ";当jvm看到 "Hello ",在string池创建string对象存储它,并将他的引用返

回给s。 

s= "Java ",当jvm看到 "Java ",在string池创建新的string对象存储它,再把新建的string

对象的引用返回给s。而原先的 "Hello "仍然在string池内。没有消失,他是不能被修改的。

所以我们仅仅是改变了s的引用,而没有改变他所引用的对象,因为string对象的值是不能

被修改的。

String s1= "Hello ";jvm首先在string池内里面看找不找到字符串 "Hello ",找到,返回他的引用

给s1,否则,创建新的string对象,放到string池里。这里由于s= "Hello "了,对象已经被引用,

所以依据规则s和s1都是引用同一个对象。所以 s==s1将返回true。(==,对于非基本类型,

是比较两引用是否引用内存中的同一个对象) 

String s2=String( "Hello ");jvm首先在string池内里面看找不找到字符串 "Hello ",找到,不做任

何事情,否则,创建新的string对象,放到string池里面。由于遇到了new,还会在内存上(不

是string池里面)创建string对象存储 "Hello ",并将内存上的(不是string池内的)string

对象返回给s2。所以s==s2将返回false,不是引用同一个对象。

好现在我们看题目: 

String s = new String( "xyz "); 

首先在string池内找,找到?不创建string对象,否则创建, 这样就一个string对象 

遇到new运算符号了,在内存上创建string对象(此处内存用堆来理解,比较好,应该是从

字符串池中复制一份相同的对象放到堆中,要是理解不对,请多多指教!!),并将其返回给

s,又一个对象 

所以总共是2个对象 ---一个是string池中的对象,一个是堆中的对象,并把堆中的对

象交给s持有
分享到:
评论

相关推荐

    关于String s=new String( "Hello")的例子思考

    关于String s=new String( "Hello")的例子思考

    String a="hello" String b="hello" a==b 返回true的问题分析

    String b=new String("hello world"); //这种用new关键字定义的字符串,是在堆中分配空间的。而分配空间就是由new去完成的,由new去决定分配多大空间,并对空间初始化为字符串"hello world" 返回其在堆上的地址。 ...

    String.txt

    String b =new String("abc"); //创建字符串方式2 System.out.println(a==b); //false,内存地址不相等 String c =new String("abc"); String d =new String("abc"); System.out.println(c==d...

    String s = new String(” a “) 到底产生几个对象?

    上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...

    String对象创建问题

    String对象的创建问题,分为:编译期和执行期 详细的讲解String对象创建问题

    C# char[]与string byte[]与string之间的转换详解

    string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好,hello; byte[] bytes; //byte[] 转换成 string bytes = Encoding.UTF8.GetBytes(str); //string 转换成 byte[] (字符串是用哪种...

    设置应用程序图标,C#源代码string MyFileName = Application.StartupPath + "\\Robin.ico"; this.Icon = new Icon(MyFileName);

    设置应用程序图标,C#源代码string MyFileName = Application.StartupPath + "\\Robin.ico"; this.Icon = new Icon(MyFileName);

    Java问题宝典2012版

    33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? ...

    【JDK】分析 String str=““ 与 new String()(csdn)————程序.pdf

    【JDK】分析 String str=““ 与 new String()(csdn)————程序

    String s = new String('a ') 到底产生几个对象

    主要介绍了String s = new String(" a ") 到底产生几个对象,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    calculator.java

    String s=new String(); String s1=new String(); Object op=new String(); Object o=new String(); double d, dFore, dBack; int i=9; public static void main(String[] args) { // TODO Auto-generated ...

    hibernate sprint 封装应用

    Map m = s.getQueryList(new String[] { "from T_TDD", "select count(*) from T_TDD" }, fls, cpage, pnum); List tddls = (List) m.get(QCls._LIST_); request.setAttribute("tddls", tddls); String toolbar = ...

    人民币大写转换

    public static final String EMPTY = ""; public static final String ZERO = "零"; public static final String ONE = "壹"; public static final String TWO = "贰"; public static final String THREE = "叁...

    java面试题122道基础题

    欢迎大家下载java面试题,收集的一些面试方面的题 ... System.out.println(s==s.intern());//false System.out.println(s1==s1.intern());//true System.out.println(s.intern()==s2.intern());//true }

    txt文档转化为String

    将.txt文档转化为String类型 具体代码如下: package IndexSearch; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * 将txt的路径,将txt文档转换为String内容 ...

    浅析为什么a=”abc” 不等于 a=new String(“abc”)

    b=new String("abc") typeof b // object a==b //true a===b //false 但是为什么呢?看了很多书,问了好几个大神,其实自己还是稀里糊涂的。这里记录一下,备查。 在js中,区分原始资料类型和包装类型。数字、字符串...

    java初学者必读

    newstring=new String(s.getBytes("ISO8859_1"),"gb2312"); return newstring; } catch(UnsupportedEncodingException e) { return s; } } public static String ChineseToUnicode(String s){ try{ if(s==...

    java的倒序排列

    String s = "abcdefg"; String t = ""; char[] charArray = s.toCharArray(); for (int i = charArray.length-1; i>=0; i--){ t=t+charArray[i]; } System.out.println(t); } }

    C#_string_byte数组转换解析

    string类型转成ASCII byte[]:("01" 转成 byte[] = new byte[]{ 0x30, 0x31}) 1 byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); ASCII byte[] 转成string:(byte[] = new byte[]{ 0x30, 0x31...

    java io读取文件到String

    //ret = new String(ba); } finally { if(is!=null) {try{is.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法1用时"+ (endTime-beginTime) + "ms")...

Global site tag (gtag.js) - Google Analytics