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 b=new String("hello world"); //这种用new关键字定义的字符串,是在堆中分配空间的。而分配空间就是由new去完成的,由new去决定分配多大空间,并对空间初始化为字符串"hello world" 返回其在堆上的地址。 ...
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...
上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...
String对象的创建问题,分为:编译期和执行期 详细的讲解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);
33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? ...
【JDK】分析 String str=““ 与 new String()(csdn)————程序
主要介绍了String s = new String(" a ") 到底产生几个对象,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
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 ...
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面试题,收集的一些面试方面的题 ... System.out.println(s==s.intern());//false System.out.println(s1==s1.intern());//true System.out.println(s.intern()==s2.intern());//true }
将.txt文档转化为String类型 具体代码如下: package IndexSearch; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * 将txt的路径,将txt文档转换为String内容 ...
b=new String("abc") typeof b // object a==b //true a===b //false 但是为什么呢?看了很多书,问了好几个大神,其实自己还是稀里糊涂的。这里记录一下,备查。 在js中,区分原始资料类型和包装类型。数字、字符串...
newstring=new String(s.getBytes("ISO8859_1"),"gb2312"); return newstring; } catch(UnsupportedEncodingException e) { return s; } } public static String ChineseToUnicode(String s){ try{ if(s==...
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); } }
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...
//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")...