String

1.  String 

   1.Java 中String 是一个不可变类,即创建一个String对象后,是不能直接改变字符串中的某个字符的。

   2.为什不可变?因为用于存储String值的仍然是一个char型数组,并且注意到它是final修饰的,不可更改。

   3.设计成不可变的好处:效率(因为对象不可变,所以可以使用常量池的方式优化效率;因为对象不可变,所以String对象可以自身缓存HashCode)、安全(String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患)

   4.String 常量池:

   对于不可变对象使用String 常量池,不然修改变量string1的值,string2的值也发生变化了。常量池的存在无疑大大降低了创建、拷贝等操作的时间复杂度和空间复杂度。

String s1="ab"+“cd”;
String s2="abc"+"d";
System.out.println(s1==s2);

String s3=new String("ab");
String s4=new String("ab");
System.out.println(s3==s4);

   这答案分别是 true  false。,我们由答案可以知道:String类确实是不可变类,"ab"+"cd"被当做了新字符串而不是续接"ab"(不然"ab"和"abc"肯定不会地址一样);常量池确实存在,同是"abcd",所有对"abcd"的引用都指向同一地址;如果使用new 的话就会直接分配新的地址。

2.  String, Stringbuffer, StringBuilder 的区别。

    String 字符串常量(final修饰,不可被继承),线程不安全,String是常量,当创建之后即不能更改。(可以通过StringBuffer和StringBuilder创建String对象(常用的两个字符串操作类)。) 

   StringBuffer 字符串变量(线程安全)其toString方法会进行对象缓存,以减少元素复制开销,支持同步锁。

   StringBuilder 字符串变量(非线程安全)其toString的时候,会直接返回一个新对象。

   

原文地址:https://www.cnblogs.com/jkzr/p/10569361.html