java中的String总结

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 快的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值