java中的String总结

2023-01-08,

1.普通的字符串在java中存储在字符串常量池中

 String s=new String("hello");

 一共创建了两个对象 ,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"hello"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此我们提倡大家用引号包含文本的方式来创建String对象以提高效率,实际上这也是我们在编程中常采用的。

String k="taobao";

String s="tao"+"bao";

String a="tao";

String b="bao";

k==s //true

(a+b)==s//false

在运行的时候,s="tao"+"bao" 已经自动的将其拼接成了“taobao”,同一个字符串常量在内存中只有一份,与k的字符串指向的是同一个内存地址,因此k==s返回ture。而(a+b)相当于new String(a+b),这里重新new了一个对象,与前面的”taobao“所指向的内存地址不同,因此返回false。

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

创建了一个对象。javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

2.String被定义为final类型,是无法更改的,因此对String的+等操作都是重新生成了一个String对象。

3.String 的equals方法

源码如下:

String类重写了object的equals方法,在String中的value其实是char类型的数组,equals是直接比较内容,相同返回true,不同返回false。

而 Object类的equals方法直接比较是否为同一个引用

4.String的hashCode函数

String类型的hashCode是由其内容来导出的,内容相同的两个字符串散列码也相同。

5.String的构造方法

  

构造方法调用了Arrays.copyof函数,进一步调用系统的System.arraycopy的拷贝,将传入的char数组参数拷贝到String内部的char数组中去。

6.String的compareTo函数

注意比较函数没有先直接比较两个字符串的长度,并不是长度长的字符串要大,而是逐个的字符比较,不相等则返回当前的ASCII码值相差值。当所比较的字符全都相同的时候,才返回字符串长度大小的差。

7 StringBuilder 

  构造函数有四种

StringBuilder() value内容为空,并设置容量为16个字节;
StringBuilder(CharSequece seq)  使用seq初始化,容量在此基础上加16;
StringBuilder(int capacity) 设置特定容量;

StringBuilder(String str)  使用str初始化,容量str大小的基础上加16;

8.

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

单线程情况下StringBuilder要比StringBuffer快,不考虑线程安全

String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的