。而用关键字 new 调用构 造器,总是会创建一个新的对象,无论内容是否相同。 至于为什么要把 String 类设计成不可变类, 是它的用途决定的。 其实不只 String, 很多 Java 标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候 也需要
设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可 变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任 何
问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会 造成性能上的问题。 所以
Java 标准类库还提供了一个可变版本, StringBuffer。 即 (2)String s = new String("xyz");创建了几个 String Object? 二者之间有什么区 别? 两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz” 不管出现多少遍,都是缓冲区中的那一个。New String 每写一遍,就创建一个新 的对象,它一句那个常量”xyz”对象的内容来创建出一个新 String 对象。如果以 前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。 下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 答:对于如下代码: 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。 (3)String 和 StringBuffer 的区别 JAVA 平台提供了两个类:String 和 StringBuffer,它们可以储存和操作字符串, 即 包 含 多 个 字 符 的 字 符 数 据 。 String 类 表 示 内 容 不 可 改 变 的 字 符 串 。 而 StringBuffer 类表示内容可以被修改的字符串。当你知道字符数据要改变的时候 你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 来动态构造字符 数据。 另外, String 实现了 equals 方法, new String(“abc”).equals(new String(“abc”) 的 结 果 为 true, 而 StringBuffer 没 有 实 现 equals 方 法 , 所 以 , new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为 false。 接着要举一个具体的例子来说明,我们要把 1 到 100 的所有数字拼起来,组成一 个串。 StringBuffer sbf = new StringBuffer(); for(int i=0;i<100;i++) { sbf.append(i); } 上面的代码效率很高,因为只创建了一个 StringBuffer 对象,而下面的代码效率 很低,因为创建了 101 个对象。 String str = new String(); for(int i=0;i<100;i++) { str = str + i; } String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法 和 hashCode 方法,所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问 题。
Runtime 类
在 java 中 Runtime 表示运行时操作类, 是一个封装了 JVM 进程的类, 每一个 JVM 对应着 Runtime 类的实例,此实例由 JVM 运行时为其实例化,通过此类我们可 通过此类我们可 以获取一些系统信息( 中该类的方法) 。在 以获取一些
系统信息(见 JDK 中该类的方法) 。 JDK 文档中不会发现任何有 关这个类中构造方法的定义,这是因为 Runtime 类本身的构造方法是私有化的 (单例设计) ,如果想取得一个 Runtime 实例,则只能通过下面的方式: Runtime run= Runtime.getRuntime() 此类的常用用法: (1)可以取得 JVM 中的内存空间,包括最大内存空间、