String类

简介:

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

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

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

 

例如:

6803a4ce5e52e495a841134389328a77.png


运行结果:


854680620f401ddbd465da379a510811.png



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

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

 

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

bececcee23c549a1cc9ee97060cadec8.png


代码示例:

fdd44ac2323e1ad58462abd2c7dd2c50.png


运行结果

0051f798938658021f634f6d6f0aa66b.png



charAt方法:

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

eafd944c35145a8ca108bd922511f4b5.png


indexOf方法:

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

6ad29ae493c7524b8e7267b2dd05cb69.png


lastIndexOf方法:

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

f8ecf79805865e2c6456ff3aa660acca.png


length方法:

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

ad21e8d68d3295a26b175df0a53ed7b4.png


其余方法如下图:

e213dfa83a3870d21198e4d04dee7962.png

b5a866f0fde14c3c461f9d60784f192c.png



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

  做个小实验就知道了:

982bfa254c1034eb1c3b7f69caeb1177.png


运行结果:

048c35f9c17aff300a186ea3f8160ebd.png

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


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

做个小实验就知道了:

461936b591f356b75789d615b196fc4e.png


运行结果:

5c42874c74a3dd24adf1057873ac9c1e.png

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


StringBuilder

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

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

StringBuilder类的部分代码:

3c0e03f730fad4b8c29b02ddcfbabf21.png


StringBuffer类的部分代码:

ca61d93abd5a266a4050cab6cf7152c2.png




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

相关文章
|
22天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
1月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
16 0
|
1月前
|
C#
51.c#:string类的静态方法
51.c#:string类的静态方法
20 1
存储 编译器 Linux
18 0
|
2天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
12天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
47 1
|
12天前
|
C语言 C++
【C++初阶】9. string类的模拟实现
【C++初阶】9. string类的模拟实现
36 1
|
26天前
|
存储 编译器 C++
string类的模拟实现
string类的模拟实现
29 0
|
26天前
|
编译器 Linux C++
string类的函数讲解
string类的函数讲解
15 1
|
26天前
|
存储 缓存 编译器
C++:String类的使用
C++:String类的使用