String相关

下面的代码创建了几个String Object?二者之间有什么区别?

  1. String s = new String("xyz");

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。 new String 每写一遍,就创建一个新的对象,它用常量”xyz”对象的内容来创建出一个新String对象。 如果以前就用过”xyz”,就不会再创建了,会直接从缓冲区拿。

下面这条语句一共创建了多少个对象?

String s = "a" + "b" + "c" + "d";

一个对象。 java编译器会对它进行优化,上面的代码相当与String s = "abcd";

String name = "name";
String s = "your " + " full " + name + " is" + " good!";

上述代码创建了4个对象,因为第二行代码会优化为String s = "your full " + name + " is" + " good!";

这下面两行代码执行后,原始的String对象中的内容到底变了没有?

String s = "Hello";
s = s + "World!";

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。 在这段代码中,s原先指向一个String对象,内容是”Hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢? 答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为”Hello world!”,原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以char型变量可以存储汉字。 补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。这个不同于c/c++,只占用一个字节。

为什么Java中的密码优先使用 char[] 而不是String?

String是不可变的。这意味着一旦创建了字符串,如果另一个进程可以进行内存转储,在GC发生前,(除了反射)没有方法可以清除字符串数据。 使用数组操作完之后,可以显式地清除数据:可以给数组赋任何值,密码也不会存在系统中,甚至垃圾回收之前也是如此。