string字符串相关内容.docx
文本预览下载声明
Java代码 public?class?StringTest?{????public?static?void?main(String[]?args)?{???String?str?=?new?String(abc);?//语句(1)???String?str1?=?abc;//语句(2)???String?str2?=?new?String(abc);//语句(3)????System.out.println(str?==?str1);//语句(4)???System.out.println(str?==?str2);//语句(5)???System.out.println(str1?==?str2);//语句(6)????System.out.println(str?==?ern());//语句(7)???System.out.println(str1?==?ern());//语句(8)???System.out.println(ern()?==?ern());//语句(9)????String?hello?=?hello;//语句(10)???String?hel?=?hel;//语句(11)???String?lo?=?lo;//语句(12)????System.out.println(hello?==?hel?+?lo);//语句(13)???System.out.println(hello?==?hel?+?lo);//语句(14)???}??}??问题1:当执行完语句(1)时,在内存里面生成几个对象?它们是什么?在什么地方? 解答:当执行完语句(1)时,内存里面生成2个对象,它们的内容分别都是abc,注意:str不是对象,它是对象的地址,它叫做引用 (reference),str指向new...生成的对象。换句话说,在java里面,当我们定义一个类的变量(如:String str;),它永远都是引用,不是对象。那么什么是对象呢?当我们用关键字new时,它生成出来的东西叫做对象。为什么是两个对象呢?首先它生成一个对象 是abc,这个abc对象在什么地方呢?它在一个叫String Pool的字符串池里面,只有String有这样一个String池。String池是一个什么概念呢?我们知道,String类是一个不可变的类,一但 它的内容确定,它就不能去更改了。当你去生成一个字符串对象的时候,它的执行流程是这样的:它首先在你的String Pool里面去找,看有没有一个内容为abc的对象存在,因为tring str = new String(abc)它是main方法的第一个语句,那么在刚开始执行的时候,String Pool里面是没有对象的。它发现String Pool里面没有abc这个对象,那么它首先把new String(abc)的括号里面的abc对象放到String Pool里面,接下来它执行new ...这行语句, 执行String的构造方法。我们知道new它生成一个对象,这个对象在什么地方呢?在java的堆里面。我们知道java的内存分为2部分,一个叫栈 (Stack),一个叫堆(Heap)。那么new String(abc)时,它在堆(Heap)里面,生成一个内容为abc的这样一个对象。这样就造成了在String Pool里面一个叫abc的对象,堆里面也有一个叫abc的对象。我们这里用的是public String(String original)这个构造方法。jdk api是这样叙述的: Initializes a newly created String object so that is represents the same sequence of characters as the argument;in other words,the newly created string is a copy of the argument string.Unless an explicit copy of original is needed,use of this constructor is unnecessary since Strings are immutable.(翻译:初始化一个新创建的String对象,表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副 本。由于 String 是不可变的,不必使用该构造方法,除非需要original的显式副本。) 问题2:当执行完语句(2)时,在内存里面一共有几个对象?它们是什么?在什么地方? 解答:当执行完语句(2)时,内存里面一个新的对象都没有生成。为什么这么说?当我们定义语句(2)的时候,如果我们用字符串的常量值(字面值) 给st
显示全部