String

306 阅读2分钟

实现接口。

  

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
  • java.io.Serializable     

这个序列化接口没有任何方法和域,仅用于标识序列化的语意。

  • Comparable]

这个接口只有一个compareTo(T 0)接口,用于对两个实例化对象比较大小。

  • CharSequence

这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)这几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。

主要成员

   /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

String是一个不可变的类 value存储字符串,所以string字符串声明后值属性是不可变的; hash作用:因为String经常被用于比较,保存一个hashcode的缓存可达到复用的效果,避免重新计算哈希码。这个hash值是根据value换算出来的

equals()和==区别

equals()

比较两个字符串的unicode序列是否相等

相等返回0,小于返回负值,大于返回正值

==

比较两个字符串地址是否相同

字符串拼接

String ss="sss"+"yyy"+"xxx";

StringBuilder str = new StringBuilder("sss");
str.append("yyy");
String =str.toString();

StringBuilder str = new StringBuilder(x);
str.append("xxx");
String ss=str.toString();

String类被设计成不可变的原因

####线程安全

可以被多个线程共享

效率优化

字符串不变型保证Hash码的唯一性

比如在HashMap中的使用,不必重新计算新的哈希码

安全性

String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等,如果string可修改会引起各种隐患

字符串常量池的需要

如果字符串值已经存在常量池,那么就不会创建新的对象,而是引用已经存在的对象

确保一个字符串常量只有一个拷贝。

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

new String

不是常量,不会放常量池,有自己的地址空间

blog.csdn.net/yulungggg/a… www.cnblogs.com/listenfwind…