天天看点

String类

String字符串是由一个char数组构成的,由于这个数组是由final修饰的,所以String也叫做不可变字符串。

例如字符串:String  s = ”1234”; 其实就是char[] value={‘1’,’2’,’3’,’4’};

String s=”123”; 和String s1=new String(“123”);,虽然申请的两个字符串内容一样,但是它们的内存地址是不一样的,前者引用的是字符串池里的字符串,后者是新建一个内存地址来存储。所以比较的时候需要使用equals();方法来比较才能的出正确的结果。

例如:

<a href="https://s2.51cto.com/oss/201710/26/6803a4ce5e52e495a841134389328a77.png" target="_blank"></a>

运行结果:

<a href="https://s1.51cto.com/oss/201710/26/854680620f401ddbd465da379a510811.png" target="_blank"></a>

什么是字符串优化池?字符串池就是里面养了一堆的字符串,所有这种方式申请的方式:String s=”123”; 都是指向的字符串池里的字符串。

为什么会有个字符串优化池呢?因为如果有一百个字符串内容是重复的,那么假如没有字符串池的话就会在内存中申请一百个内存地址来存储。这样的话就太耗费内存资源了,如果是一万个十万个字符串的话直接把内存给耗没了。所以用字符串池解决了这个问题,String s=”123”;这种方式申请的字符串,所有重复的都是指向字符串池里的同一个字符串,这样即便有一万个重复的字符串也只需要一个内存地址就可以储存了。

  String类有许多的构造器,这些构造器可以把byte数组、char数组等等转换成字符串:

<a href="https://s4.51cto.com/oss/201710/26/bececcee23c549a1cc9ee97060cadec8.png" target="_blank"></a>

代码示例:

<a href="https://s2.51cto.com/oss/201710/26/fdd44ac2323e1ad58462abd2c7dd2c50.png" target="_blank"></a>

运行结果

<a href="https://s5.51cto.com/oss/201710/26/0051f798938658021f634f6d6f0aa66b.png" target="_blank"></a>

charAt方法:

按字符串下标拿出那个下标的字符方法。例如:

<a href="https://s2.51cto.com/oss/201710/26/eafd944c35145a8ca108bd922511f4b5.png" target="_blank"></a>

indexOf方法:

按字符串内容查找,查找到了就返回这个字符串内容第一个字符的下标,没找到就返回-1

<a href="https://s4.51cto.com/oss/201710/26/6ad29ae493c7524b8e7267b2dd05cb69.png" target="_blank"></a>

lastIndexOf方法:

按字符查找,找到就返回那个字符的下标

<a href="https://s1.51cto.com/oss/201710/26/f8ecf79805865e2c6456ff3aa660acca.png" target="_blank"></a>

length方法:

    此方法用于获得字符串的长度

<a href="https://s1.51cto.com/oss/201710/26/ad21e8d68d3295a26b175df0a53ed7b4.png" target="_blank"></a>

其余方法如下图:

<a href="https://s1.51cto.com/oss/201710/26/e213dfa83a3870d21198e4d04dee7962.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/26/b5a866f0fde14c3c461f9d60784f192c.png" target="_blank"></a>

  由于String字符串是不可变字符串,在进行字符串追加或更改的时候,效率就会十分的慢。

  做个小实验就知道了:

<a href="https://s4.51cto.com/oss/201710/26/982bfa254c1034eb1c3b7f69caeb1177.png" target="_blank"></a>

<a href="https://s4.51cto.com/oss/201710/26/048c35f9c17aff300a186ea3f8160ebd.png" target="_blank"></a>

添加100000个字符就需要耗去15.473秒的时间,可见效率之低。

既然有不可变字符串,那么就有可变的字符串,那就是StringBuffer类,由于StringBuffer是可变字符串,所以适合追加,修改之类的操作,速度比起String是相当的快。

做个小实验就知道了:

<a href="https://s1.51cto.com/oss/201710/26/461936b591f356b75789d615b196fc4e.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/26/5c42874c74a3dd24adf1057873ac9c1e.png" target="_blank"></a>

  同样的添加次数,StringBuffer只需要10毫秒就完成了,而String却需要15.473秒也就是15473毫秒才能完成,所以StringBuffer创造出来就是用来解决这一问题的。

StringBuilder:

  StringBuilder是和StringBuffer基本上一样的,两者都是继承与AbstractStringBuilder,它们最大的区别在于前者的方法是没有synchronized同步锁的,而后者则有。所以在于数据的安全性上StringBuffer要安全些,里面的数据不容易混乱。

  从以下两个类的部分代码对比就可以到StringBuffer的方法都带有synchronized关键字:

StringBuilder类的部分代码:

<a href="https://s2.51cto.com/oss/201710/26/3c0e03f730fad4b8c29b02ddcfbabf21.png" target="_blank"></a>

StringBuffer类的部分代码:

<a href="https://s2.51cto.com/oss/201710/26/ca61d93abd5a266a4050cab6cf7152c2.png" target="_blank"></a>

本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976507,如需转载请自行联系原作者