Java 字符串

2019-08-18  本文已影响0人  编程喵喵

1 面试题:String str1 = 'A'String str2 = new String("A")区别?

String str1 = 'A'内存会去查找永久代(常量池) ,如果没有的话,在永久代中中开辟一块儿内存空间,把地址付给栈指针,如果已经有了"ABC"的内存,直接把地址赋给栈指针;
(a) ==的判断, (b) equals()的判断:都相等,因为他们的地址都相等,因此只在常量池中有一份内存空间,地址全部相同;

String str = new String("a");是根据"a"这个String对象再次构造一个String对象;在堆中从新new一块儿内存,把指针赋给栈,将新构造出来的String对象的引用赋给str。 因此 只要是new String(),则,栈中的地址都是指向最新的new出来的堆中的地址,
(a)“”==“” 是判断地址的,当然不相同;
(b)至于equals,String类型重写了 equals()方法,判断值是否相等,明显相等,因此 equals 是相等的;

String a = "abc";
String b = "abc";
//a==b 的结果是true
//String常量存放在常量池中,Java虚拟出于优化的考虑,会让内容一致的对象共享内存块。

String b1 = new String("abc")
//b==b1 false 常量池和堆空间 不可能一致
String b2 = new String("abc")    
//b1==b2 false 内存地址不相同

2 面试题:String 的“不可变性”

46c03ae5abf6111879423f38375207cc_hd.jpg

一旦一个 String 对象在内存(堆)中被创建出来,它就无法被修改(因为 String 类的所有成员变量都是 private,并且没有提供 public 的 set 方法来修改这些值。此外成员变量都是 final 的,这就意味着一旦初始化就无法修改)。特别要注意的是,String 类的所有方法都没有改变字符串本身的值,都是返回了一个新的对象

3 String使用注意事项

通过System.out.prinln()输出是会默认调用toString方法,如果自定义类,可以重写。

4 面试题:String, StringBuilder, StringBuffer 区别

5 String的 + 操作符

编译器创建了一个 StringBuilder 对象,用于构建最终的 String,并对每个字符串调用了一次 append() 方法,最后调用toString() 生成结果,并存为 s

当你为一个类编写 toString() 方法时,如果字符串操作比较简单,那就可以信赖编译器,它会为你合理地构造最终的字符串结果。但是,如果你要在toString()方法中使用循环,且可能有性能问题,那么最好自己创建一个 StringBuilder 对象

6 String的空判断

7 StringBuffer方法

StringBuffer和StringBuilder在使用上几乎一样

8 String方法

上一篇 下一篇

猜你喜欢

热点阅读