题1:
于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相
加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其
编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的
代码应该只创建了一个String对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");
最终打印的结果应该为true。
------------------------------------------
题2:
String s = new String("xyz");创建了几个String Object?二者之间有什么区别?
s两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是
缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创
建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
<!--EndFragment-->
-------------------------------------------
题3:
String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。
<!--EndFragment-->
分享到:
相关推荐
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 26 38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的...
1. **创建SQL语句**:在数据库客户端,例如MySQL Workbench、Oracle SQL Developer或者SQL Server Management Studio中,我们可以编写和测试SQL语句,确保其正确性和效率。 2. **转成String**:将验证过的SQL语句...
在提供的文件列表中,虽然没有直接涉及`pass`和`del`的内容,但我们可以假设这些Python源文件(如`stringMethod02.py`、`stringAdvanceOprate.py`等)可能包含各种字符串操作、条件语句、循环以及其他数据结构的实例...
这一语句创建了两个对象:一个是常量池中的 "abc",另一个是堆中的 String 对象。 6. String、StringBuffer、StringBuilder 有什么区别? 答案:String、StringBuffer、StringBuilder 最大的不同是 String 不可变...
"VBA语句集100句.rar"是一个针对初学者和Excel爱好者的资源,它包含了100个常用的VBA语句,旨在帮助用户快速理解和掌握VBA编程的基础。 1. **变量声明**:在VBA中,我们可以使用`Dim`关键字声明变量,例如`Dim ...
例如,我们可以使用 `Method` 对象的 `invoke` 方法来调用颜色对象的 getter 方法,获取颜色对象的红、绿、蓝三个分量的值,然后根据这些值创建字符串形式的颜色。例如: ```java public static String Color2String...
需要注意的是,这种方式创建视图可能会遇到权限问题,因为默认情况下,存储过程中执行的SQL语句需要显式地指定拥有相应对象的模式名,如: ```sql EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW SCHEMA_NAME.V_View1 ...
在上面的代码中,我们首先创建了一个 SQL 语句字符串,其中包含三个占位符 @a、@b 和 @c。然后,我们创建了一个 SqlCommand 对象,并将其关联到 connection 对象上。接着,我们创建了三个 SqlParameter 对象,并将其...
字符串在Java中被视为不可变对象,这意味着一旦创建了一个`String`对象,就不能更改它的值。下面我们将深入探讨`String`类的一些关键知识点,以及如何通过练习来熟练掌握它们。 1. **创建String对象**: - 字面量...
12. **集合**:VBA中的`Collection`对象允许存储和操作一组不特定类型的项目,如`Set coll = New Collection`创建一个新集合。 13. **类模块**:通过`Class Module`,你可以创建自定义对象并封装数据和行为。 14. ...
每次对String进行操作,实际上都会创建一个新的String对象。 3. **字符串比较**:要比较两个字符串的值是否相等,应使用`equals()`方法。如果要检查两个字符串是否指向内存中的同一个对象,应使用`==`运算符。注意...
在本教程"07_ibatis教程_模糊查询实体对象"中,我们将深入学习如何使用iBatis这个流行的Java持久层框架进行模糊查询操作,尤其是在处理实体对象时。iBatis作为一个轻量级的ORM(Object-Relational Mapping)工具,它...
例如,当使用以下语句创建string对象时: ```cpp string str1(data); ``` 这里的`str1`会将`data`数组视作C风格字符串,即遇到第一个空字符('\0')时停止复制,因此`str1`只包含字符'A'和'b'。而使用以下语句创建的...
//在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...
`dictionaryOperate.py`和`dictionaryMethodTest.py`则可能涵盖了字典对象的函数操作,如创建、访问、更新和遍历字典。 在Python中,函数可以有默认参数值,也可以接受可变数量的参数,例如`*args`和`**kwargs`。...
Java面向对象练习题经典 Java面向对象练习题是Java编程语言中非常重要的一... 这个Java程序中定义了一个名为abc的类,该类中有一个main方法,该方法创建了一个名为AB的对象,并将其初始化为"Hello!"和"I love JAVA."。
通过调用`CreateObject("pbobj.DataWindow")`,我们可以创建一个空的DataWindow对象,然后通过其方法和属性进行后续配置。 2. 设置数据源:动态创建的DataWindow需要指定数据源,这可以是SQL SELECT语句、数据库表名...
7. 在 Java 中字符串包括字符串常量和字符串变量,分别由类 String 和类 StringBuffer 来创建对象。 8. Java 源程序文件编译后产生的文件称为.class 文件,其扩展名为 .class。 《面向对象程序设计JAVA语言程序...